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의 필드는 모두 컬럼이 됨
'Java > 참고자료' 카테고리의 다른 글
[Java] Date & LocalDate & LocalDateTime 변수를 yyyyMMdd 문자열로 변환 (0) | 2024.09.13 |
---|---|
[Java] 특정 문자열 및 빈 값 체크 (0) | 2024.08.29 |
[Java] Equals & HashCode (0) | 2022.11.25 |
[Java] Exception (0) | 2022.11.25 |
[Java] Comparable & Comparator (0) | 2022.11.25 |