[인강정리] 07. DI 애플리케이션 작성(4) - Bean 등록 메타정보 구성 전략

[인강정리] 07. DI 애플리케이션 작성(4) - Bean 등록 메타정보 구성 전략

1. 빈 관리 전략

1-1. XML 단독 사용

- 모든 빈을 명시적으로 XMl에 등록하는 방법.

- 생성되는 모든 빈을 XMl에서 확인할 수 있다는 장점.

- 빈의 개수가 많아지면 어ㅓ지러워짐.

- 여러 개발자가 같은 설정파일을 공유해서 개발하다보면 설정을 동시에 수정하다가 충돌이 일어나기도 함.

- DI에 필요한 적절한 setter 메서드 또는 constructor가 코드 내에 반드시 존재해야 함.

- 개발 중에는 어노테이션 설정방법을 사용하는 것이 유리함.

- 운영 중에는 관리의 편의성을 위해 XML설정으로 변경하는 전략을 취할 수도 있음.

1-2. XML과 Bean Scanning의 혼용

- Bean으로 사용될 클래스에 어노테이션을 부여해주면 자동으로 그런 클래스를 찾아서 Bean으로 등록해줌.(빈 스캐닝)

- 어플리케이션에 등록될 Bean이 어떤 것들이 있고, Bean들 간의 의존관계가 어떻게 되는지를 한눈에 파악할 수 없는 것은 단점임.

2. 빈 등록 및 의존관계 설정 어노테이션

2-1 빈 등록 어노테이션

1) @Component

- 컴포넌트를 나타내는 일반적인 스테레오 타입으로 태그와 동일한 역할

2) @Repository

- Persistence 레이어, 영속성을 가지는 속성(파일, 데이터베이스)을 가진 클래스

3) @Service

- 서비스 레이어, 비즈니스 로직을 가진 클래스

4) @Controller

- 프레젠테이션 레이어, 웹 어플리케이션에서 웹 요청과 응답을 처리하는 클래스.

*2), 3), 4)는 1)을 구체화 한 것이다. 1)이 더 큰 개념이다.

2-2 빈 의존관계 주입 어노테이션

1) @Autowired

- 정밀한 의존관계 주입이 필요한 경우에 유용함.

- @Autowired는 프로퍼티, setter 메서드, 생성자, 일반메서드에 적용가능.

- 의존하는 객체를 주입할 때 주로 Type을 이용함.

- , 와 동일한 역할임.

2) @Resource

- 마찬가지로 자동 의존 주입 어노테이션.

- @Autowired는 타입으로, @Resource는 이름으로 연결한다는 차이가 있다.

- , setter 메서드에 적용 가능.

- 의존 객체를 주입시 Name을 이용.

3) @Value

- 단순한 값을 주입할 때 사용되는 어노테이션.

- @Value("Spring")은 와 동일한 역할

4) @Qualifier

- @Autowired 어노테이션과 같이 사용됨.

- @Autowired는 Type으로 찾아서 주입하기 때문에 동일 타입의 Bean 객체가 여러 개 존재하는 경우 특정 Bean을 찾기 위해 @Qualifier를 같이 사용함.

2-3 Component Scan을 지원하는 태그

- @Component를 통해 자동으로 빈을 등록하고 @Autowired로 의존관계를 주입받는 어노테이션을 클래스에서 선언하여 사용했을 경우, 해당 클래스가 위치한 특정 패키지를 Scan하기 위한 설정을 XML에 넣어주어야 함.

-

- 태그와 태그를 같이 사용하면 자동 스캔 대상에 포함시킬 클래스와 포함시키지 않을 클래스를 분리할 수 있다.

3. 어노테이션을 사용한 POJO 클래스 작성.

3-1 StringPrinter.java 어노테이션을 이용해 수정

package myspring.di.annot; import org.springframework.stereotype.Component; @Component("stringPrinter") public class StringPrinter implements Printer { private StringBuffer buffer = new StringBuffer(); @Override public void print(String message) { buffer.append(message); } public String toString() { return buffer.toString(); } }

3-2 ConsolePrinter.java 수정

package myspring.di.annot; import org.springframework.stereotype.Component; @Component("consolePrinter") public class ConsolePrinter implements Printer { @Override public void print(String message) { System.out.println(message); } }

3-3 Hello.java 수정

package myspring.di.annot; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class Hello { @Value("Spring") private String name; @Autowired @Qualifier("stringPrinter") private Printer printer; public Hello() {} public Hello(String name, Printer printer) { this.name = name; this.printer = printer; } }

3-4 빈 설정 XML --> annot.xml 작성

3-5 DI 테스트 클라이언트 수정 (HelloBeanAnnotTest.java)

** junit, spring-test가 제대로 import되지 않는 문제가 있었는데 maven central repo에서 module로 pom에 추가했더니 안되는 거였음. RELEASE 버전으로 추가를 해줘야 아무 문제가 없이 작동하는 것을 확인하였음.

package myspring.di.annot; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import static org.junit.Assert.*; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:/") public class HelloBeanAnnotTest { @Autowired ApplicationContext context; public void test() { Hello hello = context.getBean("hello", Hello.class); assertEquals("Hello Spring", hello.sayHello()); } }

4. Property 파일을 이용한 설정 방법

4-1. Properties 파일 및 Bean 설정파일 작성

value.properties

myname=Spring myprinter=printer value1=AOP value2=Spring value3=DI printer1=stringPrinter printer2=consolePrinter

Hello.java 수정

package myspring.di.annot; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class Hello { @Value("${myname}") private String name; /* * @Autowired * * @Qualifier("stringPrinter") */ @Resource(name="${printer1}") private Printer printer; public String sayHello() { return "Hello " + name; } public void print() { this.printer.print(sayHello()); } }

annot.xml 수정

from http://purewater-practice-diary.tistory.com/62 by ccl(A) rewrite - 2021-12-25 00:27:02