Spring ㅡㅍㅊ annotation 설정 방법

특징 ?

- Spring Web MVC Framework는 JAVA1.5부터 Annotation을 지원합니다.

- xml설정이 너무 길어짐에 따라 그 대안으로 나타났다.

- 기본적으로는 활성화되지 않기 때문에 xml에서 확성화 작업이 필요하다.

장점 ?

- 설정이 간편해 짐, view 페이지와 객체 또는 메서드의 맵핑이 명확해 짐.

Annotation을 사용하기 위해서는 설정이 필요합니다.

3가지 방법이 있습니다.

1) CommonAnnotationBeanPostProcessor에 클래스 설정파일에 빈객체로 등록하여 어노테이션으로 사용

2) <context:annotation-config/> 태그 사용 : 이미 등록된 빈들의 어노테이션을 활성화

3) <context:component-scan package="***"/> :

특정 패키지 안의 클래스들을 스캔하고, Annotation을 확인 후 bean 인스턴스를 생성

- 스테레오타입의 어노테이션을 자동으로 등록 한다 ( Spring Framework가 관리해 준다.)

기본 Annotation의 종류 

- org.springframework.stereotype

@Compoenet : @Controller,@Service,@Repository 의 최상위 annotation이다.

@Controller : Spring MVC에서 Controller를 인식 시켜준다.

@Service : Business 클래스에서 사용, 로직을 사용한다.

@Repository : 일반적 Data Access Object에서 사용, DB Exception을 DataAccessExceiption

1. @Component

패키지 : org.springframework.stereotype

버   전 : spring 2.5

직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션.

2. @Autowired

패키지 : org.springframework.beans.factory.annotation

버   전 : spring2.5

Spring의 "의존관계"를 자동으로 설정할때 사용한다.

- 해당 타입의 bena이 존재 하지 않거나, 2개 이상일 경우 예외 발생 ( 해결방법 : @Qualifer사용 )

DI 주입 형태 3가지

1. Construcotr : 필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고 그 생성자를 통해 의존성을 주입

(스프링 4.3버전 이후 권장)

2. Field :Bean으로 등록된 객체를 사용하고자 하는 클래스에 Field로 선언한 뒤 @Autowired키워드를 붙여주면 자동으로 주입된다.

3. Setter : 의존성을 입렫받는 setter 메서드를 만들고 이를 통해 의존성을 주입한다.

3. @Qualifer("name1")

@Autowired 했을 때 동일 타입을 가진 bean객체가 두개 있을 때 사용합니다.

예) 

private A obj

<bean id="obj1" class="a.b.c.A"><qualifier value="name1"></bean>

<bean id="obj2" class="a.b.c.A"></bean>

4. @Required

패키지 : org.springframework.beans.factory.annotation

버   전 : spring 2.5

필수값을 입력하고 싶을 때 사용한다.

bean을 만들어 낼때 필수로 입력해야 되는 메서드 앞에서 @Required라고 선언하게 되면

bean을 사용할 때 반드시 입력해야 한다.

5. @Repository

패키지 : org.springframework.stereotype

버   전 : spring2.5

DAO에 사용되고, DB Exception을 DataAccessException처리한다.

6. @Service

Business클래스에서(로직) 사용한다 

Controller -> Service -> Repository -> DataBase

   분기          DAO조합     기능          DataBase

7. @Resource

JAVA1.6 / JEE5 버전에 추가 되었다.

애플리케이션에서 필요로 하는 자원을 자동으로 연결 할때 사용,

name속성 사용해서 bean 객체 이름을 연결한다.

@Resource(name="TestDtoDao")

[Spring] 애노테이션을 이용한 빈 설정 방법 정리

빈 설정을 하기 위해 사용되는 스프링 애노테이션 @Required, @Autowired, @Qualifier, @Value과 JSR-250 애노테이션 @PostConstruct, @PreDestroy, @Resource에 대해 알아보자

이 애노테이션들을 사용해 기존에 XML 빈 설정 파일에 모두 작성하던 빈 설정을 빈 클래스에 직접 설정할 수 있다.

