@Annotation

P·2021년 12월 9일
0

Annotation의 정의

사전적 의미: 주석
Java에서는 주석 이상으로 특정 기능을 하는 기술
Annotation을 사용하면 코드가 짧아지고 유지보수가 용이함

Spring에서의 Annotation의 종류

@Bean

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


@Component

@Component가 선언된 Class를 Spring의 Bean으로 등록할 때 사용


@ComponentScan

@Component, @Service, @Repository, @Controller, @Configuration 어노테이션 중 1개라도 선언되어 있는 클래스가 있다면 해당 클래스를 Context에 Bean으로 등록


@Controller

Spring MVC 패턴에서 Controller클래스에 사용


@Service

비즈니스 로직을 수행하는 클래스를 나타낼 때 사용


@Repository

DAO 클래스에서 사용
DB 연동 작업을 하는 클래스에서 사용하면 Spring의 DAOException 예외를 적용할 수 있음


@Configuration

@Configuration 어노테이션이 붙은 클래스는 @Bean을 등록하기 위한 클래스
@Configuration이 붙은 클래스에 @Bean을 메서드에 적용시키면 다른 클래스에서 @Autowired로 Bean을 사용할 수 있음
@Configuration이 없어도 Bean을 등록할 수 있지만 싱글톤이 유지되지 않음


@AutoWired

타입에 따라서 자동으로 Bean을 주입받기 위해 사용

Bean을 주입 받는 3가지 방법

  • @AutoWired
  • Setter
  • 생성자

@Resource

@Autowired와 비슷한 역할, 차이점은 이름으로 연결해 줌


@Inject

@AutoWired와 비슷한 역할


@EnableAutoConfiguration

Spring의 Application-context를 만들 때 자동으로 설정하는 기능을 On


@RestController

@RestController = @Controller + @ResponseBody
@Controller의 주 목적은 View를 리턴해주는 어노테이션
@RestController의 주 목적은 데이터(XML, JSON 등)를 리턴해주는 어노테이션

JSON형태로 전송받은 데이터를 가져올 때는 @RequestBody
데이터를 전송할 때는 @ResponseBody


@ResponseBody

@ResponseBody메서드가 선언된 컨트롤러는 리턴값이 View로 출력되는것이 아닌 HTTP Body에 직접 리턴됨
XML, JSON등 데이터를 리턴


@RequestBody

HTTP Body로부터 전달받은 데이터를 클래스나 Model에 매핑하기 위한 어노테이션
XML, JSON등 데이터를 받으면 Java Object로 변환
Body가 없는 GET 방식에서는 @RequestBody 사용 시 오류 발생


@RequestMapping

클라이언트로 부터 전달받은 요청 URL을 어떤 메서드가 처리할지 매핑해주는 어노테이션
@RequestMapping(value="") 형식으로 작성
value 뒤에 형식으로 (method=RequestMethod.GET)와 같이 요청 형식 지정가능

요청 형식 종류

  • GET
  • POST
  • PATCH
  • PUT
  • DELETE

요청 형식을 지정하지 않으면 기본값으로 GET 사용


@RequestParam

URL 요청으로 받은 파라미터 값과 @RequestParam 어노테이션이 붙은 메서드에서 일치하는 파라미터 값을 파싱하여 사용하기 위한 어노테이션
기본으로 파라미터 전송이 true이기 때문에 파라미터를 전송받지 못하면 HTTP 400 오류 발생
필수적으로 필요한 변수가 아니면 (required = false) 로 설정
View로부터 전달받은 파라미터를 바로 처리 가능


@RequestHeader

Request의 header값을 가져올 수 있음


@Required

Setter 메서드에서 선언하면 Bean 생성 시 필수 프로퍼티임을 알림
Spring 5.1부터 더이상 권장되지 않는 방식으로 변경되어 deprecated warnings 발생

public class Product {
    private String id;

    public String getId() {
        return id;
    }

    @Required	// 이 부분 권장하지 않음
    public void setId(String id) {
        this.id = id;
    }
}

위의 코드를

public class Product {
   private String id;

   public Product(String id) {
      this.id = id;
   }

