어노테이션(Annotation) 이란???

 

 

앞에서도 @Bean과 같은 어노테이션을 사용하여 포스팅 하기는 했지만 정확히 어노테이션이 어떤것인지에 대한 설명이 없었던것 같다..

 

Annotation 의 사전적 의미는 '주석'이다. 

자바에서는 // 또는 /**/ 과 같이 코드에서 실제 동작하지 않는 즉, 의미가 없는 부분을 주석이라고 한다.

어노테이션도 마찬가지이다. @를 사용한 주석이다. 어노테이션 자체로 어떠한 동작을 하는것은 아니지만 어노테이션을 써줌으로써 자바코드에 '주석'을 달아 특별한 의미를 부여한 것을 의미한다.

 

' 프로그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공, 코드에 정보를 추가하는 정형화된 방법.

출처: https://sjh836.tistory.com/8 [빨간색코딩]

 

 

자바코드에서 이러한 어노테이션을 이용하여 빈을 설정하는 방법에 대해서 알아보도록 하자.

 

 

 

 

 

 

 

1. @Required

 

Required 어노테이션은 반드시 주입해야 할 프로퍼티를 설정하는 어노테이션이다.

POJO클래스의 setter메소드에 @Required를 설정해주면 필드 데이터는 null이면 안되고, 무조건 setter를 이용하여 값을 주입해주어야 한다. (xml 파일에서 bean을 등록할 때 해당되는 내용)

 

그러나 ...

 

Spring 5.1 이후부터는 더이상 @Required를 쓰지 않는다..

반드시 입력해야 하는 값은 @Required 어노테이션을 사용하지 않고 생성자를 이용한 주입으로 해주어야 한다...

예를들어, 매개변수가 없는 생성자를 만들지 말고 매개변수로 data를 받는 생성자를 만들면 객체를 만들때 무조건 데이터를 넣어주어야 하기 때문에 이와 같이 사용한다.

 

 

 

어노테이션을 사용하기위해서는 다음과 같이 xml을 조금 수정해야한다.

xmls:context 속성을 추가해야하고, xsi:schemaLocation속성에 context를 추가해야 하며 

<context:annotation-config/> 태그를 추가해 주어야 한다.

외우기보다는 추가해야한다고 알아두면 되겠다..

 

 

req라는 이름의 bean을 추가해준다. 

 

 

 

TestBean9클래스의 setter에 다음과 같이 @Required어노테이션을 추가해 준 후 컴파일,실행 해보면

 

 

오류....  값을 무조껀 넣어주어야 하기 때문이다.

 

 

 

다음과 같이 property 속성을 이용하여  data1에 값을 넣어준 후 실행해보면

 

 

 

오류가 나지 않고 실행이 되는 것을 볼 수 있었다.

 

 

 

 

 

 

 

 

2. @Autowired

 

@Autowired는 타입기반 자동주입 설정이다. 

예를들어, POJO클래스의 setter메소드에 @Autowired 설정을 해주면 setter에 들어갈 매개변수의 타입과 같은 빈을 찾아서 자동으로 주입해준다. 

이 때, 설정파일(xml 또는 java파일)에는 자동주입이 될 빈이 (..당연하게도) 정의가 되어있어야 한다.

 

@Autowired는 변수에도 설정이 가능하다.

자동주입을 변수에 설정하는것으로 자동으로 setter메소드가 추가되어 setter메소드를 통해 주입을 하게 된다. 데이터를 꺼내올 getter만 정의하여 사용하면 되겠다. 

 

 

xml과 비슷하기 때문에 자바파일에서 빈 등록하는 예제만 해보겠다.

setter에 설정하는거말고 변수에 설정하는 예제로 해보자.

 

 

 

 

TestBean9을 재활용했다. DataBean2 타입의 data2를 추가하였는데, @Autowired로 설정해주고 getter 메소드만 만들어주었다. setter메소드는 어노테이션을 써줌으로서 자동으로 생성되기 때문이다. 

 

 

 

bean 설정파일에는 다음과 같이 빈을 등록해 주었다.

