Annotation이란? 사전적 의미로는 주석이라는 뜻이다.

자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술이다.

즉, 프로그램에게 추가적인 정보를 제공해 주는 메타데이터(meta data)라고 볼 수 있다.(meta data : 데이터를 위한 데이터)

다음은 어노테이션의 용도를 나타낸 것이다.

1. 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공한다.

2. 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.

3. 실행 시(런타임 시)특정 기능을 실행하도록 정보를 제공한다.

기본적으로 어노테이션을 사용하는 순서는 다음과 같다.

1. 어노테이션을 정의

2. 클래스에 어노테이션을 배치

3. 코드가 실행되는 중 Reflection(프로그램이 실행 중에 자신의 구조와 동작을 검사하고, 조사하고, 수정하는 것)을 이용하여 추가 정보를 획득하여 기능을 실시

 

Annotation 종류

 

@ComponentScan

@Component, @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean등록을 해주는 Annotation

 

@Component

개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 Annotation

 

@Bean

개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할 때 사용되는 Annotation

 

@Autowired

field, setter method, constructor에서 사용하며 Type에 따라 알아서 Bean을 주입 해준다.

Controller 클래스에서 DAO나 Service에 관한 객체들을 주입 시킬 때 많이 사용

 

Bean을 주입받는 3가지 방식

1. @Autowired

2. setter

3. 생성자(@AllArgsConstructor 사용) -> 권장방식

 

@Inject

@Autowired 어노테이션과 비슷한 역할

 

@Controller

Spring의 Controller를 의미하며, Spring MVC에서 Controller 클래스에 쓰인다.

 

@RestController

Spring에서 Controller 중 View로 응답하지 않는, Controller를 의미

method의 반환 결과를 JSON 형태로 반환

 

@Controller 와 @RestController 차이

@Controller
API와 view를 동시에 사용하는 경우에 사용
대신 API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환
view(화면) return이 주목적

@RestController
view가 필요없는 API만 지원하는 서비스에서 사용
Spring 4.0.1부터 제공
@RequestMapping 메서드가 기본적으로 @ResponseBody 의미를 가정
data(json, xml 등) return이 주목적

즉, @RestController = @Controller + @ResponseBody

 

@Service

Service Class에서 쓰인다. 비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도

 

@Repository

DAO Class(DataBase에 접근하는 method를 가지고 있는 Class)에서 쓰인다.

 

@EnableAutoConfiguration

Spring Application Context를 만들 때 자동으로 설정하는 기능을 켠다.

(classpath의 내용에 기반해서 자동으로 생성, 만약 tomcat-embed-core.jar가 존재하면 톰캣 서버가 setting)

 

@Configuration

@Configuration을 클래스에 적용하고 @Bean을 해당 Class의 method에 적용하면 @Autowired로 Bean을 부를 수 있다.

 

@Required

setter method에 적용해주면 Bean 생성시 필수 프로퍼티 임을 알린다.

 

@Qualifier("id")

@Autowired와 같이 쓰이며, 같은 타입의 Bean 객체가 있을 때 해당 아이디를 적어 원하는 Bean이 주입될 수 있도록 한다.

 

@Resource

@Autowired와 마찬가지로 Bean 객체를 주입해주는데 차이점이 있다.

Autowired는 타입으로, Resource는 이름으로 연결한다.

 

@PostConstruct, @PreConstruct

의존하는 객체를 생성한 이후 초기화 작업을 위해 객체 생성 전/후에 실행해야 할 method 앞에 붙인다.

 

@PreDestroy

객체를 제거하기 전에 해야할 작업을 수행하기 위해 사용

 

@PropertySource

해당 프로퍼티 파일을 Environment로 로딩하게 해준다.

 

@ConfigurationProperties

yaml파일 읽는다. default로 classpath:application.properties 파일이 조회

 

@Lazy

지연로딩을 지원

@Component나 @Bean Annotation과 같이 쓰는데 Class가 로드될 때 스프링에서 바로 bean등록을 마치는 것이 아니라 실제로 사용될 때 로딩이 이뤄지게 하는 방법

 

@Value

properties에서 값을 가져와 적용할 때 사용

 

@SpringBootApplication

@Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나의 어노테이션으로 합친 것

 

@RequestMapping

요청 URL을 어떤 method가 처리할지 mapping해주는 Annotation

 

@CookieValue

쿠키 값을 parameter로 전달 받을 수 있는 방법

 

@CrossOrigin

CORS 보안상의 문제로 브라우저에서 리소스를 현재 origin에서 다른 곳으로의 AJAX요청을 방지하는 것

 

@ModelAttribute

view에서 전달해주는 parameter를 Class(VO/DTO)의 멤버 변수로 binding 해주는 Annotation

 

@GetMapping