   public String getId() {
      return id;
   }

생성자를 통해 set 하는 방식으로 권장


@Qualifier("value")

@AutoWired와 같이 쓰이며 같은 타입의 Bean 객체가 있으면 value값을 설정해서 원하는 Bean만 주입될 수 있도록 하는 어노테이션


@Lazy

지연 로딩 지원
@Component@Bean과 같이 쓰는데 클래스가 로드될 때 Spring에서 바로 bean등록을 마치는 것이 아니라 실제로 사용될 때 로딩이 이뤄지게 하는 방법


@Value

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


@SpringBootApplication

@Configuration, @EnableAutoConfiguration, @ComponentScan 모두를 합친 어노테이션


@CookieValue

쿠키 값을 파라미터로 전달 받을 수 있음
쿠키가 존재하지 않으면 500에러 발생


@CrossOrigin

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


@ModelAttribute

@ModelAttribute가 붙은 객체를 자동으로 생성 후 HTTP 요청으로 넘어온 파라미터 값들을 자동으로 객체의 멤버 변수에 바인딩 시켜주는 어노테이션
@RequestParam은 1:1 매핑
@ModelAttribute는 객체 매핑, Setter 또는 생성자가 있어야함


@GetMapping

@RequestMapping(Method=RequestMethod.GET)과 동일
@PostMapping, @PutMapping, @PatchMapping, @DeleteMapping도 있음


@PathVariable

메서드의 파라미터 앞에 사용하면 해당 URL에서 특정값을 변수로 받아올 수 있음
@RequestMapping어노테이션에 value값을 포함하고 있으면서 @PathVariable 어노테이션이 적용된 동일한 이름을 갖는 파라미터에 매핑됨

@RequestParam을 사용했을 때 주소
http://localhost:8080/?aaa=bbb&ccc=ddd

@PathVariable을 사용했을 때 주소
http://localhost:8080/bbb/ddd


@ExceptionHandler(클래스명.class)

해당 클래스의 예외 발생시 처리


@ControllerAdvice

클래스 위에 @ControllerAdvice 어노테이션을 설정하고 어떤 예외를 잡을 것인지는 각각의 메서드 위에 @ExceptionHandler를 붙여서 사용


@RestControllerAdvice

@ControllerAdvice + @ResponseBody 합친 것


@ResponseStatus

HTTP 상태 코드에 따른 Exception을 Handling 하기위한 예외 지정 어노테이션
500 에러 발생 시 500 에러 페이지를 띄우는 것이 아닌 @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="이유")와 같이 메시지를 표시하기 위해 사용


@Vaild

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

  • 문자열 유무 검증
    @NotBlank null이 아닌 값, 공백을 제외한 문자를 하나 이상 포함해야 함
    @NotEmpty null이 아닌 값, 빈 문자열이 아니어야 함(empty)
    @NotNull null이 아닌 값이어야 함
    @Null null값임

  • 최대, 최소값에 대한 검증
    @DecimalMax 지정된 최대 값보다 작거나 같아야 함, String값으로 value지정
    @DecimalMin 지정된 최대 값보다 크거나 같아야 함, String값으로 value지정
    @Min 지정된 최대 값보다 작거나 같아야 함, int값으로 value지정
    @Max 지정된 최대 값보다 크거나 같아야 함, int값으로 value지정

  • 양수, 음수에 대한 검증
    @Positive 양수임
    @PositiveOrZero 0 또는 양수
    @Negative 음수임
    @NegativeOrZero 0또는 음수

  • 시간값에 대한 검증
    @Future 현재(Now)보다 미래의 날짜, 시간이어야 함
    @FutureOrPresent 현재(Now)이거나 미래의 날짜, 시간이어야 함
    @Past 현재(Now)보다 과거의 날짜, 시간이어야 함
    @PastOrPresent 현재(Now)이거나 과거의 날짜, 시간이어야 함

  • 이메일 검증
    @Email 올바른 형식의 이메일 주소인지 검증(@ 문자가 포함되어야 함)

  • 자릿수 검증
    @Digits 허용된 범위 내의 숫자여야 함, integer=최대 정수 자릿수, fraction = 최대 소수 자릿수
    @Digits(integer = 5, fraction = 5)

  • boolean값 검증
    @AssertTrue 값이 항상 True여야 함
    @AssertFalse 값이 항상 False여야 함

  • 크기(length)검증
    @Size 크기가 지정된 경계 사이에 있어야 함
    (@Min, @Max는 숫자만 검증 가능하지만 @Size는 Collection, Map, 배열 등을 지원함)

  • 정규식 검증
    @Pattern 지정한 정규식과 Java의 Pattern패키지의 컨벤션을 따르는 문자열과 비교
    (@Pattern(regexp = "비교할 대상의 문자열 패턴"))


