본문 바로가기

Spring/core

(12)
ArgumentResolver ArgumentResolver 포스팅은 HandlerAdapter에 의존합니다. 목차 1. ArgumentResolver 2. ArgumentResolver가 처리할 수 있는 커스텀 애노테이션 만들기 ArgumentResolver : RequestMapping 메서드의 파라미터를 처리한다. @RequestMapping 은 어떻게 @RequestBody 애노테이션을 인식할 수 있을까요? 그리고 HttpServletRequest 객체는 누가 넣어주는 것일까요? 이에 대한 해답은 ArgumentResolver에 있습니다. 잠깐 MVC 패턴의 요청/응답 구조를 봅시다. 클라이언트의 요청을 처리하는 4번 과정에서 ArgumentResolver가 동작하게 됩니다. RequestMappingHandlerAdapter..
HandlerAdapter 개인적으로 스프링 MVC를 처음 공부할 때 가장 이해하기 어려운 부분이 HandlerAdapter이었는데요. 최범균님의 스프링5 책 덕분에 갈증을 해소하게 되었습니다. 포스팅은 범균님의 스프링5, 영한님의 스프링 MVC 1,2 편 강의가 섞여 정리되어 있습니다. HandlerAdapter : 컨트롤러 역할을 하는 클래스를 공통으로 처리하는 주체 스프링 2.5 이후에는 @Controller 애노테이션을 많이 사용했지만 과거에는 Controller 인터페이스를 이용했습니다. 또한 특수 목적으로 사용되는 HttpRequestHandler 인터페이스까지 컨트롤러를 구현할 수 있는 방법은 여러가지입니다. 이 여러가지 방법을 동일한 방식으로 처리하기 위해 중간에 사용되는 것이 바로 HandlerAdapter입니다...
프록시 내부 호출 문제 해결 방법 - 자기 주입, 지연 조회, 구조 변경 이 포스팅은 인프런 김영한님의 스프링 핵심 원리 - 고급편에 기반하여 작성된 포스팅입니다. 프록시 내부 호출이 무엇인지 안다는 전제하에 포스팅을 작성합니다. 학습 환경 Spring Boot 2.5.x 목차 1. 내부 호출 대안 - 자기 자신 주입 2. 내부 호출 대안 - 지연 조회 3. 내부 호출 대안 - 구조 변경 1. 내부 호출 대안 - 자기 자신 주입 내부 호출을 사용하는 스프링 빈에 자기 자신을 주입한다. 세터 주입으로 해야한다. 스프링은 객체를 생성하는 단계와 세터로 의존관계를 주입하는 단계가 분리되어 있다. 한 편 생성자 주입은 빈 생성 시점에 의존 관계를 주입하기 때문에 순환 참조에 빠지게 된다. (스프링 빈 순환 참조 예외 BeanCurrentlyInCreationException) 이제 ..
스프링 빈 순환 참조 예외 BeanCurrentlyInCreationException 목차 1. BeanCurrentlyInCreationException 왜 발생할까? 2. 어떻게 해결할까? 1. BeanCurrentlyInCreationException 왜 발생할까? 프로젝트가 커짐에 따라 아래와 같은 예외를 만난 경험이 있을수도 있다. 저는 AOP를 공부하다가 해당 예외를 마주하게 되었습니다. 예외의 마지막 줄을 해석해보면 해결할 수 없는 순환 참조(circular reference)가 있는건 아닌지 말해주네요. 그러면 스프링에서 순환 참조란 무엇일까요? 스프링 컨테이너에서는 객체를 생성하고 스프링 빈으로 등록합니다. 스프링 빈으로 등록할 때는 의존 관계를 주입해야 합니다. 이 과정에서 순환 참조가 발생하게 됩니다. 그럼 순환 참조란 무엇일까요? 쉬운 예시를 통해 이해해봅시다. 쉽게..
스프링5 프로그래밍 입문 - ch7. AOP 프로그래밍 - (2) AOP 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문을 더 잘 이해하기 위해 정리하기 위한 포스팅입니다. 이번 포스팅은 스프링5 프로그래밍 입문 - ch7. AOP 프로그래밍 - (1) 프록시와 이어집니다. 목차 0. AOP를 배워야 하는 이유 1. 스프링 AOP 2. 스프링 AOP 구현 0. AOP를 배워야 하는 이유 사견입니다. AOP를 배워야 하는 이유는 생각보다 간단한 것 같다. 1. 여기저기서 많이 쓴다. 많이 사용하는 것들은 자세하게 알수록 좋다. 그 이유는 3번 때문이다. 2. 공통 처리가 가능하다. 공통 처리가 가능하다는 것은 코드 중복을 제거할 수 있다는 의미이다. 그리고 코드 중복이 없다는 것은 대체로 변경이 일어났을 때 강점을 가지게 된다. 10곳을 수리하는 것보다는 1곳을 수리하는게 편..
스프링5 프로그래밍 입문 - ch7. AOP 프로그래밍 - (1) 프록시 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문을 더 잘 이해하기 위해 정리하기 위한 포스팅입니다. 목차 0. 프록시를 알아야 하는 이유 1. 프록시는 왜 등장하게 되었을까? 문제를 만들어보자. 2. 프록시 객체 0. 프록시를 알아야 하는 이유 1. 스프링 AOP가 프록시 객체를 생성해서 구현되어 있기 때문이다. @Transcational 우리가 사용하는 대표적인 스프링 AOP 기능일 것이다. 제대로 사용하려면 이에 대해 잘 알고 있어야 한다. 2. 일단 프록시랑 친해지면 여러모로 좋다. 아래 예제에서 delegate 라는 변수 명을 사용한다. 대리자라는 의미이다. 처음 프록시를 접했을 때는 "왜 대리자가 필요하지? 일만 복잡해지게 말이야." 의문이 들었을 때가 있다. 여러모로 좋다고 생각한 점은 프록..
스프링5 프로그래밍 입문 - ch6.빈 라이프사이클 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문을 더 잘 이해하기 위해 정리하기 위한 포스팅입니다. 목차 1. 스프링 빈 객체의 라이프 라이클 2. 빈 객체의 초기화와 소멸 : 스프링 인터페이스 3. 빈 객체의 초기화와 소멸 : 커스텀 메서드 1. 스프링 빈 객체의 라이프 라이클 스프링 컨테이너는 빈 객체의 라이프사이클을 관리한다. 스프링 컨테이너가 관리하는 빈 객체의 라이프사이클은 아래와 같다. 스프링 컨테이너 초기화할 때 스프링 컨테이너는 가장 먼저 빈 객체를 생성하고 의존 관계를 설정한다. 의존 관계 자동 주입을 통한 의존 설정이 이 시점에서 수행된다. 모든 의존 관계가 설정되면 빈 객체의 초기화를 수행한다. 이후 스프링 컨테이너를 종료하면 스프링 컨테이너는 빈 객체의 소멸을 처리한다. 2. 빈 ..
스프링5 프로그래밍 입문 - ch5.컴포넌트 스캔 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문을 더 잘 이해하기 위해 정리하기 위한 포스팅입니다. 목차 1. @Component/@ComponentScan는 왜 사용할까? 2. @Component/@ComponentScan 사용 방법 1. @Component/@ComponentScan는 왜 사용할까? 앞서 스프링 빈을 설정 파일에서 수동 등록 및 주입하거나 @AutoWired를 이용해서 의존 관계를 자동 주입하는 방법에 대해 알아보았다. 여기서 구분해야할 것은 스프링 빈으로 등록하는 것과 의존 관계를 주입하는 것이다. 여기서 잠시 고민해볼 것이 @AutoWired가 정말로 좋은가? 에 대해 고민해보면 좋을 것 같다. 우리는 IOC의 제어를 받기 위해 스프링 빈으로 등록한다. 그러면 의존 관계 주입하는..