ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링퀵스타트 어노테이션 기반 설정
    Spring/Spring Quick Start 2019. 5. 21. 13:05

    |어노테이션 설정 기초

    스프링 프레임워크 역시 xml 설정이 매우 중요하다. 그만큼 xml 파일의 과도한 설정에 대한 부담이 크며, 이로 인해 프레임 워크 사용을 꺼리기도 한다. 따라서, 어노테이션을 이용한 설정을 지원하고있다.

     

    1. context 네임스페이스 추가

    스프링 설정 파일의 루트 엘리먼트인 <beans>에 Context 관련 네임스페이스와 스키마 문서의 위치를 등록해야한다. 이는 p 네임스페이스 추가했을 때 처럼 Namespaces 탭을 클릭하고 context 항목만 체크하면 쉽게 추가할 수 있다.

     

    2. 컴포넌트 스캔(component-scan) 설정

    스프링 설정 파일에 애플리케이션에서 사용할 객체들을 <bean>등록하지않고 자동으로 생성하려면 컴포넌트 스캔이라는 엘리먼트를 정의해야한다. 이 설정을 추가하면 스프링 컨테이너는 클래스 패스에 있는 클래스들을 스캔하여 @component가 설정된 클래스들을 자동으로 객체 생성한다.

     

    3. @Component

    @Component만 클래스 선언부 위에 설정하면 끝난다. 이제 스프링 설정파일에 클래스들을 일일이 <bean> 엘리먼트로 등록할 필요가 없다.

     

    4. id/name 속성 미지정 시 이름 규칙

    컨테이너가 보통 자동으로 이름을 설정해준다. 

    이때 이름 규칙은 클래스 이름의 첫글자를 소문자로 변경하기만 하면된다. 예를들어 LgTV 개체를 요청하려면 lgTV라는 이름을 사용하면된다.

     

    |의존성주입설정

    1. 의존성 주입 어노테이션

    스프링에서 의존성 주입을 지원하는 어노테이션으로는 @Autowired, @Inject, @Qualifier, @Resource가 있다.

    어노테이션 설명
    @Autowired

    주로 변수 위에 설정하여 해당 타입의 객체를 찾아서 자동으로 할당한다.

    org.springframework.beans.factory.annotation.Autowired

    @Qualifier

    특정 객체의 이름을 이용하여 의존성 주입할 때 사용한다.

    org.springframework.beans.factory.annotation.Qualifier

    @Inject

    @Autowired와 동일한 기능을 제공한다.

    javax.annotation.Resource

    @Resource

    @Autowired와 @Qualifier의 기능을 결합한 어노테이션이다.

    javax.inject.Inject

    이 중에서 @Autowired와 @Qualifier는 스프링에서 제공하지만 나머지 어노테이션은 스프링에서 제공하지 않는다.

     

    2. Autowired

    @Autowired는 생성자나 메소드, 멤버변수 위에 모두 사용할 수 있다. 어디에 사용하든 결과가 같아서 상관없지만, 대부분 멤버변수 위에 선언하여 사용한다.

     

    만약 @Autowired가 붙은 객체가 메모리에 없다면 컨테이너가 NoSuchBeanDefinitionException을 발생시킨다. 이 의미는 @Autowired 대상 객체가 메모리에 존재하지 않느다는 의미다.

     

    3.@Qualifier

    문제는 의존성 주입 대상이 되는 Speaker 타입의 객체가 두 개 이상일 때 발생한다. 만약 SonySpeaker와 AppleSpeaker 객체가 모두 메모리에 생성되어 있는 상황이라면 컨테이너는 어떤 객체를 할당할지 스스로 판단할 수 없어서 에러가 발생한다. 이런 상황을 테스트하기 위해서 AppleSpeaker 클래스에도 @Component를 선언한다.

    이럴 경우 에러가 발생하는데 이를 해결하기 위해서 @Qualifier("이름")을 선언해주면 해결이 된다.

     

    4.@Resource

    @Autowired는 변수의 타입을 기준으로 객체를 검색하여 의존성 주입을 처리하지만, @Resource는 객체의 일므을 이용하여 의존성 주입을 처리한다. @Resource는 name속성을 사용할 수 있어서 스프링 컨테이너가 해당 이름으로 생성된 객체를 검색하여 의존성 주입을 처리한다. AppleSpeaker와 SonySpeaker에 각각 @Component("apple") @Component("sony")를 추가해주면 잘 작동한다.

     

    5. 어노테이션과 XML 설정 병행하여 사용

    스프링으로 의존성 주입을 처리할 때 XML설정과 어노테이션 설정은 장단점이 서로 상충한다. 앞에서 살펴본 대로 XML방식은 자바 소스를 수정하지 않고 XML 파일의 설정만 변경하면 실행되는 Speaker를 교체할 수 있어서 유지보수가 편하다. 하지만 XML 설정에 대한 부담 역시 존재한다. 그리고 자바 소스에 의존관계와 어떤 메타데이터도 없으므로  XML 설정을 해석해야만 무슨 객체가 의존성 주입되는지를 확인할 수 있다.

     

    반면에 어노테이션 기반 설정은 XML 설정 부담이 없고 의존관계에 대한 정보가 자바 소스에 들어있어서 사용하기는 편하다. 하지만 의존성 주입할 객체의 이름이 자바소스에 명시되어야하므로 자바 소스를 수정하지 않고는 Speaker를 교체할 수 없다는 문제점이 생긴다. 이런 문제점을 서로의 장점으로 조합하는것으로 해결할 수 있다.

     

    LgTV에서는 @Autowired어노테이션만 설정하고 Speaker에는 @Component를 삭제하고 XML에 bean등록한다.

    이렇게 하면, 자동으로 검색하는데 xml파일에서 sony로 할지 apple로 할지만 수정하면 가장 쉽고 편하게 유지보수 할수 있다.

     

    따라서, 병행해서 사용하기 위해서는 변경되지 않는 객체는 어노테이션을 설정해서 사용하고, 변경될 가능성이 있는 객체는 XML 설정을 사용한다. 

     

    우리가 직접 개발한 클래스는 어노테이션이나 XML 설정을 취향대로 사용할 수 있다. 하지만 라이브러리 형태로 제공되는 클래스는 반드시 XML 설정을 통해서만 사용할 수 있다. 따라서 아파치(Apache)에서 제공하는 BasicDataSource 클래스를 사용하여 DB연동을 처리한다면 'commons-dbcp-1.4.jar'파일에 있는 BasicDataSource 클래스에 관련된 어노테이션을 추가할 수는 없다. 이를 사용하기 위해서 설정파일에 <bean>등록을 해야만 한다.

     

    6. 추가 어노테이션

    어노테이션 위치 의미
    @Service XXXServiceImpl 비즈니스 로직을 처리하는 Service 클래스
    @Repository XXXDAO 데이터베이스 연동을 처리하는 DAO 클래스
    @Controller XXXController 사용자 요청을 제어하는 Controller 서비스

     

    댓글

© 2018 T-Story. All right reserved.