본문 바로가기

좋아하는 것_매직IT/1.spring

8.Spring, 스프링 빈(Bean) 스코프와 중요한 어노테이션에 대해서 알아봅시다. ^^

반응형

스프링 빈(Bean) 스코프(Scope) 에 대해서 알아보자

  • 스프링 빈은 여러 스코프로 생성할 수 있음.
    • 기본
      • 싱글톤(Singleton)
        • 싱글톤 빈의 인스턴스는 하나.
          • 요청(request)과 관련된 데이터를 포함할 수 없음.
  • 스코프(Scope) 는 모든 스프링 빈에서 아래 어노테이션과 함께 제공될 수 있음.
    • @Scope
      • 예시

 

  • 그럼, 다양한 스코프에 대해서 알아보자.
    • 스코프 설명 비고
      싱글톤(Singleton)
       
      - 기본적으로 모든 빈의 스코프는 싱글톤임.
      - 스프링 IoC 컨테이너 인스턴스당 오직 하나의 빈 인스턴스만 사용됨.
      - 빈에 대한 여러 참조가 있더라도, 컨테이너당 한번만 작성됨.
      - 싱글톤 인스턴스는 캐싱돼 이 빈을 사용하는 모든 후속 요청에 사용됨.
      - 스프링 싱글톤 스코프가 하나의 스프링 컨테이너당 하나의 객체라는 것을 지정하는 것이 중요함.
      - 단일 JVM에 스프링 컨테이너가 여러개 있는 경우, 동일한 빈의 인스턴스가 여러 개 있을 수 있음.
       - 즉, 스프링 싱글톤의 스코프는 일반적인 정의와 조금 다름.
       
      프로토타입(Prototype)

      - 스프링 컨테이너에서 빈이 요청될 때 마다 새로운 인스턴스가 생성됨. 
       - 즉, 빈에 상태가 포함돼 있는 경우, 해당 프로토타입 스코프를 사용하는 것이 좋음. 

       
      리퀘스트(Request) - 스프링 웹 콘텍스트에서만 사용할 수 있음.
       - 즉, 모든 HTTP 요청마다 빈의 새 인스턴스가 작성됨.
      - 빈은 요청 처리가 완료되는 즉시 폐기됨.
       - 즉, 단일 요청과 관련된 데이터를 보유하고 있는 빈에 이상적임.
       
      세션(Session) - 스프링 웹 콘텍스트에서만 사용할 수 있음.
      - 모든 HTTP 세션마다 빈의 새로운 인스턴스가 생성됨.
       - 즉, 웹 애플리케이션의 사용자 권한과 같이 단일 사용자 고유의 데이터에 적합함.
       
      어플리케이션(Application) - 스프링 웹 콘텍스트에서만 사용할 수 있음.
      - 웹 애플리케이션당, 하나의 빈 인스턴스로 특정 환경의 애플리케이션 구성에 적합함.
       

       

 그럼, 중요한 어노테이션에 대해서 알아보자.

  • 첫째,
    • @Autowired 어노테이션
      • Autowired 어노테이션을 의존성에 사용하면, 애플리케이션 콘텍스트는 자동으로 일치하는 의존성을 검색함. 
        • 기본적으로 Autowired 되는 모든 의존성이 필요함.
          • 아래의 경우에 대해 나눠어 진다.
            • 첫째, 일치하는 항목이 1개 있을 경우
              • 찾고 있는 의존 항목
            • 둘째, 일차하는 항목이 2개 이상 발견될 경우
              • Autowiring 실패
                • 그럼, 해결책에 대해서 알아보자.
                  • 후보 중 하나만 사용하려면 @Primary 어노테이션을 사용하면됨.
                  • Autowiring 을 강화하려면, @Qualifier 를 사용하면됨.
                    • 암튼, 2개의 어노테이션에 대해서 밑에서 더욱 자세히 알아볼께요.
            • 셋째, 일치하는 항목이 없을 경우
              • Autowiring 실패
  • 둘째,
    • @Primary 어노테이션
      • 특정 의존성을 Autowiring할 수 있는 후보가 둘 이상 존재하면, @Primary 어노테이션을 사용한 빈이 호출됨.
      • 자세한 사항은 예시를 통해서 알아보자.
      • 예시

  • 설명
    • 위의 예제의 경우 2가지 Subject 을 사용할 수 있음.
    • 구성요소 검사가 두 요소를 모두 찾으면, JavaSubject는 @Primary  어노테이션 때문에 ThubSubject에 대한 의존성을 연결하는 데 사용됨.
  • 셋째,
    • @Qualifier 어노테이션
      • 스프링빈에 대한 참조를 주기 위해 사용됨.
        • 즉, 이 참조는 Autowired할 필요가 있는 의존성을 한정하는 데 사용됨.
      • 자세한 것은 예시를 통해서 알아 보자.
      • 예시

  • 설명
    • 위의 예시에서 JavascriptSubject 와 JavaSubject 라는 2가지 Subject 를 사용할 수 있음.
      • but, SomeThubService클래스에서는 @Qualifier("javascriptsubject")가 사용됐기 때문에, javascriptsubject 한정자(Qualifier)를 가진 JavascriptSubject 는 Autowiring을 위해 선택된 후보 의존성이 됨.

