Annotation 정리

승환·2025년 1월 18일

📌 어노테이션?

어노테이션은 다른 프로그램에게 유용한 정보를 제공하기위해 사용되는 것으로
주석과 같은 의미를 가진다.

사전적 정의는 이러한데, 사실 사용될 때 보면 정말 많은 정보와 기능을 담고 있다.
어노테이션을 사용한 프로그래밍은 유지보수적, 코드 가독성에 정말 많은 도움을 주니까
꼭 알아두도록 하자.


📌 어노테이션의 역할과 종류

어노테이션의 역할

  • 컴파일러에게 문법 에러를 체크하도록 정보를 제공한다.
  • 프로그램을 빌드할 때 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
  • 런타임에 특정 기능을 실행하도록 정보를 제공한다.

어노테이션의 종류
어노테이션은 크게 세 종류로 구분할 수 있다.

  • 표준 어노테이션
  • 메타 어노테이션
  • 사용자 어노테이션

표준 어노테이션

자바에서 기본적으로 제공하는 어노테이션이다.
@Override가 대표적인 표준 어노테이션이다.

메타 어노테이션

어노테이션에 붙이는 어노테이션으로, 어노테이션을 정의하는 것에 사용한다.
이게 대체 무슨말인가 하면 표준 어노테이션의 적용 범위나 주석(스키마)를 단다고 생각하면 된다.

사용자정의 어노테이션

말 그대로 어노테이션을 붙이면 사용자가 원하는 행동을 할 수 있도록 정의할 수 있게 하는 것이다.
TestCase포스트에서 Valid를 사용하면서 MyNotNull 어노테이션을 만들면서 jakarta 어노테이션을 만든 적이 있었는데, 이런 것이 사용자 어노테이션이다.

장점으로는 표준 어노테이션과 다르게 행동을 정의할 수 있다는 점이 있지만,
행동을 제약하려면 특정한 방식 즉 나름의 프레임 워크를 따라 가야해서 어느정도는 규칙을 지켜야 한다.


📌 Spring Boot 에서 많이 쓰는 어노테이션

아래는 스프링 부트에서 정말 많이 사용되는, 그리고 자바에서도 많이 사용되는 어노테이션들이다.
점점 알게 될 수록 추가할 예정이다.

@Validated

메서드 파라미터의 검증을 위해 사용함

@Tag

API 그룹 설정
테그에 설정된 name이 같은 것끼리 하나의 api그룹으로 묶음
controller나 Controller의 메서드 영역에 설정

@Schema

모델에 대한 정보를 작성함
각 필드값들에 대한 설명이나 기본값, 허용가능한 값 등 api문서를 더 상세히 기술하는 것에 사용함.

@Operation

API동작에 대한 명세를 작성하기 위해 사용
summary에는 간략한 설명, description에는 상세 설명을 기제한다.

@Parameter

파라미터에 대한 설명을 작성한다. name에 반드시 해당 파라미터의 이름을 적어야한다.

@PostMapping

API POST요청을 처리한다.
뒤에 있는 주소로 POST를 하여 받은 데이터를 저장한다.

@RequsetBody

API POST,PUT,PATCH와 같이 사용한다. 요청 본문에 있는 데이터를 전송한다.

@Data

아래의 클래스에 있는 getter,setter을 자동으로 생성해준다.

@ApiResponses, @ApiResponse

api 코드에 대한 반환 값을 입력한다.

@SecurityRequirements

API엔드포인트에서 보안 요구사항을 정의
아무것도 없다면 보안 요구사항을 무효화하거나 변경하는 것

@GetMapping

http GET요청을 처리한다
뒤에 있는 주소로 GET을 해서 받아온다

@NoArgsConstructor:

기본 생성자를 자동으로 생성.

@AllArgsConstructor:

모든 필드를 초기화하는 생성자를 자동으로 생성.

@SequenceGenerator

예시
@SequenceGenerator(name="EMP_SEQ", allocationSize=25)
속성

  • name
    필수 속성이며 @GeneratedValue의 설정된 name을 설정하면 해당 @GeneratedValue가 붙은 컬럼에 적용된다.
  • allocationSize
    선택사항이며 시퀀스 번호가 증가할 때 증가할 양을 설정한다.
  • catalog
  • 선택사항이며 시퀀스의 카탈로그 이다.
  • initialValue
    선택사항이며 시퀀스의 시작값을 설정한다.
  • schema
    선택사항이며 시퀀스의 스키마이다.
  • sequenceName
    데이터베이스에 저장될 시퀀스 개체의 이름을 설정한다.

@Id/ @GeneratedValue

@Id는 PK를 형성해주는역할을 함
@ GeneratedValue를 같이 사용해서 4가지 방법으로 자동생성하는 방법이 있음

  1. @GeneratedValue(strategy = GenerationType.IDENTITY)
    기본키 생성을 데이터베이스에게 위임하는 방식
    데이터베이스가 자동으로 생성하게 된다.
    JPA가 처리할때 데이터베이스에 먼저 insert쿼리를 실행 해서 PK를 먼저 받아오는 방식

  2. @GeneratedValue(strategy = GenerationType.SEQUNCE)
    DB의 Sequence Object를 이용해서 DB가 생성한다
    @SequenceGenerator가 필요함
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
    generator="USER_PK_GENERATOR")
    이렇게 사용하는데, generator에는 SquenceGenerator의 이름이 들어가야 한다.
    DB에서 받아와서 생성하고 allocationSize로 증가 범위를 조절한다.

  3. @GeneratedValue(strategy = GenerationType.TABLE)
    테이블을 이용해서 생성한다.
    방식은 Seq방식과 동일하지만 최적화되지 않은 것을 사용하기 때문에 성능에 이슈가 있다

  4. @GeneratedValue(strategy = GenerationType.AUTO)
    기본 설정 값으로 자동 생성한다.

@Builder

변수를 .변수명(값)으로 지정할 수 있게 해주는 패턴이다. 유지보수가 용이하다.

@Autowired

생성자,수정자의 의존성을 자동으로 주입한다.

@Param

메서드 매개변수를 명시적으로 연결해주는 역할을 한다.

@Column

name : 필드와 매핑할 테이블의 컬럼 이름
nullable : null값의 허용 여부 설정. 기본값은 true

@Table

엔티티와 매핑할 테이블을 지정
name : 매핑할 테이블 이름
schema : DB에서 schema를 매핑

@Schema

description : 클래스나 필드의 대한 설명 추가
example : 문서에서 보여줄 예제 값을 설정
minimum(필드) : 최소값 제한
maximum(필드) : 최대값 제한

@Enumerated

EnumType.ORDINAL, EnumType.STRING
enum의 값이나 이름을 데이터베이스에 저장한다.

@Transient

엔티티 내부에서 DB와 매핑되지 않도록 한다.

@Component

Autowired가 가능하도록 SpringBean에 등록한다.
String으로 빈의 이름을 설정할 수 있음

@RequestBody

HTTP요청을 자바 객체로 변환하여 객체에 저장한다.

@RequiredArgsConstructor

의존성 주입 방법중에 생성자 주입을 임의의 코드없이 자동으로 설정해 줌

@Slf4j

추가 로깅 인터페이스로 디버깅 상세화 제공

@RequestParam

Http에서 해당 이름으로 바인딩 할 수 있게 한다.

profile
왕초보 학부생

0개의 댓글