Interceptor와 ServletFilter 설정
- 스프링은 프런트 컨트롤러 패턴으로 구현된 DispatcherServlet이 클라이언트의 모든 요청과 응답을 처리한다.
- 여기에 공통적인 기능을 수행하는 로직을 추가 해야하는 경우가 있는데, 이를 위해 스프링 웹 MVC 프레임워크에서는 HandlerInterceptor 인터페이스를 제공하며 이를 인터셉터라고 한다..
- 마찬가지로 서블릿 스펙에서도 공통적인 기능을 추가 할 수 있는데, 이를 서블릿필터라고 한다.
- 그림에서 Filter는 서블릿필터, Interceptor는 HandlerInterceptor를 뜻한다.
1. HandlerInterceptor 인터페이스
- 인터셉터는 핸들러 메서드의 메서드 시그니처나 파라미터 같은 정보를 중간에 가로챌 수 있다.
- 인터셉터는 스프링 스펙에서 제공하는 기능이다.
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
- preHandle() 메서드는 Dispatcher 서블릿이 컨트롤러의 핸들러 메서드를 실행하기전 먼저 실행되며, 사용자의 요청/응답 메시지의 데이터를 참조하거나 변경 할 수 있다.
- postHandle() 메서드는 컨트롤러의 핸들러 메서드가 비스니스 로직 실행이 완료된 후 실행되며, preHandle과 다르게 ModelAndView 인자를 받아 그것에 포함된 데이터를 참조할 수 있다.
- afterCompletion()은 뷰가 실행 완료된 후 최종적으로 DispatcherServlet이 사용자에게 응답하기 전 실행되며, postHandle과 다르게 Exception 인자를 받아 예외 정보를 참조하거나 처리할 수 있다.
2. Filter 인터페이스
- 서블릿 필터는 DispatcherServlet 앞에서 사용자의 요청과 응답을 처리할 수 있으며, 표준 스펙에서 제공하는 기능이다.
public interface Filter {
public default void init(FilterConfig filterConfig) throws ServletExcetpion {}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
public default void destroy() {}
}
- 웹 어플리케이션이 시작되면 init 메서드를 통하여 서플릿 필터를 초기화한다.
- 각 필터는 설정된 실행 순서에 따라 doFilter 메서드를 실행하게 되는데, 여기서 사용자의 요청/응답에 대한 데이터를 참조/가공 할 수 있고, FilterChain 객체에서 제공하는 doFilter 메서드를 호출하면 다음 필터 로직으로 계속해서 이동할 수 있다.
Application.properties 설정
- 스프링 부트에서는 애플리케이션 코드와 데이터를 분리 할 수 있다.
- .properties나 .yml 포맷의 파일에 키/값 형태로 저장 및 관리하여 이용한다. 나는 yml 형식을 사용하기에 yml로 적을 예정이다.
- 스프링부트를 시작하면 자동으로 application.yml 파일을 찾아 로딩하며, 패키징하면 이 파일은 JAR 파일에 포함되게 된다.
- 데이터와 코드를 분리하기 위해서였지만, JAR로 패키징 시 결국 하나의 파일로 합쳐지게 된다. 이를 해결하기위해 두가지 방법을 시행하는데,
첫째, 실행 환경마다 별도의 application.yml을 만들고 설정으로 실행환경에 적합한 파일을 로딩하는 방법이다.
두번째는, JAR 파일 외부에 application.yml 파일을 만들어 JAR를 실행하는과정에 파라미터로 전달하는 방법이다.
springtour:
domain:
name: https://springtour.io
kafka:
bootstrap-servers:
- 10.1.1.100
- 10.1.1.101
- 10.1.1.102
topic:
checkout: springtour-hotel-event-checkout
reservation: springtour-hotel-event-reservation
ack-level: 1
1. @Value 애너테이션
- @Value 애너테이션을 통해 application.yml에 정의된 데이터를 코드에 주입할 수 있다.
- @Value 애너테이션을 정의하여 데이터를 주입할 수 있는 대상은 클래스 필드, 메서드, 파라미터이다.
//springtour.domain.name 키를 정의, 만약 없다면 springtour.io를 사용
@Value("${springtour.domain.name:springtour.io}")
private String springtourDomain;
2. @ConfigurationProperties와 @ConfigurationPropertiesScan
- 프로퍼티에 설정된 값을 편리하게 주입하기 위해 ConfigurationProperties와 ConfigurationPropertiesScan을 제공한다.
- 객체에 @ConfigurationProperties를 통해 대입하면 yml파일에서 프로퍼티 키으름을 유추하여 자동으로 주입하여준다.
@Data
@ConfigurationProperties(prefix = "springtour.kafka")
public class KafkaProperties {
private List<String> bootstrapServers;
private Integer ackLevel;
private Topic topic;
@Data
public static class Topic {
private String checkout;
private String reservation;
}
}
Profile 설정
- 스프링 부트에서는 위에서 설정한 환경변수 값을 따로 설정하여 로딩할 수 있다. 이러한 기능을 스프링 프로파일이라 한다.
// dev 프로파일 설정
java -jar ./application.jar -Dspring.profile.active=dev
// production 프로파일 설정
java -jar ./application.jar -Dspring.profile.active=production
// production과 email 프로파일 설정
java -jar ./application.jar -Dspring.profile.active=production, email
'공부 > Spring Boot' 카테고리의 다른 글
[Database] 01. JDBC (0) | 2024.11.13 |
---|---|
[Spring Batch] 01. Spring Batch 기본 개념 (0) | 2024.11.13 |
[스프링 부트 공부 일지] 4. 웹 어플리케이션 서버 구축하기 (1) (0) | 2022.12.21 |
[스프링 부트 공부 일지] 3. 스프링에서 REST API 개발하기 (3) (0) | 2022.12.17 |
[스프링 부트 공부 일지] 3. 스프링에서 REST API 개발하기 (2) (0) | 2022.12.16 |