본문 바로가기
기록해보기

스프링 컨테이너를 다루는 방법

by titlejjk 2023. 6. 7.

이번 수업은 스프링 컨테이너를 다루는 방법!이다.

스프링 컨테이너 스프링 빈이 무엇인지? 배웠었는데 이번 수업은 스프링 빈을 등록하고 가져오는 방법을 배워볼 차례이다.

 

먼저 빈을 등록하는 방법이다.

빈을 등록하는 방법으로는 @RestController @Service @Repository 외에도

@Configuration과 @Bean 어노테이션이있다 이둘은 셋트인데 먼저

@Configuration 👉

  • Class에 붙이는 어노테이션
  • @Bean을 사용할 때 함께 사용해 주어야 한다.

@Bean👉

  • 메소드에 붙이는 어노테이션
  • 메소드에서 반환되는 객체를 스프링 빈에 등록한다.

백문이불이여일타

직접 UserRepository에 @Bean을 사용해보겠다.

원래는 @Repository 어노테이션을 통해서 빈으로 등록했었는데 이걸 지우고 @Configuration과 @Bean을 사용해보겠다.

@Configuration은 보통 config라는 package에 넣어 사용한다.

나는 libraryapp에 config라는 package를 만들어서 사용해 보겠다.

이안에 UserConfiguration 이라는 이름의 JavaClass를 만들어준다.

위에 설명했듯이 @Configuration은 Class에 붙이는 어노테이션이니이걸 Class에 적어주겠다.

다음으로 @Bean은 메소드에 붙이는 어노테이션이니 메소드에 붙여주겠다.

이 때 주의점은 @Bean어노테이션은 메소드에서 반환되는 객체를 스프링 빈에 등록한다는 것이다.

Repository에는 JdbcTemplate가 필요하니 그것도 넣어주자.

완성!

그러면 언제? @Service, @Repository를 사용해야 할까?!

 

먼저 @Service 는 개발자가 직접 만든 Class를 스프링 빈으로 등록 할때 많이 사용한다.

그렇다면 @Configuration + @Bean을 사용해야 할까? 언제사용해야하나?

바로 외부 라이브러리, 프레임워크에서 만든 클래스를 등록할 때 사용한다.

예를 들면 JdbcTemplate같은 경우에 외부에서 가져온 것인데 그래서 JdbcTemplate같이 외부에서 가져온 클래스를 등록할 때 사용한다.

 

그래서 UserService나 UserRepository는 @Service, @Repository를 사용하는 것이 좋다.

 

다음으로 살펴볼 어노테이션은 @Component

@Component👉

  • 주어진 클래스를 "컴포넌트"로 간주한다.
  • 이 클래스들은 스프링 서버가 뜰 때 자동으로 감지된다.

자동으로 등록되는 스프링 빈중 하나이다.

그리고 사실 이 @Component는 계속 사용하고있었다. @Repository나 @Service 등등

이런식으로 @Component 덕에 우리가 사용했던 어노테이션이 자동으로 감지되고 있었다.

그렇다면 이 @Component는 언제 사용할까?

개발자가 직접 작성한 클래스를 스프링 빈으로 등록할 때 사용된다. 

 

이제 스프링 빈을 등록하는 방법을 알아보았으니 스프링 빈을 주입 받는 방법을 알아보겠다.

가장 첫 번째 방법은 생성자를 이용해 주입받는 방식이다.(가장권장되는 방법이다.)

원래는 생성자 위에 @Autowired를 붙여주어야 했었다.

이 어노테이션의 의미는 생성자에 있는 매개변수에 스프링 빈을 자동으로 연결시켜달라는 의미이다.

원래는 이 어노테이션을 사용해줬어야 했는데 스프링의 버전이 업그레이드가 될수록 생성자 방식일 때는 바로 주입되도록 변경되었다.

 

두번째 방법으로는 setter와 @Autowired를 사용하는 방법이다.

이랬던 것이 아래처럼

이것이 setter와 @Autowired를 사용하는 두 번째 방법이다.

 

세 번째 방법은 필드에 직접 @Autowired를 사용하는 방법이다.

제일 많이 쓰는 방법은 생성자를 이용해 주입하는 방법인 첫 번째 방법이다.

 

정리하자면 스프링 빈을 주입 받는 방법은

  1. 생성자 사용 (@Autowired 생략 가능)
  2. setter 사용
    누군가 setter를 사용하면 오작동할 수 있다.
  3. 필드에서 바로 사용
    테스트를 어렵게 만드는 요인이 될 수도 있다.

마지막으로 @Qualifier

이 어노테이션은 살짝 복잡하다. 

강사님 ppt에서 가져옴

예를들어서

UserController에는 FruitServie라는 인터페이스가 있는데 이 인터페이스는 세가지 클래스가 구현하고 있다는 가정을 해보자.

후보가 무려 세개다 AppleService와 BananaService, OrangeService 이중에 어떤 것을 스프링컨테이너가 대신 넣어줄지 스프링 컨테이너가 결정을 못했는데 이럴 때 

@Qualifier가 사용된다.

AppleService를 사용한다 가정해보자.

UserController에 FruitService생성자를 만들고 FuritService를 주입 받는 곳 앞에 @Qualifier("appleService")를 써주면된다.

빨간색 글씨는 class안만들고 해서 뜨는거에요옹

@Qualifier 어노테이션은 스프링 빈의 이름을 지정함으로써 여러개의 후보군이 있을 때 특정 클래스를 가져오고 싶을 때 사용하면된다.

또 다른 기능이 있다.

BanananService에다가 @Qualifier("main")이라 적어준다면 원래는 UserController에서 ("appleService")라고 작성해주었는데 이걸 ("main")으로 서로 가르키게 하면 특정 클래스를 연결시켜줄 수 있다.

 

정리하자면

스프링 빈을 사용하는 쪽에서만 쓰면, 빈의 이름을 적어줘야함👉("appleService")

 

스프링 빈을 사용하는 쪽, 스프링 빈을 등록하는 쪽 모두 @Qualifier를 사용한다면 ("main")으로 사용할 클래스를 연결시켜줘야함👉("main")

 

양쪽 모두 사용하면, @Qualifier끼리 연결된다.

 

그럼 전에 배웠던 @Primary와 @Qualifier를 두개 사용한다하면 어떤 어노테이션을 우선 순위로 사용할까?

정답은 사용하는 쪽에서 직접 적어준 @Qualifier를 우선순위로 사용하게 된다.

스프링은 더 특수하게 사용자가 명시해준것을 우선순위 높게 가져가도록 해준다.

 

오늘은 여기까지..내일도 강의 하나씩 들어야겠다..

댓글