2020. 7. 24. 02:30ㆍSpring/Spring
1. 어노테이션 설정
1) 어노테이션 사용 이유
xml 파일 설정이 중요한 만큼 부담되 있고 프레임워크 사용을 꺼리기도하기 때문에 대부분 어노테이션을 이용한 설정을 선호한다.
2) Context 네임스페이스 추가
p 네임스페이스 추가할 때와 동일하게 간단하게 추가할 수 있다.
/src/main/java/
context-polymorphism.xml
3) Component 스캔 설정
xml 파일에 사용할 객체를 <bean>에 등록하지 않고 자동으로 생성하기 위해서 <context:component-scan> 엘리먼트를 정의해주어야 한다. 해당 엘리먼트의 base-package 속성값에 설정한 패키지명으로 시작하는 모든 패키지를 스캔 대상으로 간주하며, 스프링 컨테이너에서 클래스들을 스캔하여 @Component 어노테이션이 설정된 클래스들을 자동으로 객체 생성한다.
/src/main/java/
context-polymorphism.xml
4) @Component 어노테이션
모든 <bean> 설정 및 @Component 어노테이션 설정에는 해당 클래스에 기본 생성자가 존재해야 컨테이너가 객체를 생성할 수 있다. 해당 어노테이션을 사용할 경우 클라이언트에서 객체를 요청할 수 없으며, 요청하기 위해서는 사용할 아이디나 이름이 반드시 설정되어 있어야 한다. 설정이 안되어있을 경우 컨테이너가 자동으로 이름을 설정해준다.
/src/main/java/
context-polymorphism.xml, LgTV.java, TVUser.java
※ @Component의 id값 설정은 클라이언트에서 객체를 사용하기 위해 사용되는 속성이다.
2. 의존성 주입 설정
1) @Autowired
@Autowired 어노테이션은 생성자, 메서드, 멤버변수 위에 어디에도 사용이 가능하지만 대부분 멤버변수 위에 선언한다. 스프링 컨테이너가 @Autowired 어노테이션을 확인하는 순간 변수의 타입을 체크하고 객체가 메모리에 존재하는지 확인 후 객체를 변수에 주입한다. 객체가 메모리에 없다면 예외(NoSuchBeanException)를 발생시킨다.
LgTV 클래스에서 SonySpeaker를 사용하기 위해서는 SonySpeaker 객체가 존재해야하기 때문에 어노테이션을 선언한다.
/src/main/java/
SonySpeaker.java, LgTV.java
2) @Qualifier
Speaker 타입의 객체가 두 개 이상이고 모두 메모리에 생성되어 있는 상황일 경우, 어떤 객체를 의존성 주입할지 모르는 문제가 발생한다. 이 때 @Qualifier 어노테이션을 통해 의존성 주입될 객체의 아이디나 이름을 지정할 수 있다.
/src/main/java/
SonySpeaker.java, AppleSpeaker.java, LgTV.java
3) @Resource
@Autowired 어노테이션의 경우 객체의 타입으로 의존성 주입을 처리하지만, @Resource 어노테이션은 name 속성을 이용하여 객체의 이름을 지정하여 의존성 주입을 처리한다. (@Injection 어노테이션도 동일한 기능을 수행한다.)
/src/main/java/
LgTV.java
3. 어노테이션과 xml
1) 방식의 장단점
xml 방식은 자바 소스 변경 없이 xml 설정 파일만을 변경하여 실행되어 유지보수가 편하지만 부담도 동반한다. 반면 어노테이션 기반 설정은 의존 관계에 대한 정보가 자바 소스에 명시되어 있어서 편하지만 의존성 주입 시 객체의 이름이 자바 소스에 명시되어야하기 때문에 자바 소스를 수정해야하는 문제가 있다. xml과 어노테이션 방식의 단점을 해결하기 위해 두 개의 장점을 조합하여 해결할 수 있다.
2) 조합을 위한 설정
객체를 자동 생성해주는 Speaker 클래스의 @Component 어노테이션을 제거한다.
/src/main/java/
SonySpeaker.java, AppleSpeaker.java, LgTV.java
3) xml 파일 설정
<bean> 등록을 하여 @Autowired 어노테이션에 의해 SonySpeaker 객체가 의존성 주입되며, AppleSpeaker로 변경을 할 경우 xml 설정 파일만을 수정하여 변경이 가능하다.
/src/main/java/
context-polymorphism.xml
※ 변경될 객체는 xml 설정 파일에서, 변경이 되지 않는 객체는 어노테이션으로 처리한다.
어노테이션 | 위치 | 의미 |
@Service | OOOServiceImpl | 비즈니스 로직을 처리하는 Service 클래스 |
@Repository | OOODAO | 데이터베이스 연동을 처리하는 DAO 클래스 |
@Controller | OOOController | 사용자 요청을 제어하는 Controller 클래스 |
[참고] 스프링 퀵 스타트
[참고] yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/
'Spring > Spring' 카테고리의 다른 글
[Spring] 사용자 서비스 구현 (0) | 2020.07.27 |
---|---|
[Spring] 게시판 서비스 구현 (0) | 2020.07.26 |
[Spring] 컬렉션 객체 설정 (0) | 2020.07.24 |
[Spring] 의존성 관리 (0) | 2020.07.23 |