XML 설정에 애노테이션 빈 설정을 사용하기 위한 코드 추가

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="//www.springframework.org/schema/beans" xmlns:context="//www.springframework.org/schema/context" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd //www.springframework.org/schema/context //www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> </beans>

context 네임 스페이스와 <context:annotation-config/> 코드를 추가한다.

이렇게 설정하면 빈 설정을 XML 파일이 아닌 빈 클래스의 애노테이션을 검색해 반영한다.

@Required

- setter에 붙여 반드시 주입해야하는 프로퍼티로 설정하는 애노테이션
- Spring 5.1 버전 부터Deprecated 되었다. ➡️ 반드시 주입해야 할 프로퍼티는 생성자 주입을 이용한다.
- 스프링 5.1이상을 사용하거나 자바 파일로 bean을 등록했을 경우 무시된다.

예제 코드

public class TestBean1 { private int data1; public int getData1() { return data1; } // 필수 주입 프로퍼티 // 스프링 5.1이상을 사용하거나 자바 파일로 bean을 등록했을 경우 무시된다 @Required public void setData1(int data1) { this.data1 = data1; } } @Configuration public class BeanConfigClass { @Bean public TestBean1 testBean1() { return new TestBean1(); } }

@Autowired

- 객체 타입을 통해 빈 객체를 자동으로 주입한다.
- 필드, 생성자, setter에 붙일 수 있다.
- 필드, setter에 붙여서 사용할 경우 반드시 기본 생성자가 정의되어 있어야 한다.
- 필드에 붙이면 setter를 통해 주입되며 setter가 없을 경우 컴파일 과정에서 자동으로 추가된다.

예제 자바 코드

public class TestBean1 { // 필드 자동 주입 // 자동으로 setter 메서드가 추가되어 setter 메서드를 통해 주입된다. @Autowired private DataBean1 data3; } public class DataBean1 { }

설정 - 자바

@Configuration public class BeanConfigClass { @Bean public TestBean1 testBean1() { return new TestBean1(); } @Bean public DataBean1 dataBean1() { return new DataBean1(); } }

설정 - XML

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="//www.springframework.org/schema/beans" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns:context="//www.springframework.org/schema/context" xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd //www.springframework.org/schema/context //www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id='testBean1' class='com.atoz_develop.beans.TestBean1'/> <bean class='com.atoz_develop.beans.DataBean1'/> </beans>

@Qualifier

- @Autowired와 함께 사용한다.
- @Autowired를 통한 자동 주입 시 같은 타입의 빈이 여러 개 정의되어 있으면 @Qualifier에 설정되어 있는 빈을 찾아 주입한다.

예제 자바 코드

public class TestBean1 { @Autowired @Qualifier("obj4") private DataBean2 data4; @Autowired @Qualifier("obj5") private DataBean2 data5; } public class DataBean2 { }

설정 - 자바

@Configuration public class BeanConfigClass { @Bean public TestBean1 testBean1() { return new TestBean1(); } @Bean public DataBean2 obj4() { return new DataBean2(); } @Bean public DataBean2 obj5() { return new DataBean2(); } }

설정 - XML

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="//www.springframework.org/schema/beans" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns:context="//www.springframework.org/schema/context" xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd //www.springframework.org/schema/context //www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id='testBean1' class='com.atoz_develop.beans.TestBean1'/> <bean id='obj4' class='com.atoz_develop.beans.DataBean2'/> <bean id='obj5' class='com.atoz_develop.beans.DataBean2'/> </beans>

@Value

- 생성자 주입 시 자동으로 주입되지 않는 기본 자료형과 문자열의 값을 설정한다.

예제 자바 코드

public class TestBean2 { private int data1; private String data2; private DataBean3 data3; private DataBean4 data4; public TestBean2(@Value("100") int data1, @Value("문자열") String data2, DataBean3 data3, DataBean4 data4) { this.data1 = data1; this.data2 = data2; this.data3 = data3; this.data4 = data4; } } public class DataBean3 { } public class DataBean4 { }

설정 - XML

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="//www.springframework.org/schema/beans" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns:context="//www.springframework.org/schema/context" xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd //www.springframework.org/schema/context //www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id='testBean2' class='com.atoz_develop.beans.TestBean2'/> <bean class='com.atoz_develop.beans.DataBean3'/> <bean class='com.atoz_develop.beans.DataBean4'/> </beans>

XML 설정에서 <context:annotation-config/>를 추가하면 빈 클래스에 주입 설정을 따로 하지 않아도 생성자 주입이 자동으로 이루어진다.

이때 기본 타입과 문자열 타입의 필드는 자동으로 주입되지 않으며 @Value를 사용해서 값을 설정할 수 있다.

자바 애노테이션 설정(@Configuration)을 사용할때는 이 방법이 적용되지 않는다.

JSR-250 애노테이션 의존성 추가

<!-- //mvnrepository.com/artifact/javax.annotation/javax.annotation-api --> <dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency>

@PostConstruct

- @Bean(initMethod="...") 대신 사용
- 생성자 호출 후 자동으로 호출될 메소드에 붙여서 사용

@Configuration 클래스에서 @Bean의 initMethod 속성에 빈이 생성될때 호출될 메소드를 지정하는 대신 빈의 클래스의 메소드에 @PostConstruct를 붙여 직접 설정할 수 있다.

예제 코드

public class TestBean2 { // 생성자 호출 이후 자동으로 호출 @PostConstruct public void init2() { System.out.println("TestBean2의 init 메서드"); } }

설정

@Configuration public class BeanConfigClass { @Bean public TestBean2 obj2() { return new TestBean2(); } }

@PreDestroy

- @Bean(destroyMethod="...") 대신 사용
- 객체 소멸 전 자동으로 호출될 메소드에 붙여서 사용

@Configuration 클래스에서 @Bean의 destroyMethod 속성에 빈이 생성될때 호출될 메소드를 지정하는 대신 빈의 클래스의 메소드에 @PostConstruct를 붙여 직접 설정할 수 있다.

예제 코드

public class TestBean2 { // 객체가 소멸되기 전에 자동으로 호출 @PreDestroy public void destroy2() { System.out.println("TestBean2의 destroy 메서드"); } }

설정

@Configuration public class BeanConfigClass { @Bean public TestBean2 obj2() { return new TestBean2(); } }

@Resource

- 빈 이름(id)을 통해 자동 주입
- @Autowired + @Qualifier와 유사
- 필드명과 동일한 이름의 빈을 주입
- 필드명과 빈 이름이 다르면 @Resource(name=“…”)

👉 필드명과 빈 이름(id)가 동일한 경우

예제 코드

public class TestBean5 { // 변수의 이름과 동일한 이름의 Bean이 주입된다. @Resource private DataBean1 data1; @Resource private DataBean2 data2; }

설정

@Configuration public class BeanConfigClass { @Bean public DataBean1 data1() { return new DataBean1(); } @Bean public DataBean2 data2() { return new DataBean2(); } @Bean public TestBean5 obj5() { return new TestBean5(); } }

👉 필드명과 빈 이름(id)가 다른 경우 - name 속성 사용

예제 코드

public class TestBean6 { @Resource(name = "data1") private DataBean1 data100; @Resource(name = "data2") private DataBean2 data200; }

설정

@Configuration public class BeanConfigClass { @Bean public DataBean1 data1() { return new DataBean1(); } @Bean public DataBean2 data2() { return new DataBean2(); } @Bean public TestBean6 obj6() { return new TestBean6(); } }

TestBean6의 DataBean1타입 필드명이 각각 data100, data200이고 빈 등록은 data1, data2로 되어있으므로 그냥 @Resource를 붙이면 자동 주입이 이루어지지 않는다.

이런 경우 @Resource의 name 속성을 사용해서 빈 이름을 직접 지정한다.

Java의 annotation-api는 스프링을 위한 라이브러리가 아니라 여러가지 자바 어플리케이션 개발에 사용할 수 있는 라이브러리이다.

스프링에서도 @PostConstruct, @PreDestroy, @Resource와 같은 애노테이션을 지원하므로 편리하게 사용할 수 있다.

Toplist

최신 우편물

태그