티스토리 뷰
반응형
[배워서 바로 쓰는 스프링 프레임워크 - www.yes24.com/Product/Goods/90051375]
2. 내부 빈
- <beans> 스키마에 정의된 <bean>을 사용해 <property>나 <constructor-arg> 엘리먼트 내부에 정의한 빈
- 빈 의존 관계를 여러 빈이 공유하지 않는다면 의존 관계를 내부 빈으로 만드는 것을 고려할 수 있다
- 내부 빈은 해당 빈 정의를 둘러싸고 있는 빈 정의 안에서만 접근할 수 있다
- 내부 빈 정의에 해당하는 <bean> 엘리먼트는 id 속성을 지정하지 않고 지정해도 무시된다
- 내부 빈은 항상 프로토타입 스코프 빈이기 때문에 scope 속성이 있어도 무시된다
- 내부 빈은 무명이다
- 스프링 util 스키마 엘리먼트를 <property>, <constructor-arg> 엘리먼트 내에서 바로 사용하는 것도 가능하다
3. depends-on 속성을 통해 빈 초기화 순서 제어하기
- <property>와 <constructor-arg>를 통해 명시작으로 빈 의존관계 설정
- 빈 의존 관계가 암시적(implicit)인 경우에는 depends-on 활용
- 스프링 컨테이너는 depends-on이 지정한 의존 관계에 들어 있는 빈이 depends-on 속성이 들어 있는 빈보다 더 먼저 초기화되도록 보장
3.2 암시적 의존 관계문제
- 암시적 의존 관계를 해결하는 방법
- XML파일에서 클래스 빈 정의 순서 변경
- <bean> 엘리먼트의 depends-on 속성을 사용해 의존관계 명시
- 여러 암시적 의존 관계
- 빈에 암시적 의존 관계가 여럿 존재한다면 depends-on 속성값으로 모든 의존 관계의 이름이나 id를 지정할 수 있다
- depends-on 속성과 빈 정의 상속
- 자식 빈 정의는 depends-on 속성을 상속하지 않는다
4. 싱글턴과 프로토타입 스코프 빈의 의존 관계
- 싱글턴 빈은 ApplicationContext 인스턴스가 생성될 때 생성된다
- 프로토타입 빈은 프로토 타입 빈을 얻기 위해 ApplicationContext의 getBean 메서드가 호출될 때마다 생성된다
4.1 싱글턴 빈의 의존 관계
- 싱글턴 빈의 <constructor-arg>에 프로토타입 빈을 지정하면
처음에 싱글턴 빈이 생성되기 전 프로토타입 빈을 생성한 후 그걸 주입 받아
싱글턴 빈은 생애주기 동안 같은 프로토타입 빈 인스턴스에 대한 참조를 유지한다
4.2 프로토타입 빈의 의존 관계
- 프로토타입 빈 X가 다른 프로토타입 빈 Y에 의존한다면, 스프링 컨테이너에 빈 X를 요청할 때마다 스프링 컨테이너는 X와 Y의 새 인스턴스를 생성한다
5. 싱글턴 빈 내부에서 새로운 프로토타입 빈 인스턴스 얻기
- 싱글턴 빈 클래스가 ApplicationContextAware 인터페이스를 구현한다
- 스프링 beans 스키마의 <lookup-method> 엘리먼트를 사용한다
- 스프링 beans 스키마의 <replace-method> 엘리먼트를 사용한다
5.1 ApplicationContextAware 인터페이스
- 내부 메서드가 실행되는 동안 ApplicationContext 인스턴스에 접근할 필요가 있는 빈은 스프링 ApplicationContextAware 인터페이스를 구현해야 한다
- setApplicationContext는 메서드를 구현하는 빈에 ApplcationContext 객체를 제공한다
- ApplicationContextAware 인터페이스틑 생애주기 인터페이스(lifecycle interfare)ek
- 생애주기 인터페이스는 빈의 생애주기에 적적한 시점에 스프링 컨테이너가 호출할 수 있는 콜백 메서드를 하나 이상 정의하는 인터페이스다
- 싱글턴 빈이 ApplicationContextAware를 구현한 경우 Application의 getBean 메서드를 통해 자신이 의존하는 프로토타입 스코프 빈을 명시적으로 얻어올 수 있다
- 단점 : 빈과 스프링 프레임워크를 결합시킴
- 결합시키는 것을 피하고 싶다면 beans 스키마가 제공하는 <lookup-method>나 <replace-method>엘리먼트를 이용한 메서드 주입 기법을 사용하자
5.2 <lookup-method> 엘리먼트
- 어떤 빈 클래스가 빈을 표현하는 타입을 반환하는 빈 검색 메서드(bean look method)를 정의한다면 <lookup-method> 엘리먼트를 사용해서 스프링에게 해당 메서드 구현을 제공하게 만들 수 있다
- 스프링이 제공하는 메서드 구현은 스프링 컨테이너에서 빈 인스턴스를 가져와 반환한다
- <lookup-method>
- bean 속성 : 검색할 빈의 이름을 지정
- name 속성 : 스프링이 구현을 제공할 메서드의 이름을 지정
- 빈 검색 메서드
- 빈 검색 메서드를 스프링이 오버라이드하기 때문에 메서드 안에서 어떤 동작을 수행하든 아무 동작도 하지 않는 빈 메서드로 만들든 관계 없다
- 빈 검색 메서드는 반드시 public이나 protected로 정의하여 어떤 인수도 받으면 안 된다
- 빈 클래스와 빈 검색 메서드는 final이 아니어야 한다
- <replaced-method> 엘리먼트
- 빈 클래스에 있는 아무 메서드나 다른 구현으로 대체할 수 있다
- 해당 엘리먼트에는 오버라이드 대상 메서드 정보와 대상 메서드를 오버라이드할(대체할) 메서드의 정보가 필요하다
- 오버라이드할 메서드는 스프링의 MethodReplacer 인터페이스를 구현하는 클래스가 제공한다
- MethodReplcer 인터페이스 구현 클래스
- ApplicationContext 객체를 사용하므로 ApplicationContextAware를 구현해야 함
- reimplement() : 메서드 오버라이드할 메서드를 표현
- 인수
- Object obj : 메서드를 오버라이드할 대상 객체
- Method method : reimplement 메서드가 오버라이드할 빈 메서드
- Object[] args : 오버라이드할 대상 메서드에 전달된 인수
- 인수
- <replaced-method> 엘리먼트
- name 속성 : 오버라이드하려는 메서드 이름
- replacer 속성 : MethodReplacer 인터페이스를 정의하려는 빈에 대한 참조를 지정
- name 속성이 지정하는 메서드는 replacer 속성이 참조하는 빈의 reimplement 메서드에 의해 오버라이드
5.3 빈 메서드의 유일성
- 오버라이드할 대상 메서드를 유일하게 식별하기 위해 <replace-method> 안에 <arg-type> 하위 엘리먼트를 사용해서 메서드 인수 타입을 지정할 수 있따
- <arg-type>에 전체 이름을 지정하는 대신 전체 이름의 부분 문자열을 지정해도 된다
6. 의존 관계 자동 연결
- 자동 연결 : 의존 관계를 스프링이 자동으로 해결하는 과정
6.1 byType
- bean 설정시 autowire 값을 byType 으로 설정하면 스프링은 타입을 바탕으로 빈 프로퍼티를 자동 연결한다
- 스프링이 프로퍼티 타입과 일치하지 않는 타입의 빈을 찾지 못할 경우
- 예외는 발생하지 않으며 빈 프로퍼티는 설정되지 않는다
- 스프링이 프로퍼티 타입과 일치하는 타입의 빈을 둘 이상 찾는 경우
- 자동 연결 기능보다는 <property> 엘리먼트를 이용해 빈 의존 관계 명시
- <bean> 엘리먼트의 primary 속성값을 true로 설정해서 해당 빈을 자동 연결시 제 1 후보(primary candidate)로 만든다
6.2 constructor
- bean 설정시 autowire 값을 constructor 로 설정하면 스프링은 타입을 바탕으로 빈의 생성자 인수를 자동 연결한다
- 스프링이 프로퍼티 타입과 일치하지 않는 타입의 빈을 찾지 못할 경우
- 예외는 발생하지 않으며 빈 프로퍼티는 설정되지 않는다
- 스프링이 프로퍼티 타입과 일치하는 타입의 빈을 둘 이상 찾는 경우
- 자동 연결 기능보다는 <property> 엘리먼트를 이용해 빈 의존 관계 명시
- <bean> 엘리먼트의 primary 속성값을 true로 설정해서 해당 빈을 자동 연결시 제 1 후보(primary candidate)로 만든다
6.3 byName
- bean 설정시 autowire 값을 byName 으로 설정하면 스프링은 이름을 가지고 빈의 프로퍼티를 자동 연결한다
6.4 default/no
- bean 설정시 autowire 값을 default나 no로 설정하면 해당 빈에 대한 자동 연결이 비활성화 된다
- <beans> 엘리먼트의 default-autowire 속성값을 바꾸면 디폴트 자동 연결 방식을 변경할 수 있다
6,5 빈을 자동 연결에 사용하지 못하게 막기
- 스프링 컨테이너의 기본 동작은 모든 빈을 자동 연결에 사용하는 것이다
- <bean> 엘리먼트의 autowire-candidate 속성을 false로 설정하면 해당 빈은 다른 빈을 자동 연결할 때 사용하지 못하게 막을 수 있다
- 자기 자신을 다른 빈의 자동 연결대상으로 제공하지 않는 빈이라 하더라도
스프링 자동 연결을 사용해 자신의 의존 관계를 자동으로 해결할 수 있다 - 어떤 그룹에 속하는 빈만 자동 연결에 사용하고 싶다면 <beans> 엘리먼트의 default-autowire-candidates 속성을 설정한다
- 해당 속성에는 빈 이름 패턴을 지정하여 이 패턴과 이름이 일치하는 빈을 자동 연결에 사용할 수 있도록 만든다
- 해당 패턴과 일치하지 않는 이름의 빈을 자동 연결에 사용하고 싶으면 <bean>의 autowire-candidate 속성을 true로 설정하면 된다
6.6 자동 연결의 한계
- 생성자 인수나 프로퍼티 타입이 단순한 자바 타입(int, long, boolean, String, Date 등)인 경우 자동 연결을 사용할 수 없다
autowire 속성값을 byType이나 constructor로 지정하면 배열이나 타입이 있는 켈렉션, 맵 등을 자동 연결할 수 있다 - 빈 의존 관계를 스프링이 자동으로 해결하기 때문에 애플리케이션의 전체 구조가 감춰진다
7. 요약
반응형
'study > 배워서 바로 쓰는 스프링 프레임워크' 카테고리의 다른 글
Chapter06. 애너테이션 기반 개발 (0) | 2021.07.26 |
---|---|
Chapter05. 빈과 빈 정의 커스텀화하기 (0) | 2021.07.12 |
Chapter03. 빈 설정 (0) | 2021.05.24 |
Chapter02. 스프링 프레임워크 기초 (0) | 2021.05.10 |
Chapter01. 스프링 프레임워크 소개 (0) | 2021.01.16 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 클린코드
- docker for mac
- IntelliJ
- clean code
- ddd
- Kubernetes
- gradle
- gasmask
- 스프링
- 스프링부트
- 코틀린
- cacheable
- 자바
- 도메인주도설계
- 도커
- JavaScript
- kotlin In Action
- QuickTimePlayer
- java
- k8s
- docker pull limit
- kotlin
- Spring
- linuxkit
- ImagePullBackOff
- 자바스크립트
- springboot
- 쿠버네티스
- back merge
- docker
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함