스프링을 사용하여 개발할 때에 @GetMapping, @PostMapping과 같은 어노테이션을 자주 사용하고 볼수 있었습니다. 저는 어떤 상황에서 어떤 어노테이션을 사용해야 하는지 알뿐 왜 사용해야 하고 어노테이션이 어떻게 만들어지는 지는 알지 못하고 사용하였습니다. 한번쯤 관련된 내용을 정리하고자 하여 글을 작성하게 되었습니다.
어노테이션의 등장
기존의 스프링 프레임워크는 IoC를 위하여 xml과 같은 파일을 이용하여 메타정보를 저장하고 이를 활용하여 프로그램을 제어하였습니다.
IoC : '제어의 역전'으로 프로그램의 객체 생성, 흐름, 소멸등을 프레임워크에게 권한을 주어 제어할 수 있도록 하는 것을 의미한다. 예를 들어 인터페이스 타입으로 선언한후 프레임워크가 런타임때 적절한 타깃의 타입을 객체로 생성하고 빈을 주입하는 것이 있다.
하지만 어노테이션은 따로 설정파일을 생성할 필요없이 자바 코드의 일부로 사용되며 이를 훨씬 더 편리하게 사용할 수 있도록 해주었습니다.
package com.myclass.myproject;
@Special
public class MyClass{
...
}
<x:special target="type" class="com.myclass.myproject.MyClass" />
어노테이션을 사용하면 위와 같이 @Special만 클래스위에 넣어주면 되는 반면 xml을 사용하면 아래와 같이 작성해야 합니다.
이로써 대부분의 스프링 코드는 DI를 위한 메타데이터를 어노테이션을 통해 구성하게 되었습니다.
주요 어노테이션
@Configuration : DI 설정정보를 담은 클래스를 만들때 사용되는 어노테이션
@ImportResource : XML의 설정정보를 가져오게 만들 수 있는 어노테이션. 레거쉬 XML이 있다면 유용하다.
@Bean : @Configuration이 붙은 DI 설정용 클래스에서 주로 사용되는 것으로, 메소드를 이용해서 빈 오브젝트의 생성과 의존관계 주입을 직접 자바 코드로 작성할 수 있게 해준다.
@Autowired : 필드의 타입과 같은 빈이 있으면 해당 빈을 필드에 자동으로 넣어주는 어노테이션.
@Resource : @Autowired와 유사하지만 필드의 타입을 기준으로 빈을 찾지 않고 필드 이름을 기준으로 빈을 찾는다.
@Component : 클래스를 자동 빈 등록해주는 어노테이션. 아이디는 클래스 네임의 앞 대문자를 소문자로 바꾼 것이 아이디로 등록된다. 아이디를 지정하고 싶다면 @Component("idName") 식으로 변경해주면 된다.
@Value : 프로퍼티 설정파일이나, yml 파일로 등록한 빈의 프로퍼티를 주입받을 때 사용한다. 치환자 역할을 하며 @Value안에 ${} 프로퍼티 이름을 적으면 이 어노테이션이 붙은 필드에 프로퍼티 값을 주입해준다.
Component를 사용하면 Bean 어노테이션을 사용할 일이 없을거 같지만 자바에서 제공해주는 클래스에 대해 빈을 적용하고 싶을 때는 자동 빈 등록을 할 방법이 없기에 @Bean 어노테이션과 같이 프로퍼티를 직접 설정해주는 과정이 필요합니다.
이외에도 다양한 어노테이션이 존재하니 기능 개발에 필요할때에 사용하면 유용할 거 같습니다!!
어노테이션 만들기
어노테이션은 @interface 키워드를 이용해 정의합니다. 예를 들어 @Component은 다음과 같이 정의되어 있습니다
public @interface Component {
...
}
이런식으로 저희도 어노테이션을 정의하고 사용할 수 있습니다. 만약 SNS 서비스에 접속하는 기능을 제공하는 빈을 AOP 포인트 컷으로 지정할 수 있도록 구분이 필요하다면 @SnsConnector 라는 어노테이션을 만들어 사용할 수 있을 것입니다.
@Component
public @interface SnsScanner {
...
}
이와 같이 정의 해준다면 자동 빈 등록 대상으로도 만들수 있습니다. 그렇다면 @SnsScanner가 부여된 클래스는 자동 빈 등록 대상이 됩니다. 이렇게 어노테이션의 정의의 부여된 어노테이션을 메타 어노테이션이라 합니다. @Component 메타 어노테이션이 적용된 대표적인 어노테이션으로 많이 사용되는 @Service, @Repository, @Controller와 같은 것들이 있습니다.
'Spring' 카테고리의 다른 글
싱글톤 (프로토타입과 스코프) (0) | 2024.04.18 |
---|---|
IoC 컨테이너란 무엇인가 (0) | 2024.04.16 |
트랜잭션 어노테이션 (@Transactional, 속성, 정책, 방법) (0) | 2024.03.28 |
Mockito 프레임워크 정리(TDD 작성, 테스트 코드 작성) (0) | 2024.03.22 |
JAVA Mail을 이용한 메일 발송 (0) | 2024.03.20 |