본문으로 바로가기

[Spring] annotation 종류

category TIL/Spring 2022. 5. 6. 20:13

Annotation

자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종

 

기타

종류 역할
@SpringBootApplication SpringBoot를 자동으로 실행
@EnableAutoConfiguration 클래스 경로에 지정된 내용을 기반으로 설정 자동화
@ComponentScan @Component, @Service, @Repository, @Controller, @Configuration 빈들을 찾아
Context에 빈을 등록
@Configuration 스프링 IOC Container에게 해당 클래스가 Bean 구성 Class임을 알려줌
@Component 개발자가 컨트롤이 가능한 클래스를 Bean으로 등록
• Controller, Service, DAO 세가지 이외의 클래스에만 사용 권장
@Autowired 의존 관계를 자동으로 연결하여 빈을 주입
@Bean 개발자가 컨트롤이 불가능한 외부 라이브러리를 Bean으로 등록
@Controller Spring MVC의 Controller로 사용되는 클래스 선언을 단순화
@Service 비지니스 로직이 들어가는 Service로 사용되는 클래스임을 명시
@Repository DB연동 작업을 하는 클래스임을 명시
• 해당 클래스에서 발생하는 DB 관련 예외를 spring의 DAOException으로 전환할 수 있음
@Resource 의존관계를 자동으로 연결하여 빈을 주입
• Java에서 지원

사용 대상 : 필드, 파라미터가 1개인 setter 메소드
연결 우선 순위 : 이름 > 타입
@Autowired 의존 관계를 자동으로 연결하여 빈을 주입
• Spring Framework에서 지원 (Spring에서만 사용 가능)
• 사용 대상 : 필드, 생성자, setter 메소드
연결 우선 순위 : 타입 > 이름
@Inject 의존 관계를 자동으로 연결하여 빈을 주입
• Java에서 지원
• 사용 대상 : 필드, 생성자, setter 메소드
연결 우선 순위 : 이름 > 타입
@RequestMapping 클라이언트에게 요청받는 주소를 클래스와 연결
• 속성 - value(String) → URL 값
• 속성 - method(POST/GET/PUT/・・・) - default : GET방식 → HTTP Request 메소드 값
@PostMapping HTTP POST 요청을 특정 핸들러 메소드에 매핑
@GetMapping HTTP GET 요청을 특정 핸들러 메소드에 매핑
@PutMapping HTTP PUT 요청을 특정 핸들러 메소드에 매핑
@DeleteMapping HTTP DELETE 요청을 특정 핸들러 메소드에 매핑
@RestController @Controller + @ResponseBody
• 해당 클래스가 ajax 요청을 받아 json/xml 형태로 객체 데이터를 반환
@ResponseBody 자바 객체를 HTTP 요청의 body 내용으로 변환/매핑 (직렬화)
@RequestBody JSON 형태의 HTTP Body 내용을 Java 객체로 변환 (역직렬화)
Body가 존재하지 않는 HTTP GET 요청 시, 에러 발생
생성자 또는 setter 메서드 불필요 (but, 직렬화를 위해 기본 생성자는 필수)
데이터 바인딩을 위한 필드명을 알아내기 위해 getter나 setter 중 1개는 정의해야 함
HTTP POST 요청 시, 기본 생성자는 필수
HTTP GET 요청 시, setter는 필수
@ModelAttribute multipart/form-data 형태의 HTTP Body 내용과 HTTP 파라미터 데이터(1개 이상)를 Java 객체로 매핑 (역직렬화)
생성자 또는 setter 메서드 필요
Query String 이나 Form 형식이 아닌 데이터는 처리할 수 없음
• 잘못된 파라미터 값이 들어오면 WebExchangeBindException 발생
@RequestParam HTTP 요청 파라미터(1개)를 바인딩
• 잘못된 파라미터 값이 들어오면 400BadRequest 발생
• required 속성값이 false이고 파라미터가 없는 경우, null로 바인딩
• 속성 - name(String) → 파라미터의 이름
• 속성 - value(String) → 파라미터의 간단한 설명
• 속성 - required(true/false) → 파라미터의 필수 여부 설정
• 속성defaultValue(String) → 파라미터의 기본값 설정
@PathVariable URL 경로 주소에 사용하는 값을 매개 변수로 사용
• 쿼리 스트링이 아닌, 주소를 경로 형태로 만들어줌
@JsonProperty 해당 객체를 JSON 형식으로 변환할 때 받을 Key의 이름을 설정
• lombok 라이브러리 사용
• 서버와 클라이언트의 표기법이 달라서 발생하는 문제 해결
@JsonNaming 객체 JSON 형식으로 변환할 때 받을 Key의 이름을 설정
• 필드마다 @JsonProperty를 적용해야 하는 번거로움 방지
 default PropertyNamingStrategy.SnakeCaseStrategy.class → Snake를 Camel로