@Autowired는 타입 기반으로 자동주입을 해주기 때문에 bean의 이름은 상관이 없다. anything으로 설정했다.

그리고 auto라는 이름으로 TestBean9 형태인 빈을 만들었다.

 

 

 

그리고 다음과 같이 getBean한 후, 그 빈의 getData2해서 DataBean2형태의 빈이 자동으로 잘 주입되었는가 출력을 해보았다.

 

 

 

 

성-------------공

 

 

 

 

 

 

 

 

3. @Qualifier

 

@Qualifier 어노테이션은 @Autowired의 짝꿍이다. @Autowired 어노테이션은 타입기반으로 자동주입을 해주는 어노테이션임을 위의 예제에서 알아보았다. 만약 자동주입을 해야하는 빈중에서 같은 타입의 빈이 여러개 있으면 @Autowired를 써주어도 에러가 날 것이다.

 

이때 써주는 어노테이션이 @Qualifier이다. 타입이 같은 빈이 여러개 있으면 id로써 자동주입하는 빈을 찾아주는 어노테이션이다. 

@Qualifier("빈의 이름") 형태로 써준다.ㄴ

 

 

 

TestBean9 클래스에 DataBean2형태의 변수를 한개 더 선언해준다.

 

 

2번의 예제와 똑같이 구성되어 있는 예제파일에서 빈 설정파일이 위와 같이 되어 있다고 가정하자.

@Autowired 어노테이션은 타입기반 자동주입이기 때문에 이름이 상관없다고 했었다. 그런데 저렇게 같은 타입의 빈이 2개 이상이 되면 어떤 빈을 넣어야할지 모르기 때문에 에러가 발생한다.

 

 

 

@Qualifier 어노테이션을 이용해서 빈의 id를 설정해주었다.

 

 

 

 

성---------------------공

 

 

 

 

 

 

4. 생성자를 통한 주입

 

xml에서 bean을 설정할때 사용하는 방법에 대애서 먼저 알아보도록 하겠다.

1번 예제에서 처럼 xml파일에 어노테이션을 이용한 빈을 등록하기 위해서는 <context:annotation-config/> 을 포함하여 xml파일의 속성을 조금 바꾸어 주어야 한다고 설명하였다.

xml파일에서 생성자를 통하여 빈을 자동주입하면 참조변수 타입은 자동으로 주입되고, 기본 자료형 및 문자열은 사용자가 설정해주어야 한다.

 

 

 

 

TestBean10을 다음과 같이 구성하였다. 생성자에는 매개변수로 DataBean와 DataBean2 형태인 변수를 받는다.

 

 

 

 

xml 파일에 다음과 같이 bean을 등록해준다.

id값이 없는 DataBean형의 bean과 DataBean2형의 bean이 등록이 되어있고, 

TestBean10형의 bean이 autoCon이라는 id를 가지고 등록되어 있다. autoCon에는 따로 아무 설정도 해놓지 않았다.

 

이렇게 xml파일을 구성하면 <context:annotation-config/> 설정덕분에 생성자의 타입을 보고 일치하는 타입을 자동으로 주입해준다. 

 

 

 

 

 

data1과 data2는 주입해준게 없으니까 아무값도 들어가지 않고, data3과 data4는 객체가 자동으로 주입되어 실행되는 모습을 볼 수 있었다.

 

data1과 data2를 객체가 생성될 때 설정해주려면 @Value태그를 쓰면 된다.

 

 

 

 

 

다음과 같이 생성자에 @Value 어노테이션을 넣어 직접 주입해준 후 실행해보면 

 

 

 

이와 같은 결과를 얻을 수 있다.

'JAVA > Spring' 카테고리의 다른 글

@Component 어노테이션  (0) 2020.04.15
JSR-250 어노테이션  (0) 2020.04.11
Java를 이용한 Bean 객체 주입  (0) 2020.04.10
Java코드를 활용한 Bean 등록  (0) 2020.04.10
자동 주입  (0) 2020.04.10

+ Recent posts