그럼, 기타 중요한 스프링 어노테이션에 대해서 알아보자.

  • 스프링은 빈(Bean)을 정의하고, 빈의 생명 주기를 관리하는데 많은 유연성을 제공함.
  • 그럼 본격적으로 기타 중요한 어노테이션에 대해서 알아보자
    • 첫째, 
      • @ScopedProxy 어노테이션
        • 요청이나 세션 스코프의 빈을 싱글톤 스코프의 빈에 주입해야 하는 경우가 있음.
        • 즉, 해당 어노테이션은 이러한 상황에서 단일 스코프 빈에 주입되는 스마트 프록시를 제공함.
    • 둘째,
      • @Component, @Controller, @Service, @Repository 어노테이션
        • @Component 어노테이션
          • 스프링 빈을 정의하는 가장 일반적인 방법
        • @Controller 어노테이션
          • 프레젠테이션 구성요소에 사용됨.
        • @Service 어노테이션
          • 비즈니스 서비스 레이어에서 사용됨.
        • @Repository 어노테이션
          • 데이터 액세스 객체에서 사용됨.
    • 셋째, 
      • @PostConstruct 어노테이션
        • 모든 스프링 빈에서 해당 어노테이션을 사용해 post construct 메소드를 제공함.
          • 해당 메소드는 빈이 의존성으로 완전히 초기화된 후에 호출됨.
            • 참고로, 빈 생명 주기 동안 한번 만 호출됨.
    • 넷째,
      • @PreDestory 어노테이션
        • 스프링 빈에서 해당 어노테이션을 사용해 predestory 메소드를 제공함.
          • 해당 메소드는 빈이 컨테이너에서 제거되기전에 호출됨.
            • 즉, 빈에 의해 보유된 자원을 해제하는 데 사용됨.

결론

  • 스프링 빈은 여러 스코프로 생성할 수 있음
    • 기본은 싱글톤 스코프
    • 그외에 스코프는, 프로토타입, 리퀘스트, 세션, 애플리케이션 이 있음.
  • 알아두어야할, 아래와 같은 중요한 어노테이션에 있음.
    • @Autowired / @Primary / @Qualifier
  • 그외의 추가적으로 아래 어노테이션도 알아두어야 함.
    • @ScopedProxy / @Component, @Controller, @Service, @Repository / @PostConsturct / @PreDestory 등등
  • 오늘도 스프링 빈의 스코프와 알아두어야할 어노테이션에 대한 지식에 대한 마술(?) 한가지 획득완료! 감사합니다. ^^
300x250