티스토리 뷰

반응형

[배워서 바로 쓰는 스프링 프레임워크 - 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. 요약

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함