@Transactional

DB 트랜잭션을 설정하고 싶은 메서드에 적용하면 메서드 내부에서 일어나는 모든 DB관련 로직 중 하나라도 실패하면 롤백해주는 어노테이션

@Transactional(readOnly=true, rollbackFor=Exception.class)
위의 어노테이션은 읽기 전용 속성을 가지고 Exception이 발생하면 롤백하는 어노테이션

이미 DB에 입력된 데이터를 롤백 시키는 것이 아닌 DB관련 로직이 모두 성공 했을 때 커밋하고 실패하면 해당 모든 로직을 실행시키기 이전으로 되돌리는 것

보통 @Service가 선언된 클래스의 경우 DB 관련 로직을 수행하기 때문에 @Transactional을 선언함


@EnableTransactionManagement

DB 설정 Class에 선언하여 트랜잭션을 허용시킴
DB 설정 Class에서 transactionManager() 생성 후 @Bean으로 등록해야 트랜잭션을 쓰려는 다른 클래스에서 @Transactional을 사용하여 트랜잭션 적용 가능


@PropertySource

@PropertySource("classpath:/application.properties")와 같은 프로퍼티 설정 파일의 경로를 지정하여 @Configuration이 선언 된 클래스에 선언


@ConfigurationProperties

*.properties에 선언 된 설정 파일 내용들을 @ConfigurationProperties(prefix="~~~")를 사용하여 자바 클래스에서 값을 바인딩 해주는 어노테이션


@ConstructorBinding

final 속성을 갖는 변수가 속한 클래스에 properties값 바인딩 해주는 어노테이션


@Cacheable

메서드 앞에 선언하면 해당 메서드를 최초로 호출 시 캐시에 적재 후 동일한 메서드를 재 호출 시 캐시에서 결과를 가져와서 값을 리턴하게됨

항상 같은 결과를 리턴하는 메서드 앞에 선언해야 한다는 단점이 있음


@Scheduled

정해진 시간에 실행해야할 경우에 사용

