Back-End 42

filter 코드 리팩토링 해보기

최근 토비의 스프링 3.1 책을 배우기 시작했다. 김영한 선생님의 강의를 이미 다 들었지만, 뭔가 더 깊게 배우고싶다는 생각이 들었다.  1장 챕터의 내용은 오브젝트와 의존관계로 내가 이해한 바로는 책임, 관심사 분리이다.  해당 부분을 공부하면서 임시로 미리 만든 프로젝트의 필터를 보니 정말 책에서 표현한 대로 난감했다.필터의 역할은 토큰 검증인데 비지니스 로직과, 시큐리티컨텍스트 홀더 저장 로직, 헤더와 토큰 저장 로직등이 들어있었다.이 기회에 배운 내용을 적용해보려한다. 기존 코드@Slf4j@RequiredArgsConstructorpublic class JwtAuthenticationFilter extends OncePerRequestFilter { private final JwtUtils ..

Back-End/Spring 2025.04.07

JWT(Json Web Token)

1. 정의JWT(JSON Web Token) : JSON 기반의 토큰 인증 방식 보안이 필요한 시스템에서 사용자 인증 및 정보를 안전하게 교환하거나세션을 사용하지 않는 무상태(stateless) 인증 시스템 에서 주로 사용 - 별도의 세션 저장소 강제 X   2. 구조JWT는 . 으로 구분된 세가지 부분으로 구성된다. Header.Payload.Verify_Signature(서명) Header 서명 알고리즘 (HMAC SHA256, RSA 등을 사용)토큰의 타입Payload Claim에 대한 property를 key-value 형태로 저장Claim은 일반적으로 사용자 정보 및 토큰에 대한 정보를 포함SignatureHeader와 Payload를 조합한 후 비밀키를 이용해 해싱한 값 해당 서명으로 토큰 위..

Back-End/Spring 2025.03.15

JDBCTemplate

✔️ JdbcTemplateSQL 직접 사용시 JDBCTemplate는 매우 좋다.spring-jdbc 라이브러리에 포함, 별도의 복잡한 설정 없이 바로 사용 가능 반복 문제 해결 템플릿 콜백 패턴 사용개발자는 sql 작성, 전달 파라미터 정의, 응답 값 매핑만 하면 된다. 반복 문제?커넥션 획득statement 를 준비하고 실행결과를 반복하도록 루프 실행커넥션 종료, statement, resultset 종료트랜잭션 다루기 위한 커넥션 동기화예외 발생시 스프링 예외 변환기 실행  단점 : 동적 SQL 해결 어려움  종류JdbcTemplate :  기본이며 순서대로 바인딩  (where name = ?) NamedParameterJdbcTemplate : 이름 지정 바인 (where name = :use..

Back-End/Spring 2025.03.13

스프링 부트 - 외부 설정과 프로필2

✔️ 스프링이 지원하는 외부 설정스프링이 지원하는 다양한 외부 설정 조회 방법Environment@Value - 값 주입@ConfigurationProperties - 타입 안전한 설정 속성 @Slf4jpublic class MyDataSource { private String url; private String username; private String password; private int maxConnection; private Duration timeout; private List options; // 생성자 // @PostConstruct 로 멤버변수 log 출력 }  # application.propertiesmy.datasource.u..

스프링 부트 - 외부 설정과 프로필

✔️ 외부 설정하나의 애플리케이션을 여러 다른 환경에 적용개발 환경 : 개발 서버, 개발 DB 사용운영 환경 : 운영 서버, 운영 DB 사용 개발, 운영에 따라 환경 설정을 다르게 하여 빌드하는 것은 비효율적이다.  따라서 우선 빌드를 하고 배포 후 실행 시점에 외부 설정을 주입하는 것이다. 유지보수하기 좋은 애플리케이션 개발의 가장 기본적인 원칙변하는 것과 변하지 않은 것을 분리  외부 설정 사용 방법4가지 방법이 있다.OS 환경 변수 자바 시스템 속성 자바 커맨드 라인 인수외부 파일(설정 데이터) 1. OS 환경 변수System.getenv();전체  OS 환경 변수를 MAP으로 조회 가능 단, 다른 프로그램에서도 사용 가능 2. 자바 시스템 속성java -Durl=devdb -Dusername=de..

스프링 부트 - 자동 구성

✔️ 자동구성 요약datasource, jdbcTemplate등 이런 라이브러리에 있는 것들이 스프링 빈으로 자동 등록된다 . 그 이유는 스프링 부트의 자동 구성(Auto Configuration)이라는 기능을 제공하기 때문이다.먼저 자동 구성 없이라이브러리를 등록하고 사용해보자. 순수 라이브러리 사용순수 라이브러리를 사용하려면 jar파일을 project/libs 폴더에 넣는다build.gradle 에서 implementation files('libs/xx.jar') 로 추가한다.그리고 설정 클래스를 만들어서 직접 @Bean으로 수동 등록해줘야한다.   만약 많은 라이브러리를 손수 등록하려하면 정말 많은 시간을 사용해야할 것이다.스프링 부트의 자동 구성 기능을 쓰면 알아서 등록해준다. 한번 알아보자  자..

스프링 부트 - 부트와 내장 톰캣

✔️ WAR 배포 방식의 단점 웹 애플리케이션을 개발하고 배포하려면 다음과 같은 과정을 거친다.톰캣 같은 WAS 서버를 별도로 설치애플리케이션 코드를 WAR로 빌드빌드한 WAR 파일을 WAS에 배포이러한 방식에는 단점이 존재톰캣 같은 WAS를 별도 설치개발 환경 설정이 복잡단순 자바면 main() 메서드만 실행웹 애플리케이션은 WAS 실행하고 WAR와 연동하기 위한 복잡한 설정이 들어감배포 과정이 복잡 (WAR 빌드 후 WAS에 배포)톰캣 버전 변경시 재설치단순히 자바의 main() 메서드만 실행하면 웹 서버까지 같이 실행되도록하는 방법은 없을까?톰캣 같은 웹서버를 라이브러리로 내장해버리는 것이다.  (내장 톰캣 기능)  ✔️ 내장 톰캣build.gradle plugins { id 'java'}gr..

스프링 부트 - 웹 서버와 서블릿 컨테이너

✔️ 스프링 부트스프링 부트는 개발자가 스프링 초기 설정,라이브러리관리 등 복잡한 과정을 자동으로 처리해주어 쉽고 빠르게 스프링을 시작하게 해주는 것이다.  (내가 이해한 스프링 부트의 의미) 핵심 기능WAS (Web Application Server) : Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨  라이브러리 관리 : 손쉬운 빌드 구성을 위한 스타터 종속성 제공, 버전을 자동 관리 (외부 포함)자동 구성(Auto Configuration) : 프로젝트 시작에 필요한 스프링과 외부 라이브러리의 빈을 자동 등록외부 설정 : 환경에 따라 달라져야 하는 외부 설정 공통화프로덕션 준비 : 모니터링을 위한 메트릭, 상태 확인 기능 제공 참고스프링 프레임워크 ≠ 스프링 부트스프링 부..

스프링 고급편 - 실무 주의사항 (내부호출, 기술과 한계)

✔️ 프록시와 내부 호출프록시를 거치지 않고 target을 직접 호출하면 AOP가 적용되지 않고, 어드바이스도 호출되지 않는다. 예를 들어 이런 내부 호출이 있는 서비스에 AOP를 적용한다 하자.애스팩트는 해당 클래스의 모든 메서드에 대해서 log를 찍는 간단한 어드바이스를 가진다고 하자.public class CallService { public void A() { B(); // this.B(); } public void B() { }}CallService에 대한 프록시가 생성되고, target은 CallService가 될 것이다.참고B(); : 사실 this가 생략된 것이다. 프록시로 A() 호출 -> log 출력 -> B()호출 -> End 문제는 B()를 ..

스프링 고급편 - 실전예제

✔️ 예제 만들기유요한 스프링 AOP 만들기@Trace : 애노테이션으로 로그 출력@Retry : 애노테이션으로 예외 발생시 재시도 ExamRepository@Repositorypublic class ExamRepository { private static int seq = 0; /** * 5번에 1번 실패하는 요청 */ public String save(String itemId) { seq++; if (seq % 5 == 0) { throw new IllegalStateException("예외 발생"); } return "ok"; }} ExamService@Service@RequiredArgsC..