이번 수업은 스프링 컨테이너를 다루는 방법!이다.
스프링 컨테이너 스프링 빈이 무엇인지? 배웠었는데 이번 수업은 스프링 빈을 등록하고 가져오는 방법을 배워볼 차례이다.
먼저 빈을 등록하는 방법이다.
빈을 등록하는 방법으로는 @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를 사용하는 방법이다.
제일 많이 쓰는 방법은 생성자를 이용해 주입하는 방법인 첫 번째 방법이다.
정리하자면 스프링 빈을 주입 받는 방법은
- 생성자 사용 (@Autowired 생략 가능)
- setter 사용
누군가 setter를 사용하면 오작동할 수 있다. - 필드에서 바로 사용
테스트를 어렵게 만드는 요인이 될 수도 있다.
마지막으로 @Qualifier
이 어노테이션은 살짝 복잡하다.
예를들어서
UserController에는 FruitServie라는 인터페이스가 있는데 이 인터페이스는 세가지 클래스가 구현하고 있다는 가정을 해보자.
후보가 무려 세개다 AppleService와 BananaService, OrangeService 이중에 어떤 것을 스프링컨테이너가 대신 넣어줄지 스프링 컨테이너가 결정을 못했는데 이럴 때
@Qualifier가 사용된다.
AppleService를 사용한다 가정해보자.
UserController에 FruitService생성자를 만들고 FuritService를 주입 받는 곳 앞에 @Qualifier("appleService")를 써주면된다.
@Qualifier 어노테이션은 스프링 빈의 이름을 지정함으로써 여러개의 후보군이 있을 때 특정 클래스를 가져오고 싶을 때 사용하면된다.
또 다른 기능이 있다.
BanananService에다가 @Qualifier("main")이라 적어준다면 원래는 UserController에서 ("appleService")라고 작성해주었는데 이걸 ("main")으로 서로 가르키게 하면 특정 클래스를 연결시켜줄 수 있다.
정리하자면
스프링 빈을 사용하는 쪽에서만 쓰면, 빈의 이름을 적어줘야함👉("appleService")
스프링 빈을 사용하는 쪽, 스프링 빈을 등록하는 쪽 모두 @Qualifier를 사용한다면 ("main")으로 사용할 클래스를 연결시켜줘야함👉("main")
양쪽 모두 사용하면, @Qualifier끼리 연결된다.
그럼 전에 배웠던 @Primary와 @Qualifier를 두개 사용한다하면 어떤 어노테이션을 우선 순위로 사용할까?
정답은 사용하는 쪽에서 직접 적어준 @Qualifier를 우선순위로 사용하게 된다.
스프링은 더 특수하게 사용자가 명시해준것을 우선순위 높게 가져가도록 해준다.
오늘은 여기까지..내일도 강의 하나씩 들어야겠다..
'기록해보기' 카테고리의 다른 글
문자열 SQL을 직접 사용하는 것이 너무 어렵다!! (0) | 2023.06.11 |
---|---|
3번째 정리! (0) | 2023.06.11 |
스프링 컨테이너를 왜 사용할까? (0) | 2023.06.06 |
UserController와 스프링 컨테이너 (0) | 2023.06.05 |
Controller를 3단 분리하기 -Service와 Repository (1) | 2023.06.05 |
댓글