@Scheduled(cron = "0 0 07 * * ?")
(cron = "초 분 시 일 월 요일 연도)
?: 설정값 없을 때(생략 가능한 부분에서만 가능, 요일과 연도)
*: 모든 조건


@Aspect

Spring의 AOP형식에서 모듈화를 위해 @Aspect를 선언하여 해당 클래스가 Aspect를 나타내는 클래스임을 명시
스프링 bean에만 AOP를 적용할 수 있기 때문에 @Component이랑 같이 사용하여 클래스를 bean에 등록


@Around

@Aspect로 선언한 클래스 내에서 @Around는 Target 메서드 안에서 특정 Advice를 실행하겠다고 선언하는 어노테이션
@Around 안에서 execution으로 시작하는 구문은 PointCut을 지정하는 문법(제일 많이 사용하는 문법, 다른 문법으로는 within, bean)
@Around("execution(* com.my.board..controller.*Controller.*(..)) or execution(* com.my.board..service.*Impl.*(..)) or execution(* com.my.board..mapper.*Mapper.*(..))")
Target 메서드의 Aspect 실행 시점을 지정하는 어노테이션 종류

  • @Before
  • @After
  • @AfterReturning
  • @AfterThrowing
  • @Around

Lombok Annotation의 종류

@NoArgsConstructor

파라미터가 없는 생성자를 자동으로 생성해 주는 어노테이션
필드가 final로 생성되어 있으면 생성자를 만들 수 없음
@NoArgsConstructor(force=true) 옵션을 사용해 0,false,null 등 강제 초기화하여 생성자 생성 가능


@AllArgsConstructor

클래스에 있는 모든 필드들에 대해 생성자를 자동으로 생성해 주는 어노테이션
@NonNull이 선언되어 있는 필드가 있으면 해당 필드는 생성자 내에서 null-check 로직을 자동으로 생성


@RequiredArgsConstructor

final이나 @NonNull 로 생성되어 있는 모든 필드들에 대해 생성자를 자동으로 생성해 주는 어노테이션
@NonNull로 마크되어 있는 필드들은 null-check가 추가로 생성되고 파라미터로 null값이 들어오면 NullPointerException이 발생됨


@Getter

단순 필드 리턴해주는 어노테이션
클래스에 선언하면 해당 클래스 내 모든 필드에 대한 리턴 메서드를 자동 생성


@Setter

필드에 값을 저장해주는 어노테이션
@Getter@Setter에는 Access Level을 지정할 수 있음
Access Level의 종류

  • Public
  • Protected
  • Package
  • Private

레벨을 설정하지 않으면 기본값은 Public
@Getter(AccessLevel.PRIVATE)와 같이 사용


@NonNull

null값을 허용하지 않는 필드 선언


@Nullable

null을 허용할 경우 선언


@ToString

클래스의 모든 필드에 대해 toString 메서드를 자동 생성
@ToString(exclude="name")과 같이 exclude(제외) 시키고 싶은 필드를 선언하면 결과에서 제외됨


@EqualsAndHashCode

equals와 hashCode 메서드를 자동으로 생성해 주는 어노테이션
@EqualsAndHashCode(callSuper=true)로 설정 시 부모 클래스의 필드 값들도 동일한지 체크, false 설정 시 자신 클래스의 필드 값만 체크

  • equals: 두 객체의 내용이 같은지 동등성(equality)을 체크
  • hashCode: 두 객체가 같은 객체인지 동일성(identity)을 체크

@Builder

빌드 패턴을 사용하여 객체를 생성할 수 있고 생성 후 Setter를 통한 접근을 제한할 수 있음(불변형 객체 생성 가능)

User user = User.builder()
.id(1L)
.username("name")
.password("1234")
.build();

@Singular

컬렉션으로 선언한 필드에는 @Singular 어노테이션을 선언하면 리스트 안에 계속 값을 추가할 수 있음

@Singular
private List<Integer> scores;

User user = User.builder()
.scores(100)
.scores(90)
.build();

@Log

자동으로 log필드 생성 및 로거 객체 생성, 할당해 주는 어노테이션
@Slf4j, @Log4j2 와 같은 로그 관련 프레임워크가 있음


@Data

@Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode를 모두 자동 설정해 주는 어노테이션


@Value

@Data 대신에 불변 객체를 생성하기 위해 선언하는 어노테이션


@Cleanup

IO 입출력 및 JDBC 코딩 시 try-catch-finally문에서 finally를 통해 close()를 호출하는 대신 @Cleanup을 사용하면 자동으로 닫히는 것을 지원해 줌


@SneakyThrows

Checked Exception 처리를 위해 Throws 또는 try-catch구문을 통해 예외처리를 해주는 대신 @SneakyThrows를 사용하여 명시적으로 예외 처리를 생략할 수 있음
@SneakyThrows(IOException.class)


@Synchronized

java의 synchronized 키워드를 사용하면 객체 레벨에서 락이 걸려 동기화 문제가 발생할 수 있음
@Synchronized를 사용하면 안전하게 락을 걸 수 있음
(java thread관련 참고)

참조: https://prinha.tistory.com/entry/자바-스프링-어노테이션-annotation의-정의와-종류
https://velog.io/@gillog/Spring-Annotation-정리
https://jeong-pro.tistory.com/151
https://dingue.tistory.com/14
https://n1tjrgns.tistory.com/164
https://www.daleseo.com/lombok-useful-annotations/
https://engkimbs.tistory.com/746
https://mangkyu.tistory.com/189 https://mangkyu.tistory.com/72
profile
개인 정리 공간

0개의 댓글