Spring
-
[Spring] 필터와 인터셉터Spring 2023. 8. 29. 01:36
필터 : Servlet 흐름 : HTTP 요청 > WAS > 필터 > 디스패처 서블릿 > 컨트롤러 인터셉터 : SpringMVC 흐름 : HTTP 요청 > WAS > 필터 > 디스패처 서블릿 > 스프링 인터셉터 > 컨트롤러 참고 : 필터와 인터셉터는 두가지 모두다 체인이 가능하다. 체인이란? 여러개를 사용할 수 있다는 것이다. 예시1) HTTP 요청 > WAS > 필터1 > 필터2 > 필터3 > 디스패처 서블릿 > 컨트롤러 예시2) HTTP 요청 > WAS > 필터 > 디스패처 서블릿 > 인터셉터1 > 인터셉터2 > 인터셉터3 > 컨트롤러 인터셉터 간단히 알아보기 참고 : 인터셉터는 싱글톤으로 관리되기 때문에 지역변수의 사용을 유의해야한다. preHandle 핸들러 어댑터를 호출하기 전에 실행된다. 반환..
-
[Spring 검증] @ModelAttribute와 @RequestBody의 차이Spring 2023. 8. 28. 02:02
@ModelAttribute 필드 단위로 적용되며 특정 타입이 맞지 않는 오류가 발생해도 나머지 필드는 정상적으로 처리된다. @RequestBody HttpMessageConverter는 객체 단위로 적용되기 때문에 하나라도 잘못된 타입이 들어오면 예외가 발생한다. 정리 @ModelAttribute는 필드 단위로 바인딩이 적용되며 특정 필드가 바인딩 되지 않다고 나머지 필드는 정상적으로 바인딩 되고 @Validated를 통해 Validator를 사용한 검증이 적용된다. @RequestBody는 HttpMessageConverter 단계에서 JSON 데이터를 객체로 변경하지 못하면 예외가 발생하기 때문에 Controller가 호출되지 못하고 이로 인해 @Validated를 통한 Validator를 사용한 ..
-
Spring HandlerMapping & Adapter, ViewResolverSpring 2023. 8. 23. 13:43
Spring 구조 1. 클라이언트 요청 2. DispatcherServlet (Front Controller 패턴) 3. DispatcherServlet이 Handler Mapping (핸들러 조회) 4. 해당 Handler를 처리할 수 있는 Handler Adapter 조회 5. 있다면 DispatcherServlet에서 HandlerAdapter 생성 6. Handler Adapter에서 Handler(Controller) 호출 7. Handler(Controller) 수행 후 HandlerAdapter에게 반환 8. Handler Adapter는 ModelAndView를 DispatcherServlet에게 반환 9. DispatcherServlet은 ViewResolver 호출하여 View를 반환 ..
-
Web Server, WAS, Servlet 정리Spring 2023. 8. 22. 03:20
웹서버 (Web Server) HTTP 기반으로 동작 "정적 리소스 제공", 기타 부가기능 정적(파일) HTML, CSS, JavaScript, 이미지, 영상 예) NGINX, APACHE 웹 애플리케이션 서버 (WAS - Web Application Server) HTTP 기반으로 동작 웹 서버 기능 포함 + 정적 리소스 제공 가능 프로그램 코드를 실행해서 "애플리케이션 로직 수행" 동적 HTML, HTTP API (JSON) 서블릿, JSP, 스프링 MVC 예) 톰캣, Jetty, Undertow 기본 웹 시스템 구성 - WAS + DB 단점 WAS가 너무 많은 역할을 담당하기 때문에 서버 과부하 우려된다. WAS는 쉽게 죽는다. 중요한 애플리케이션 로직이 정적 리소스때문에 수행이 어려울 수 있다. ..
-
Spring Web관련 ScopeSpring 2023. 8. 22. 01:15
request 웹 요청이 들어오고 나갈때까지 유지 되는 스코프 클라이언트 A가 요청하면 A전용 객체가 만들어지고 서비스에서 A 객체를 조회할 수있으며 응답으로 요청이 종료되면 해당 스코프의 객체는 소멸한다. Prototype은 매번 새로운 객체를 만들지만 request는 요청이 들어오면 생성하고 응답하기 전까지 유지된다. Prototype은 소멸전 콜백이 안되지만 request의 경우 소멸전 콜백이 가능하다. 문제. 서버 실행시에는 요청이 없기 때문에 request scope의 빈을 주입받을 수 없다. 만약 의존관계 주입시 request scope의 빈을 주입한다고 가정했을때 어떻게 해결할 수 있을까? ObjectProvider를 이용하여 빈의 생성을 지연 시킬 수 있다. @Component @Scope..
-
Spring Bean ScopeSpring 2023. 8. 21. 12:23
Bean Scope Bean이 존재할 수 있는 범위를 뜻한다. Singleton Bean의 기본 스코프이며 스프링 컨테이너의 시작부터 종료까지 유지되는 가장 넓은 범위의 스코프이다. Prototype 스프링 컨태이너는 Prototype Bean의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않고 반환하는 가장 짧은 범위의 스코프이다. 초기화 콜백까지는 불러주지만 소멸전 콜백은 해주지 않는다. 종료 메서드의 경우 직접 호출해야한다. 만약 Singleton내부에서 Prototype을 사용하려면? 이 질문의 의도는 여러명의 클라이언트가 요청을 보낼때 마다 Prototype을 새롭게 만들어서 주입이 가능하냐는 말이다. 만약 기존에 의존관계를 주입하듯이 하면 처음 주입 받은 Prototype이 Singlet..
-
Spring Bean 생명 주기 콜백Spring 2023. 8. 21. 03:38
스프링 빈의 이벤트 라이프 사이클 스프링 컨테이너 생성 > 스프링 빈 생성 > 의존 관계 주입 > 초기화 콜백 > 사용 > 소멸전 콜백 > 스프링 종료 참고 사항 생성자 주입의 경우 빈 생성 단계에서 주입되고 setter와 필드 주입은 의존 관계 주입 단계에서 주입된다. 객체의 생성과 객체의 초기화는 분리하여 설계하는 것이 좋다. 콜백하는 방법 인터페이스 InitializingBean, DisposableBean을 구현하면 된다. 현재는 잘 사용되지 않는다. 스프링에 의존적이며 메서드명을 지정할 수 없는 단점이 있다. 설정 정보에서 초기화, 종료 메서드 지정 빈을 수동으로 등록할 때 사용된다. @Bean(InitMethod = "초기화메서드명", destoryMethod = "종료메서드명") destor..
-
Spring 의존 관계 주입 정리Spring 2023. 8. 21. 02:24
의존관계 주입 @Autowired는 기본적으로 등록된 빈의 타입으로 주입한다. 스프링이 빈을 모두 등록한 후 의존관계를 주입해준다. 기본적으로 주입할 대상이 빈에 등록되지 않으면 오류가 발생하며, 이를 막고 싶다면 @Autowired(required=false)로 지정하면 된다. 의존 관계 주입 4가지 방법 생성자 주입 생성자 호출 시점에서 딱 1번만 호출되는 것을 보장된다. 불변, 필수 의존 관계에서 사용한다. 생성자가 하나라면 @Autowried를 생략할 수 있다 스프링이 빈을 등록할때 결국 인스턴스화 할때 new 연산자를 사용하기 때문이다. 수정자 주입(setter 주입) 선택, 변경 가능성이 있는 의존관계에서 사용한다. 필드 주입 (권장하지 않는다.) 코드가 간결하지만 순수 자바 테스트가 힘들다는..