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와 동시에 빈에 생성된다.
    • 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로 요청했는지 알 수 있다.