20강과 21강을 듣고 질문드립니다!
안녕하세요, 우선 좋은 강의 만들어주셔서 너무 잘 듣고 있습니다.
Spring 어노테이션의 의미를 대략은 알고 있었지만 자세히 알지 못하고 사용했던 것 같은데, 강의를 들으면서 하나씩 정리되어 가는 기분을 느끼고 있어서 많이 배우고 있습니다.
듣다가 궁금한 점이 생겨서 부족한 질문이지만 남겨보게 되었습니다!
21강에서 설명해주신 Configuration + Bean 조합과 Component의 어노테이션 차이가 있을까요? 개발자가 직접 만든 클래스를 스프링 빈을 만들어줄 때 사용해주는 것으로 이해해서 같은 역할인 것 같은데 어떤 차이가 있을까? 라는 생각이 들었습니다.
20강에서 설명해주신 @Primary, 그리고 21강에서 설명해주신 @Qualifier는 모두 스프링에서 여러 선택지가 있어서 선택하기 어려울 때 이게 우선순위야! 라고 알려주는 개념으로 이해하였는데요. 그럼 이 두가지도 같은 역할을 하는 것 같은데 어떤 차이가 있을까? 가 궁금해졌습니다. 직접 지정해주는 @Qualifier가 우선순위는 더 높지만, 두가지 다 사용하면 개인적으로는 버그가 있을 때 디버깅을 하기 어려워질 것 같은데 두가지 다 사용하는 경우도 있나요? (제가 현업에서 아직 경험해보지 못했을 수도 있을 것 같습니다 ^^;)
답변해주시면 많은 도움이 될 것 같습니다! 좋은 강의 만들어주셔서 감사드립니다 🙏🏻
답변 1
1
안녕하세요 다온님!! 아이고~~ 좋게 봐주셔서 너무 감사드립니다! 😊😊
질문 주신 내용 차근차근 답변 드려볼게요!!!
[1. @Configuration + @Bean과 @Component의 차이]
결론부터 말씀드리면, 기능적인 차이는 없습니다!!!
@Component : 개발자가 직접 만든 클래스에 사용
@Configuration + Bean : 외부 라이브러리나 프레임워크의 클래스를 등록할 때 사용
으로 나눠진 이유는, "외부 라이브러리나 프레임워크의 클래스"에 저희가 직접 @Component 어노테이션을 붙일 수 없기 때문입니다.
그러니 외부 라이브러리, 프레임워크의 클래스를 빈으로 등록하려면 무조건 @Configuration + @Bean을 사용해야 하는 것이죠!
그렇다면 이렇게 생각하실 수도 있습니다. 엇 개발자가 직접 만든 클래스도 Configuration + Bean 를 사용하면 안되나?!! 매우 좋은 포인트이신데요~~~
일반적으로는 관례상 Component를 붙여주는 편입니다. 그 이유는 제가 직접 만들었으니 1) @Component 어노테이션을 붙일 수 있고, 2) @Configuration + @Bean 조합을 사용하는것보다 @Component 어노테이션을 하나 붙이는게 더 간결하기 때문입니다.
물론 절대적인 기준은 아니라서 간혹~ 직접 만든 클래스에도 @Configuration + @Bean 조합 쓰곤 합니다!
[2. @Primary와 @Qualifer는 어떤 차이가 있는가?]
이렇게 생각하시면 쉽습니다!!!
제가 어떤 빈을 주입하려고 하는데 후보가 3개 있습니다. 코드로 간단히 표현해보면 아래와 같습니다.
public interface AService { }
@Service
public class AService1 implements AService { }
@Service
public class AService2 implements AService { }
@Service
public class AService3 implements AService { }이중에 AService1 이 가장 기본이라고 생각하면 @Primary 를 붙여줄 수 있습니다.
@Primary
@Service
public class AService1 implements AService { }매우 좋습니다~ 여기까진 문제가 없어요!! AService 를 주입 받으려 하면 가장 기본이 되는 AService1 가 잘 들어갈겁니다~
그런데 말이죠~ 이제 AService를 사용하는 100가지 코드에서 99가지 경우는 AService1 을 사용하면 되는데 1가지 경우에 AService2 를 쓰려고 합니다.
어떻게 하면 좋을까요?!!
이럴 때 바로 @Qualifier 가 필요합니다.
@Service
public class Service100 { // Service1 부터 Service100까지 있다고 하겠습니다 ㅎㅎㅎ
private final AService aService;
public OOOOService(@Qualifier("aService2") AService aService) {
this.aService = aService;
}
}여기서는 @Qualifier 를 사용해서 AService2 를 사용하겠다고 직접 명시 해주어야만 AService2 를 사용할 수 있습니다.
이런 경우가 바로, @Primary 와 @Qualifier를 둘 다 사용하는 경우입니다.
이렇게 되면 Service1 ~ Service99까지는 AService1을 사용하고 Service100만 ASerivce2를 사용하는 것이 명확하니 디버깅이 그렇게 어렵지는 않습니다.
물론! 제가 개발을 몇년간 하면서도 @Primary 와 @Qualifier를 둘 다 쓰는 경우는 꽤 드물긴 했습니다 ㅎㅎㅎ 그래도 여러 빈 설정을 복잡하게 해줄 때 간혹 사용하는 편이에요!
제 답변이 도움이 되었으면 좋겠네요!
혹시나 또 궁금하신 점 생기시면 편하게 질문 남겨주세요! 감사합니!! 🙏🙏
패키지 구분에 대해 궁금한게 있습니다
0
27
2
리액트 관련 질문이 있습니다.
0
65
2
스프링부트 버전
0
78
2
7강 강의를 들으려고 했는데 오류가 나서 서버가 안 켜지는거 같아요.
0
60
2
33강. UserLoanHistory의 관계성에 대한 질문
1
56
2
Java JDK 버전 문의의 건
0
136
2
ec2 에서 Linux버전이 달라져서 설치가 안되는것 같은데 자료 최신화좀 해주세요.
0
90
3
h2 console 접속했을 테이블 질문
1
67
1
ec2 서버에서 스프링 실행도 되고 인바운드 설정까지 했는데 index.html 안됨
0
81
2
15강. updateUser() 질문
0
57
2
깃허브 질
0
86
2
여기까지 다 끝냈다고 하셨는데
0
80
2
왜안될까요
0
72
2
MySQL 창이안ㄴ뜹니다
0
59
2
포스트맨
0
53
1
spring 개념적인 질문
0
72
2
인텔리제이 샘플코드 실행 안됨 오류
0
144
2
aws 배포할때 .env 파일에 저장한 환경변수에 관하여 여쭤볼게 있습니다
0
88
1
마이그레이션 오류입니다.
0
176
3
Whitelabel Error Page 오류가 났습니다.
0
172
2
안녕하십니까! 오류가 났습니다.. 도와주세요 ㅜㅜ
1
94
3
궁금한게 있습니다.
0
61
2
DTO 관련
0
71
2
궁금한게 있습니다!
0
70
2