@RequestEntity @RequestBody에 HTTP response header가 추가
@ResponseEntity @ResponseBody에 HTTP response header가 추가
@Transactional 메소드 내에서 Exception이 발생하면 해당 메소드에서 이루어진 모든 DB 작업을 초기화
모든 처리가 정상적으로 동작한 경우에만 DB에 커밋
Service 단에서 사용
@EnableSwagger2 개발자 도움말 페이지를 생성


Lombok 라이브러리

종류 역할
@NoArgsConstructor 기본 생성자를 자동으로 추가
 필수 속성 - access=AccessLevel.PROTECTED
                        → 기본생성자의 접근 권한을 제한
                        → Entity 클래스를 프로젝트 코드 상에서 기본생성자로 생성하는 것을 방지하면서
                            JPA에서 Entity 클래스를 생성하는 것은 허용
접근제한자를 public(default)로 두면 안전성이 심각하게 저하
@AllArgsConstructor 모든 필드 값을 파라미터로 받는 생성자를 추가
• 변수의 위치를 바꿔도 데이터타입이 같으면 에러로 인지하지 못함
@RequiredArgsConstructor final 필드나 @NonNull 필드에 대해 자동으로 생성자 생성
• 새로운 필드를 추가할 때 생성자를 다시 만드는 번거로움 방지
@Getter 클래스 내 모든 필드의 getter 메소드를 자동으로 생성
@Setter 클래스 내 모든 필드의 setter 메소드를 자동으로 생성
해당 클래스가 무결성을 보장해야 하는 경우, 사용을 지양
@ToString 특정 필드를 toString() 결과에서 제외
필수 속성 - exclude(String) → toString()결과에서 제외할 필드 이름
@Builder 어느 필드에 어떤 값을 채워야 할지 명확하게 정하여 생성 시점에 값을 채움
생성자 상단에 선언 시, 생성자에 포함된 필드만 빌더에 포함
@Data Lombok에서 제공하는 필드와 관련된 모든 코드를 생성
@Value 불변의 객체를 선언
setter 메소드는 사용 불가능
@Slf4j 로그 기록

 

API

종류 역할
@Api Swagger 리소스로 사용될 Controller 클래스 지정
• 속성 - tags(String) → 간단한 클래스 설명
@ApiIgnore 해당 Controller를 Swagger 페이지에서 보이지 않게 함
@ApiOperation API 메소드에 대한 설명
• Controller에 작성
속성 - value(String) → 간단한 메소드 설명
• 속성 - note(String) → 자세한 메소드 설명
• 속성 - response(Object) → Response 타입
@ApiResponses API 상태 코드 값 별로 메시지 커스텀
@ApiResponse API 상태 코드 값의 메시지 커스텀
• 필수 속성 - code(HttpStatus) → 응답 HttpStatus
• 필수 속성 - message(String) → 응답 메시지
• 속성 - response(Object) → Response 타입
@ApiModel 해당 모델을 설명
• 속성 - description(String) → 설명
@ApiParam 해당 파라미터에 대한 설명
• 속성 - value(String) → 간단한 파라미터 설명
• 속성 - required(true/false) → 파라미터의 필수 여부 설정
@ApiImplicitParams 파라미터 별로 설명
@ApiImplicitParam 해당 파라미터에 대한 설명
• 메소드 위에 작성하여 @ApiParam보다 깔끔함
• 속성name(String) → 파라미터 이름
• 속성 - value(String) → 간단한 파라미터 설명
• 속성 - required(true/false) → 파라미터의 필수 여부 설정
• 속성 - dataType(String) → 파라미터의 데이터타입
@ApiModelProperty 모델의 해당 필드(변수)를 설명할 때 사용
• 속성 - value(String) → 간단한 필드 설명
• 속성 - example(String) → 필드 예시
• 속성 - required(true/false) → 필드의 필수 여부 설정
• 속성 - hidden(String) → 필드의 숨김 여부 설정

 

