과거의나야도와줘
Spring 07. Spring 환경 설정 3 본문
주의!
공부하면서 제가 이해한 대로 쓰는거라 잘못된 부분이 있을 수 있습니다
만약 잘못된 부분이 있다면 댓글로 가르쳐주시면 감사합니다
이번에는 생성자 주입을 해볼게요
저 포스팅에서 property로 했던거는 설정자(setter)주입이라고 하네요
01. 생성자 주입
생성자 주입을 하기 위해 Trainer 클래스에 빨간 박스 부분을 바꿔줍니다
생성자 주입은 property가 아니라 constructor-arg라는 것으로 주입을 합니다
name 에는 들어갈 파라미터 이름 ref에는 넣을 bean 객체를 넣으시면 그대로 작동합니다
02. 생성자 주입과 설정자 주입의 차이
생성자 주입(위에 Constructor-arg로 넣은거)과 설정자 주입(Property 썼던거)의 차이는 뭐가 있을까요?
그냥 똑같이 객체를 만들고 의존성을 주입시켜 주고 있는데 다른점이 있을까요?
생성자 주입은 내가 원하는 생성자가 있어야 그대로 넣어줄 수 있고 또한 생성자에서 필요로하는 의존성을 모두 주입하지 않으면 빈 객체가 등록되지 않습니다
반면 설정자 주입은 의존성을 주입하지 않아도 일단 빈 객체가 등록 되기는 합니다. 나중에 자바코드로 동적으로 의존관계를 변경 할 수도 있고요
설정자 주입이 조금 더 자유롭긴 한데 어떤게 더 낫다 하는 거는 없습니다.
때로는 엄격한 정책이 필요할 때도 있으니까요
03. 어노테이션(Annotation)을 이용한 설정자(setter)주입
이번에는 어노테이션(@)을 이용한 설정자주입을 해보겠습니다
어노테이션을 이용한 설정자 주입은 우리가 여태 했던것처럼 xml 설정파일에서 bean 등록과 의존관계를 설정 하는 것이 아니라,
자바 코드의 어노테이션을 읽음으로써 설정 처리를 하는 방법입니다.
그 전에 Namespaces에 대해 잠깐 짚고 갈건데요
xml 파일에서 아래 namespaces 탭을 눌러봅시다
그러면 위와 같은 화면이 나오고 beans에만 체크 되어 있는 상태일 겁니다
context에도 체크를 해주시고 다시 아래 source를 눌러 돌아와 봅시다
xml 위쪽에 뭔가 많이 추가 된걸 보실 수 있습니다. 이러면 완성
아래와 같이
<context:component-scan base-package="낙인 찍을 패키지 주소"/> 를 작성해 주시면
큰 따옴표 안의 주소 패키지에 있는 자바파일들에 있는 클래스를 @로 낙인을 찍어 bean으로 등록할 수 있습니다.
낙인을 찍어 봅시다.
낙인 찍을 클래스 위에 @Component를 달아주시면 bean 객체로 등록 되고
왼쪽 아이콘도 Scan 되었다는 의미로 S가 붙습니다
등록이 잘 되었는지 확인하기 위해 피카츄 객체를 가지고 와봤는데 잘 돌아가는 것을 볼 수 있습니다.
음 근데 뭔가 허전하죠?
아까는 뭐 이것저것 했던거 같은데 @Component 하나 썼다고 bean객체로 등록이 되네요 우리가 아까 한 것 중에 안한게 하나 생각 나시나요?
바로 id 설정입니다. xml에서 빈 객체를 등록할때는 id 속성도 따로 적어줬었는데 @Component로 빈 객체를 등록할 때는 그 클래스의 첫 글자를 소문자로 한 것이 자동으로 id가 됩니다. 위에서 getBean()으로 불러올때 똑같이 id에 pikachu로 불러온거 보이시죠?
id를 다른 걸로 설정할 수도 있는데 이따가 알아볼게요
트레이너에도 낙인을 찍어 봅시다
@Autowired라는 신기한 걸 써볼 껀데요 아래와 같이 @Autowired를 달면 이게 달린 곳에 타입이 일치하는 Bean객체를 컨테이너가 알아서 적용해줍니다
진짜 되는지 확인하기 위해 Test를 해보죠
편리하네요 그런데 같은 타입의 빈 객체가 여러개면 컨테이너가 어떻게 알아서 넣을까요?
뭔가 에러가 날 것 같은데요
궁금하면 찍어보면 됩니다
생각한대로 에러가 납니다.
에러를 읽어보니 Pokemon 타입 하나를 기대했는데 두개가 나왔다고 하네요
그러면 어떤 것을 넣을지 직접 설정을 해줘야 겠죠?
아래처럼 @Component("빈 객체 id") 이런식으로 빈 객체의 id를 직접 설정 할 수 있습니다
이렇게 하면 pokemon으로 id를 적은 피카츄가 위의 설정자에 주입이 됩니다. (setPokemon()의 pokemon이랑 일치해야 됨)
다른 방법으로는 애초에 @Autowired를 달 때 @Qualifier("연결할빈객체이름")도 달아주는 방법도 있습니다
하지만 대부분은 한 개씩 매칭 되기 때문에 이런게 있다 정도로 알아두고 넘어가시면 됩니다.
04. 어노테이션을 이용한 생성자(Constructor) 주입
어노테이션을 생성자에 달아서 주입하는 방법도 있습니다
두가지 방법이 있어요
05. 필드 주입(reflection)
생성자 설정자 주입 말고 이렇게 하는 방법도 있습니다
여러가지 주입 방법을 알아봤는데 스프링은 보통 생성자 주입을 권장한다고 하네요
오늘 포스팅은 여기까지입니다 오늘도 정리가 안됐네요
그래도 IoC와 DI는 오늘로 끝났습니다
다음 포스팅에서 봐요
'개발공부노트 > Spring' 카테고리의 다른 글
Spring 09. AOP 02 (0) | 2022.10.21 |
---|---|
Spring 08. AOP(Aspect Oriented Programming) 01 (0) | 2022.10.21 |
Spring 06. Spring 환경 설정 2 (0) | 2022.10.18 |
Spring 05. Spring 환경 설정 1 (0) | 2022.10.13 |
Spring 04. Spring 개발 환경 구축 (0) | 2022.10.12 |