어노테이션(Annotation)이란
- 자바 어노테이션은 자바 소스 코드에 추가하여 사용할 수 있는
*메타데이터
의 일종이다
- 보통 ‘@’ 기호를 앞에 붙여서 사용한다. JDK 1.5버전 이상에서 사용이 가능하다
- @를 이용한 주석, 자바 코드에 주석을 달아 특별한 의미를 부여한 것이다
- 자바 어노테이션은 클래스파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다
*메타데이터란
Application이 처리하는 데이터가 아니고, 컴파일 과정과 런타임 과정에서 코드를 어떻게 컴파일하고 처리할것인지를 알려주는 정보이다
Annotation의 용도
- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공한다
- 오버라이딩을 하기 위해서는 부모 클래스에 있는 메소드명과 매개변수를 동일하게 가져가야한다
- 그런데 제대로 오버라이딩 했다고 생각했지만,매개변수를 잘못 지정했을 수도 있다
- 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공한다
- 실행시(런타임시)특정 기능을 실행하도록 정보를 제공한다
- 자식 클래스에 여러개의 메소드가 정의되어 있을 때 사용
- 해당 메소드가 부모 클래스에 있는 메소드를 오버라이딩 했다는 것을 명시적으로 선언한다
자바 코드에 적용되는 내장 Annotation
- @Override
- 선언한 메소드가 오버라이드 되었다는 것을 나타낸다
- 만약 부모 클래스(또는 인터페이스)에서 해당 메소드를 찾을 수 없다면 컴파일 에러를 발생 시킨다
- @Deprecated
- 해당 메소드가 더 이상 사용되지 않음을 표시한다
- 만약 사용할 경우 컴파일 경고를 발생시킨다
- @SuppressWarnings
- @SafeVarargs
- Java7 부터 지원하며, 제너릭 같은 가변인자의 매개변수를 사용할 때의 경고를 무시한다
- @FunctionalInterface
- Java8 부터 지원하며, 함수형 인터페이스를 지정하는 어노테이션이다
- 만약 메서드가 존재하지 않거나, 1개 이상의 메서드(default 메서드 제외)가 존재할 경우 컴파일 오류를 발생 시킨다
Annatation의 장점
- 코드의 가독성 증대
- 관련 코드 곁에 메타데이터를 설정할 수 있으므로 코드의 가독성이 증대 된다
- 개발 효율성 증대
- 복잡한 XML 스키마를 파악하지 않아도 되며, 개발시 개발 툴과 컴파일러의 도움을 받을 수 있으므로 개발 효율성이 증대된다
Annotation의 단점
- 어노테이션 처리시 리플렉션을 통해 해당 클래스를 분석해야 하는 오버헤드가 있다
- 모듈이나 애플리케이션 전반적인 메타데이터를 설정할 수 없다
- 어노테이션의 범위는 클래스나 패키지 레벨로 한정되기 때문에 여러 클래스에 걸친 공통적인 설정이나 모듈레벨 설정이 어렵다
- 웹 어플리케이션 개발시 서블릿 필터나, 인터셉터를 이용해서 문제 해결이 가능함
1. 스프링 Annotation 종류
어노테이션 |
설명 |
@Component |
- 개발자가 생성한 Class를 Spring Bean으로 등록할 때 사용한다 - 스프링은 해당 어노테이션을 보고 스프링 빈으로 등록한다 |
@ComponentScan |
- Spring Framework는 @Component, @Service, @Repository, @Controller, @Configuration 중 1개라도 등록된 클래스를 찾으면, Context에 bean으로 등록한다 - @ComponentScan Annotation이 있는 클래스의 하위 Bean을 등록 될 클래스들을 스캔하여 Bean으로 등록해줍니다. |
@Bean |
개발자가 제어가 불가능한 외부 라이브러리와 같은 것들을 Bean으로 만들 때 사용 |
@SpringBootApplication |
- Application 클래스 class 상단에 선언 - @EnableAutoConfiguration, @ComponentScan, @Configuration 이 세가지 어노테이션을 제공하는것과 같은 의미이다 |
@Controller |
- 스프링 MVC의 컨트롤러 객체임을 명시하는 어노테이션 |
@RestController |
- @Controller에 @ResponseBody가 추가된 형태 - JSON 형태로 객체 데이터를 반환한다 |
@RequestBody, @ResponseBody |
@RequestBody : HTTP요청의 Body Content를 Java 객체로 변환해준다 @ResponseBody : Java객체를 HTTP요청의 Body Content로 매핑한다 |
@(Get,Post,Put,Delete,Patch)Mapping |
- HTTP Method에 해당되는 메소드에 선언한다 |
@Autowired |
- 사용자가 주입하려는 객체 타입이 일치하는 객체를 자동으로 주입한다 |
@Getter, @Setter |
Get(), Set() 메소드를 컴파일시 생성해준다 |
@RequestParam |
request의 파라미터를 가져오는 기능을 하며 메소드내에 변수로 활용 |
@RequestHeader |
요청(request)에서 특정 HTTP헤더 정보를 추출할 때 사용 |
@PathVariable |
메소드 파라미터 앞에 사용하며 해당 URL에 { } 특정 파라미터를 변수로 활용 가능 |
@ModelAttribute |
view에서 전달해주는 파라미터를 클래스의 멤버변수로 binding 해주는 어노테이션 |
@Runwith |
JUnit 프레임워크의 테스트를 할수 있도록 설정 @Runwith에 Runner클래스 설정시 JUnit의 내장된 runner대신 설정한 SpringJUnit4ClassRunner를 실행 |
2. Lombok Annotation 종류
어노테이션 |
설명 |
@NoArgsConstructor |
파라미터가 없는 기본 생성자를 생성 |
@RequiredArgsConstructor |
final, @NonNull 인 필드값만 파라미터로 받는 생성자를 생성 |
@EqualsAndHashCode |
equals( )메소드와 hashCode( )메소드를 오버라이드 |
@Data |
@toString, @getter/setter, @RequiredArgsConstructor 등 모두 사용한것과 같은 기 |
3. JPA Annotation
어노테이션 |
설명 |
@Entity |
데이터베이스의 테이블과 1대1 매칭 |
@Id |
테이블 컬럼의 기본키에 설정 |
@Column |
테이블 컬럼에 설정, @Entity로 지정시 생략가능 |
@GeneratedValue |
기본키에 지정된 auto increment 등의 속성을 지정 |
@EmbeddedId |
테이블 컬럼의 복합키에 설정 |
@Enumerated |
enum과 관련되어 있으며, EnumType.ORDINAL, STRING의 속성 |
@Transient |
데이터베이스에서 실제 사용하지 않는 것을 지정, 임시값으로 활용 |