@RequestMapping(Method=RequestMethod.GET)과 같다.

 

@SessionAttributes

Session에 data를 넣을 때 쓰는 Annotation

 

@Valid

유효성 검증이 필요한 객체임을 지정

 

@InitBinder

@Valid 어노테이션으로 유효성 검증이 필요하다고 한 객체를 가져오기전에 수행해야할 method를 지정

 

@RequestAttribute

Request에 설정되어 있는 속성 값을 가져올 수 있다.

 

@RequestBody

요청이 온 데이터(JSON이나 XML형식)를 바로 Class나 model로 매핑하기 위한 Annotation

 

@RequestHeader

Request의 header값을 가져올 수 있다. 메소드의 파라미터에 사용

 

@RequestParam

@PathVariable과 비슷, request의 parameter에서 가져오는 것

 

@RequestPart

Request로 온 MultipartFile을 바인딩

 

@ResponseBody

HttpMessageConverter를 이용하여 JSON 혹은 xml로 요청에 응답할 수 있게 해주는 Annotation

 

@PathVariable

method parameter 앞에 사용하면서 해당 URL에서 {특정값}을 변수로 받아 올 수 있다.

 

@ExceptionHandler

해당 클래스의 예외(Exception)를 캐치하여 처리

 

@ControllerAdvice

Class 위에 ControllerAdvice를 붙이고 어떤 예외를 잡아낼 것인지는 각 메소드 상단에

@ExceptionHandler(예외클래스명.class)를 붙여서 기술

 

@RestControllerAdvice

@ControllerAdvice + @ResponseBody

 

@ResponseStatus

사용자에게 원하는 response code와 reason을 return해주는 Annotation

 

@EnableEurekaServer

Eureka 서버로 만들어준다.

 

@EnableDiscoveryClient

Eureka 서버에서 관리될 수 있는 클라이언트 임을 알려주기위한 Annotation

 

@Transactional

데이터베이스 트랜잭션을 설정하고 싶은 method에 이 Annotation을 적용하면 method 내부에서 일어나는 데이터베이스 로직이 전부 성공하거나, 데이터베이스 접근중 하나라도 실패하면 다시 롤백할 수 있게 해주는 Annotation

 

@Cacheable

method 앞에 지정하면 해당 method를 최초에 호출하면 캐시에 적재하고 다음부터는 동일한 method 호출이 있을 때 캐시에서 결과를 가져와서 return하므로 method 호출 횟수를 줄여주는 Annotation

 

@CachePut

캐시를 업데이트하기 위해서 method를 항상 실행하게 강제하는 Annotation

 

@CacheEvict

캐시에서 데이터를 제거하는 트리거(Trigger)로 동작하는 method에 붙이는 Annotation

 

@CacheConfig

클래스 레벨에서 공통의 캐시설정을 공유하는 기능

 

@Scheduled

Linux의 crontab처럼 정해진 시간에 실행해야하는 경우에 사용

 

Lombok Annotation 종류

 

@NoArgsConstructor

기본 생성자를 자동으로 추가

 

@AllArgsConstructor

모든 필드 값을 파라미터로 받는 생성자를 추가

 

@RequiredArgsConstructor

final(값이 할당되면 더 이상 변경할 수 없음) 이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 추가

 

@Getter

Class 내 모든 필드의 Getter method를 자동 생성

 

@Setter

Class 내 모든 필드의 Setter method를 자동 생성

 

@ToString

Class 내 모든 필드의 toString method를 자동 생성

 

@EqualsAndHashCode

equals와 hashCode method를 오버라이딩 해주는 Annotation

 

@Builder

어느 필드에 어떤 값을 채워야 할지 명확하게 정하여 생성 시점에 값을 채워준다.

 

Constructor 와 @Builder 차이

생성 시점에 값을 채워주는 역할은 똑같다. 하지만 Builder를 사용하면 어느 필드에 어떤 값을 채워야 할지 명확하게

인지할 수 있다. 해당 Class의 Builder 패턴 Class를 생성 후 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함

 

@Data

@Getter, @Setter, @EqualsAndHashCode, @AllArgsConstructor을 포함한 Lombok에서 제공하는 필드와 관련된

모든 코드를 생성

 

JPA Annotation 종류

 

@Entity

실제 DB의 테이블과 매칭될 Class임을 명시

즉, 테이블과 링크될 클래스임을 나타냄

 

@Table

Entity Class에 매핑할 테이블 정보를 알려줌

 

@Id

해당 테이블의 PK 필드를 나타냄

 

@GeneratedValue

PK의 생성 규칙을 나타냄

 

@Column

테이블의 컬럼을 나타내며, 굳이 선언하지 않더라도 해당 Class의 필드는 모두 컬럼이 됨

+ Recent posts