예외 처리

종류 역할
@ExceptionHandler 예외 처리
• 컨트롤러에 있는 메소드에 사용
@ControllerAdvice Spring AOP를 이용한 Exception handling
• '예외처리 전용 컨트롤러'를 생성하여 예외 처리
@ResponseStatus HTTP Status Code 제어를 위한 Exception handling 특정한 예외 지정
• 상태코드를 의미있는 코드로 변환

 

유효성 검증

종류 역할
@Valid RestController를 이용하여 @RequestBody 객체를 사용자로부터 가져올 때
들어오는 값들을 
유효성 검사
 service 단이 아닌 객체 안에서 검증 가능
문자열 유무
검증
@NotBlank null이 아닌 값이고, 공백이 아닌 문자를 하나 이상 포함
• 반드시 값이 존재하고, 공백 문자를 제외한 길이가 0보다 커야함
@NotEmpty null 또는 empty(빈 문자열)이 아님
• 반드시 값이 존재하고, 길이나 크기가 0보다 커야함
타입 : 문자열, Collection, Map
@NotNull null 또는 empty(빈 문자열)이 아님
 반드시 값이 존재함
타입 : 모든 타입
@Null null 값임
타입 : 모든 타입
최대/최소
검증
@DecimalMax 지정된 최댓값보다 작거나 같아야 함
• 문자열 타입인 경우
• 필수 속성 - value(String) → 최댓값 지정
@DecimalMin 지정된 최솟값보다 크거나 같아야 함
• 문자열 타입인 경우
• 필수 속성 - value(String) → 최소값 지정
@Max 지정된 최댓값보다 작거나 같아야 함
타입 : Primitive 타입, Wrapper 타입
• 필수 속성value(int) → 최댓값 지정
@Min 지정된 최솟값보다 크거나 같아야 함
• 필수 속성value(int) → 최솟값 지정
양수/음수
검증
@Positive 양수인 값
@PositiveOrZero 0이거나 양수인 값
@Negative 음수인 값
@NegativeOrZero 0이거나 음수인 값
시간 값
검증
@Future Now 보다 미래의 날짜, 시간이어야 함
@FutureOrPresent Now 이거나 미래의 날짜, 시간이어야 함
@Past Now 보다 과거의 날짜, 시간이어야 함
@PastOrPresent Now 이거나 과거의 날짜, 시간이어야 함
이메일 검증 @Email 올바른 형식의 이메일 주소이어야 함
자릿수 범위
검증
@Digits 허용된 범위 내의 숫자임
• 필수 속성 - integer(int) → 숫자에 허용되는 최대 정수 자릿수
• 필수 속성 - fraction(int) → 숫자에 허용되는 최대 소수 자릿수
boolean 값
검증
@AssertTrue 값이 항상 True 이어야 함
@AssertFalse 값이 항상 False 이어야 함
크기(길이)
검증
@Size 크기가 지정된 경계(포함) 사이에 있어야 함
타입 : String, Collection, Map, 배열
• 필수 속성 - max(int) → element의 크기가 작거나 같음
• 필수 속성 - min(int) → element의 크기가 크거나 같음
정규식
검증
@Pattern 지정한 정규식과 대응되는 문자열 이어야 함
• Java의 Pattern 패키지의 컨벤션을 따름
• 필수 속성 - regexp(String) → 정규식 문자열을 지정

 

데이터 제어를 위한 필터링

종류 역할
@JsonIgnore 객체를 이용한 JSON의 (역)직렬화((de)serialize)를 할 때, 응답 객체에 특정 필드를 제외
필드에 개별적으로 적용
@JsonIgnoreProperties 객체를 이용한 JSON의 (역)직렬화((de)serialize)를 할 때, 응답 객체에 특정 필드를 제외
• 클래스에 적용
@JsonFilter Admin 페이지에서 지정된 필드만 조회
• Controller, Service 클래스에서 사용

 


[ 출처 ]

https://prinha.tistory.com/entry/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-annotation%EC%9D%98-%EC%A0%95%EC%9D%98%EC%99%80-%EC%A2%85%EB%A5%98

 

 

'TIL > Spring' 카테고리의 다른 글

[Spring] Spring Security (스프링 시큐리티)란?  (0) 2022.05.13
component-scan  (0) 2021.10.29