본문 바로가기

Develop/[Spring]

(96)
[Spring] SessionLocaleResovler 다국어 처리에 대한 값을 지정할 수있다. 예를 들면, Session에 로케일 정보를 넣을수 있는데 이런식으로 사용할 수 있다. 스프링 5부터는 LocaleResolver이라는 인터페이스를 사용할 수 있다. 구현체로는 SessionLocaleResolver 가 있는데 이는 httpsession에 locale정보를 저장한다. 컨트롤러에서 직접 세션에 로케일 정보를 넣어줄 수도있지만 인터셉터로 이를 구현할 수 도있다. 단, 인터셉터로 이를 구현할때는, 파라미터로 언어값을 넘겨줘야한다. 이런식으로 인터셉터에 대한 빈 선언과, 인터셉터에 추가를 해준다. 메시지 파일은 이렇게 basenames라는 이름으로, message.messageSource로 하게되면, 기본 이름이 된다. 이는 다국어에 필요한 파일이 50개라..
[Spring] HandlerInterceptor prehandle, posthandle, afterCompletion Filter의 경우, DispatcherServlet이 실행되기 전에 수행되므로, Spring Context에 접근하기 어렵다. 하지만 인터셉터의 경우는, Dispatcher수행 이후에 실행이된다 따라서, Spring Context에 용이하게 접근할 수 있다. Spring 에서 작성위치는 servlet-context에 작성한다. Spring boot에서는 WebMvcConfigurerAdapter를 상속, 어떤 컨트롤러를 어떤 url에 매핑할지 정의 인터셉터는 handlerInterceptorAdapter를 상속 받아서 구현 (deprecated) -> HandlerInterceptor를 impl해서 사용 url 기반으로 제어한다. (..
[Springboot] logging 전략 관련 주저리... log4j -> logback 성능이 더 좋고, 메모리도 적게 사용한다. Spring profile을 사용할 수 있다. springboot starter-web에 포함 log4j -> logback -> log4j2 로 진화했다. @SLF4J는 프레임워크 대부분에서 어떤 방식으로든 구현되는 표준화된 API를 제공한다. 이 API를 통해 코드 안바꾸고, 로깅 프레임워크를 변경할 수 있다. sysout은? PrintStream 클래스의 println()의 내부구조에 동기화처리, 쓰레드당 한개만 쓸수 있다. 그래서 쓰레드하나가 쓰고있으면, 다른 쓰레드에서 Block이 걸리게된다. -정리- log4j와 같은 다양한 로깅 프레임워크에 대한 추상화 역할을 하는 라이브러리이다. 컴파일 시 하나의 로깅 프레임워크와 바..
[Spring] HandlerInterceptor HandlerInterceptor는, 특정한 URI 호출을 가로채는 역할을 한다. 이를 이용하여, 기존 컨트롤러의 로직을 수정하지 않고도, 사전이나 사후 제어가 가능하다. preHandle 지정된 컨트롤러의 동작 이전에 수행할 동작 posthandle 지정된 컨트롤러의 동작 이후에 처리할 동작 Spring MVC의 dispatcher Servlet이 화면을 처리하기 전에 동작 afterCompletion DispatcherServlet이 화면을 처리한 후에 동작 Filter 와 Interceptor의 차이는 Dispathcher Servlet이 실행된 이전이냐, 후이다의 차이다. 추가로 Filter는 웹 애플리케이션 내 동작하기 때문에 Spring context에 접근하기 어렵다. 반면 인터셉터는 스프링..
[Spring] ControllerAdvice @Exceptionhandler같은 경우는 @Controller, RestController가 적용된 Bean 내에서 발생하는 예외를 잡아서 하나의 메서드에서 처리해주는 기능을 한다. 해당 컨트롤러에서 Exception이 발생하면 아래 핸들러에서 호출되어 처리가 된다. @ExceptionHandler가 하나의 컨트롤러를 위한 것이면, ControllerAdvice는 전역 모든 클래스에 대한, 모든 컨트롤러를 위한 예외를 잡아주는 역할을 한다. (특정 경로를 설정할 수도 있긴하다.) 주로 예외 처리를 위해 이렇게 사용되기는 하지만, initBinder와 함께 바인딩/ 검증 설정, ModelAttribute와 함께 사용하여, 전반에 걸친 모델 정보 설정을 해주는 등의 목적으로 사용할 수도있다. 1. Targ..
@SessionAttribute에 대해서 이전에 공부한 ModelAttribute는, 전달 받은 값도탐색을 하지만, 세션에 있는 값도 탐색을 한다. 해당 과 같이 작성을 하면 Model 객체에 저장시 세션에 저장될 key을 저장한다. 즉 model에 test라는 값을 넣으면 자동으로 세션에 넣어준다. 해당 과 같이 사용하면, modelAttribute로 세션에 있는 값도 탐색을 한다. 처음 호출할때 오류가 발생할 수있지만 별도 ModelAttribute메서드를 선언하게 되면, 해당 메서드 별 인터셉트 같이 베이스로 돌기때문에 값을 넣어줄수있다. 만약에 모든 세션이 종료되면, SessionStatus 객체의 setComplete를 활용하여 지울 수 있다. @SessionAttributes는 해당 컨트롤러 내에서만 동작한다. 해당 컨트롤러 안에서 ..
[Spring] static 과 스프링 빈의 차이 정확히는 Spring 의 싱글톤 과 자바 static을 이용한 싱글톤 패턴의 차이라고 볼 수 있다. 여러 객체들이 하나의 인스턴스를 공유 한다는 개념은 같다. 하지만 해당 인스턴스의 생명주기에서는 큰 차이를 보인다. 1. 공유 기준 java static 의 공유 범위는 클래스 로더 기준 스프링 싱글톤의 공유 범위는 어플리케이션 컨텍스트 기준 클래스 로더기준이라고 하면, 톰캣 기준, webapp부분을 계층 적으로 관리한다. 만약에 webapp1, webapp2가 있다면, war파일 기준으로 다른 파일에 있는 클래스들끼리는 참조할 수 없다. 만약, 싱글 톤 기반으로 어플리케이션 컨텍스트 기준으로 공유하게 된다면 하나의 war파일 안에는 web.xml에 등록된 여러개의 servlet이 있을수있다. Spring..
[Spring] ModelAttribute 커맨드 객체에 대한 기능에 대해서 알아야 한다. 서블릿의 생명주기 서블릿 컨테이너가 서블릿 인스턴스의 init()메서드를 호출하여, 초기화한다. 서블릿이 초기화된 다음부터 클라이언트가 요청을 처리할 수 있다. 각 요청은 별도 스레드로 처리하고, 이때 서블릿의 service메서드를 호출한다. 이안에서 HTTP 요청을 받고, 클라이언트로 보낼 HTTP응답을 만든다. get,post에 따라서 doGet이나 doPost등으로 위임하여 처리한다. 서블릿 컨테이너 판단에 따라 서블릿을 메모리에서 내려야할 시점에 destroy를 호출한다. 서블릿은 개발자가 Http요청 메시지를 편리하게 사용할 수 있도록 HTTP 요청 메시지를 파싱한다. 결과를 HttpServletRequest객체에 담아서 제공한다. HttpServ..