TIL(Today I Learned)
TIL 31th day (2021.11.21)
keepgoing
2021. 11. 21. 21:54
초기화 및 소멸자 콜백📌
- 외부라이브러리 수정이 불가피할때는
- @Bean의 initMethod와 destroyMethod를 사용
- 외부라이브러리 수정이 불필요할때는
- PostConstruct, PreDestroy Annotation 사용
빈 스코프📌
싱글톤 스코프(항상 같은 객체 스프링 빈을 반환한다.) : 기본 스코프
프로토타입 빈
- 스프링 컨테이너에서 조회할 때마다 새로운 스프링 빈 생성하고, 자동으로 의존관계 주입 및 반환
- 스프링 컨테이너에서 관리 x, 클라이언트에서 관리 o, 직접 destroy를 선언
싱글톤 빈과 프로토타입 빈을 같이 사용했을 시 문제점
- 싱글톤 빈에 포함되어있는 프로토타입 빈은 이미 의존관계 주입이 완료된 상태이므로 새로 생성되지 않는다!
싱글톤 빈과 프로토타입 빈을 같이 사용했을 시 문제점 해결방법📌
- 자바표준에서 제공하는 provider 또는 스프링에서 제공하는 provider를 사용한다.(DL:Dependency Lookup)
웹 스코프📌
- request scope
- 서로다른 HTTPrequest 요청이 들어오면 서로다른 빈 스코프를 생성 및 반환 및 소멸
- UUID로 HTTPrequest 구별.
- 실질적인 요청이 없을땐 Provider를 사용(Provider가 빈의 생성을 지연시켜주기 때문.)
- 스프링 컨테이너에 의존관계 주입이 HTTP요청보다 먼저 실행되기 때문에 요청자체를 받지 못한다.
- 그렇기 때문에 스프링 컨테이너 의존관계 주입 순서를 뒤로 늦춰주어야하고, Provider를 통해 의존관계 주입을 늦춰주는것이다.
- 어떻게 주입을 늦춰주는가?
- Provider는 요청이 왔을 때 스프링 컨테이너에 빈을 생성하는 성질을 갖고있다. 따라서, HttpRequest와 동시에 빈에 생성된다.
- 스프링 컨테이너에 의존관계 주입이 HTTP요청보다 먼저 실행되기 때문에 요청자체를 받지 못한다.
- Provider의 대체 방식) Proxy
- 대리 객체로 지정되어있다가 Http요청이 오면 진짜 객체(클래스 또는 인터페이스)로 변환된다.
- CGLIB에서 제공하는 proxy를 이용해 request scope를 싱글톤과 유사하게 사용할 수 있다.
- Provider와 Proxy의 핵심
- 진짜 객체를 조회를 꼭 필요한 시점까지 지연처리한다는점.🎯(다형성과 DI가 가진 큰 장점)
- Provider와 Proxy의 주의점
- 싱글톤과 비슷하지만 다르다.
- 무분별한 사용 x(유지보수가 어려워짐)
궁금한점 📌
@Controller란?
- 요청을 받고, 결정
- 요청 수행은 @Service에서,
- @Service 클래스는 수정을 최소화하는 것이 유지보수에 유리
- View를 결정해서 보여주는 역할
@RequestMapping이란?
- 요청에 대한 어떤 Controller 또는 어떤 메소드가 처리할지 결정.
@ResponseBody란?
- 리턴을 view를 통해서가 아닌 HTTP Response Body 에 직접 쓰여지게된다.
HttpServletRequest란?
- 사용자의 요청정보를 가져올 수 있다.
- 예로) 사용자 아이디, 비밀번호를 요청하면 그 데이터를 HttpServletRequest에 넣어준다.
- getRequestURL()이란?
- 사용자가 어떤 URL로 요청했는지 알 수 있다.