1) 어노테이션(Annotation)이란?
Annotation(@)은 사전적 의미로 주석이라는 뜻이다.
자바에서 어노테이션은 코드 사이에 주석처럼 사용되고 특별한 의미와 기능을 수행하도록 하는 기술이다. 어노테이션을 사용하여 코드를 작성하는 개발자가 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있다. 어노테이션은 JDK 1.5 버전 이상에서 사용 가능하고 자바 소스 코드 사이에 @기호를 앞에 붙여서 사용한다.
2) 어노테이션(Annotation)의 용도
- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보 제공
- 소프트웨어 개발툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공
- 실행(런타임) 시 특정 기능을 실행하도록 정보를 제공
어노테이션을 사용하는 순서
1) 어노테이션을 정의
2) 클래스에 어노테이션을 배치
3) 코드가 실행되는 중 Reflection을 이용하여 추가 정보를 획득하여 기능을 실시
Reflection은 프로그램이 실행 중에 자신의 구조와 동작을 검사하고, 조사하고, 수정하는 것.
3) 어노테이션(Annotation)의 종류
@Override
- 작성한 메서드가 오버라이드 되었다는 의미
@Deprecated
- 해당 메서드를 더 이상 사용되지 않음을 표시할 때 사용
- 만약 사용할 경우 컴파일 경고 발생
@SuppressWarnings
- 선언한 곳의 컴파일 경고를 무시하도록 함
@SafeVarargs
- Java 7부터 지원하고, Generic 같은 가변 인자의 매개변수를 사용할 때의 경고를 무시한다.
@FunctionalInterface
- Java8부터 지원하고, 함수형 인터페이스를 지정하는 어노테이션
@ComponentScan
- @Component와 @Service @Repository @Controller @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean 등록을 해주는 어노테이션이다. @Component Annotation이 있는 클래스에 대하여 bean 인스턴스를 생성한다.
xml에 bean을 직접 등록하는 방법과 Annotation을 붙여서 등록하는 두 가지 방법이 있다.
스프링에서 @Component로 쓰지 않고 @Repository @Repository @Controller @Configuration 등을 사용하는 이유는 다른 클래스의 메서드에서 발생할 수 있는 문제점을 피하거나, 가독성 측면에서도 해당 어노테이션을 갖는 클래스가 무엇을 하는지 한 번에 할 수 있기 때문에 사용한다. 자동으로 등록되는 Bean의 이름은 클래스의 첫 문자가 소문자로 바뀐 이름이 자동으로 적용된다.
@Component
-@Component는 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션이다.
Component에 대한 추가 정보가 없다면 Class의 이름을 CamelCase(낙타 대문자)로 변경한 것이 Bean id로 사용된다.
CamelCase란 프로그래밍에서 파일 변수, 함수 등 대상의 이름을 띄어쓰기 없이 짓기 위하여 따르는 관례인 네이밍 컨벤션이다. 낙타 대문자에서는 단어 전체적으로 소문자를 사용하지만, 각 합성어의 첫 글자만 대문자로 표현한다. UpperCamelCase가 올바른 예시이고, upperCamelCase나, upper_camel_case와 같은 예시가 잘못된 예시이다.
@Bean과 다르게 @Component는 name이 아닌 value를 이용해 Bean의 이름을 지정한다.
@Bean
@Bean은 개발자가 직접 제어가 불가능한 외부 라이브러리를 Bean으로 만들려 할 때 사용되는 어노테이션이다.
List와 같은 라이브러리들을 Bean으로 등록하기 위해서 별도로 해당 라이브러리 객체를 반환하는 메서드를 만들고 @Bean 어노테이션을 사용하면 된다. @Bean에 name이라는 값을 이용하여 개발자가 원하는 id로 Bean을 등록할 수 있다.
@Autowired
속성, setter method, 생성자에서 사용하며 Type에 따라 알아서 Bean을 주입해준다.
무조건적인 객체에 대한 의존성을 주입시키는 것이다. 오토 와이어 어노테이션을 사용할 시 스프링이 자동적으로 값을 할당한다. Controller 클래스에서 DAO나 Service에 관한 객체들을 주입시킬 때 많이 사용한다.
필드, 생성자, 입력 파라미터가 여러 개인 메서드에 적용 가능하다. Type을 먼저 확인한 후 못 찾으면 Name에 따라 주입한다.
@Controller
Spring MVC에서 Controller클래스에 쓰이고, 컨트롤러 클래스에 명시해주지 않으면 오류가 발생하니 잊지 말고 적어주자.
@Service
Service 클래스에서 쓰인다. 비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도이다.
@Repository
DAO 클래스에서 쓰이며, Database에 접근하는 메서드를 가지고 있는 클래스에 사용된다.
@Configuration
@Configuration을 클래스에 적용하고 @Bean을 해당 클래스의 메서드에 적용하면 @Autowired로 Bean을 부를 수 있다.
@Required
setter 메서드에 적용해주면 Bean 생성 시 필수 프로퍼티임을 알려준다.
Required 어노테이션을 사용하여 꼭 필요한 속성들을 정의한다.
@Resource
오토 와이어와 마찬가지로 Bean 객체를 주입해주는데 차이점은 오토 와이어는 타입으로, 리소스는 이름으로 연결해준다.
@RequestMapping
요청 URL을 어떤 메서드가 처리할지 매핑해주는 어노테이션이다.
컨트롤러나 컨트롤러의 메서드에 적용하고, 요청을 받는 형식을 정의하기도 한다.
@RequestBody
요청이 온 데이터를 바로 클래스나 모델로 매핑하기 위한 어노테이션이다. 요청에서 넘어온 body 값들을 자바 타입으로 파싱 해준다.
위의 정리해둔 어노테이션들은 현재 스프링을 공부하면서 자주 사용했던 어노테이션들을 정리해보았다.
이 외에 더 많은 어노테이션이 있으니 필요할 때 찾아서 사용하면 될 것 같다.