스프링 부트 어노테이션 사전

넙데데맨·2022년 8월 20일
3
post-custom-banner

어노테이션 정리

무지성 어노테이션 사용을 막기위해 코드 작성 시 어노테이션 사용 이유와 용도를 적어놓고 주석으로 처리하기로 했다.
두루뭉술하게나마 알고 있긴하지만 이런 식으로 쓰다보면 안 보고 쓸 수 있는 어노테이션이 많아지지 않을까

빈 등록 및 주입 관련 어노테이션

@SpringBootApplication

아래의 3개 어노테이션을 합쳐놓은 구성
@ComponentScan @Component 시리즈 어노테이션이 붙은 클래스를 발견해 빈으로 등록
@SpringBootConfiguration 환경설정 빈
@EnableAutoConfiguration spring.factories 내부에 여러 Configuration들을 조건에 따라 빈 등록

@ComponentScan

@Component, @Service, @Repository, @Controller, @Configuration, @Bean 같은 어노테이션이 사용된 클래스를 Context에 등록해준다.

@Component

클래스를 Bean으로 등록하기 위한 어노테이션이다.
@Component(value="beanName")
위와 같이 Bean의 이름을 지정해줄 수 있으며 지정하지 않을 시 class의 이름을 camelCase로 변경한 것을 사용한다.

@Bean

개발자가 컨트롤하기 쉽지 않은 외부 라이브러리를 Bean으로 등록하기 위한 어노테이션이다.

@Service @Repository @Controller

클래스를 Bean으로 등록하기 위한 어노테이션이다.
MVC 패턴에 맞게 개발 시 클래스들의 역할을 나타내는 용도로 사용한다.

@RestController

Controller 중 메소드의 반환 값을 JSON 형태로 반환한다.
@Controller와 @ResponseBody 기능이 추가된 느낌

@Configuration

설정용 클래스를 Bean으로 등록하기 위한 어노테이션

@Autowired

속성, Setter, 생성자에 사용하면 Type에 따라 Bean을 주입해준다.

@RequestMapping

@RequestMapping("요청 URL")
@RequestMapping("요청 URL, method=RequestMethod.요청 받는 형식")
요청 URL을 어떤 형식으로 요청 받을지 어떤 method가 처리할 지 mapping 해주는 어노테이션이다.

@PostMapping, @GetMapping, @PutMapping, @DeleteMapping

요청받을 형식을 지정받는 @RequestMapping이라고 생각하면 편하다. Post 형식이면 @PostMapping
사실상 이게 코드도 적게 쓰고 알아보기도 편해서 권장

@RequestBody

public String Test (@RequestBody UserVO userVO)
Body에 적혀져 요청된 값을 자바 객체로 변환시켜준다.

@ResponseBody

메소드에 선언하여 결과 값 자바 객체를 HTTP Body 내용으로 매핑하여 클라이언트로 전송하는 어노테이션

@RequestParam

URL 뒤에 붙는 파라미터 값을 가져올 때 사용하는 어노테이션

@GetMapping("/test")
public String Test(@RequestParam("index") int idx){}

/test?index=1 과 같이 uri가 전달되면 해당 파라미터를 받아온다.
@RequestParam 안의 이름과 uri 뒤에 전달인자의 이름이 같아야 한다.

@PathVariable

@Getmapping("/test/2")처럼 요청했을 시 뒤의 2를 받아오기 위해 사용하는 어노테이션
@PathVariable을 사용 후 받아올 형식을 지정한다.

public ResponseEntity<MemberDto> getMember(@PathVariable int number)

@Value

Properties 값을 불러오기 위해 사용하는 어노테이션
@Value("${secretKey}")

@PropertySource

@PropertySource("classpath:{경로}")
읽어들일 Properties 파일 지정하는 어노테이션

@PostConstruct

bean 초기화 후 한 번만 호출해도 되는 메소드에 사용한다.
주로 메소드에 사용한 후 메소드의 필드를 한 번만 초기화해도 될 때

JPA 어노테이션

@Entity

데이터베이스의 테이블과 일대일로 매칭되는 객체를 뜻한다.

@Table

DB에 저장될 실제 테이블 명칭을 정할수 있다.

@Column

저장될 데이터에 설정을 할 수 있다.

@Id

해당 테이블의 기본키로 설정될 컬럼을 지정

@GeneratedValue

지원 전략

기본 키 컬럼의 생성 방법을 정하는 어노테이션

AUTO

(persistence provider가) 특정 DB에 맞게 자동 선택

IDENTITY

기본키 생성 DB에 위임

SEQUENCE
  • DB의 특별한 시퀀스 컬럼을 이용
  • DB Sequence란 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트
TABLE

어떤 DBMS를 사용하더라도 동일하게 동작하기를 원할 경우 사용
데이터베이스에 키 생성 전용 테이블을 하나 만들고 이를 사용한다.

@Transient

Entity 객체에 속성으로 지정되어있지만 DB에는 저장하지 않을 속성을 지정할 수 있다.

@PersistenceContext

영속성관리를 위해 EntityManager를 자동 등록할 때 사용하는 어노테이션

@Mappedsuperclass

객체 입장에서 공통 매핑정보가 필요할 때 어노테이션으로 공통되는 필드가 있다면 상속받을 클래스에 선언하고 상속받아서 사용할 수 있다.

@OneToOne @OneToMany @ManyToOne @ManyToMany

다른 엔티티 객체를 필드로 정의했을 때 연관관계 매핑하기 위해 사용하는 어노테이션

fetch 전략

EAGER(즉시 로딩)

엔티티를 조회할 때 실제 엔티티를 조회

LAZY(지연 로딩)

엔티티를 실제 사용할 때 조회한다.
프록시 객체를 넣어놓고 사용할 시 실제 엔티티를 조회하는 방식

Default 값

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

@JoinColumn

연관관계 설정 시 매핑할 외래키를 설정한다.
연관관계를 설정할 때 외래키를 지정하지 않는다면 중간 테이블이 생긴다.

@JoinTable

다대다 연관관계 설정 시 외래키 관리 테이블에 대한 설정을 하는 어노테이션

@Query

개발자가 원하는 쿼리를 직접 짤 수 있게하는 메소드
JPQL을 사용해 직접 쿼리를 작성할 수 있다.

@Modifying

@Query로 쿼리를 작성할 때 Select를 제외 쿼리에서 사용되는 어노테이션이다.

@Transactional

클래스나 메서드에 붙여줄 경우 해당 범위 내 메서드가 트랜잭션이 되도록 해준다.
해당 영속성 컨텍스트를 생성해준다.

@JsonProperty

서버단은 Camel Case, 클라이언트단에서는 Snake Case를 사용하기 때문에 데이터의 Key값이 서로 달라 제대로 매핑이 안될 수 있다.
이런 상황을 방지하기 위해 JsonProperty를 통해 이름을 설정해 매핑을 제대로 시켜준다.

@JsonProperty("phone_number") // json으로 들어온 phone_number를 phoneNumber 필드와 매핑 시켜준다.
var phoneNumber;

또한 access 속성을 통해 접근 제어 역시 가능하다.
access 속성을 쓰기 적용으로 설정할 시 쓰기에만 접근을 허용해 응답결과를 생성할 때는 해당 필드는 제외된다.

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    @Column(nullable = false)
    private String password;

@JsonNaming

@JsonProperty를 적용할 컬럼이 많다면 일일이 써주는 것이 비효율적이다.
@JsonNaming 은 전략을 정해 해당 엔티티 클래스에 적용시켜 한번에 처리할 수 있도록 한다.

ElementCollection

값 타입을 컬렉션에 담아 사용하기 위한 어노테이션
DB에서는 따로 컬렉션을 저장할 수 없어 컬렉션에 해당하는 테이블을 하나 추가해 컬렉션을 구현한다.

테스트 관련 어노테이션

@SpringBootTest

스프링부트 어플리케이션 테스트에 필요한 거의 모든 의존성을 제공하는 어노테이션
통합 테스트를 제공하는 기본적인 스프링부트 테스트 어노테이션
Junit4 사용시 @SpringBootTest 기능은 반드시 JUnit의 SpringJUnit4ClassRunner 클래스를 상속 받는 @RunWith(SpringRynnver.class)와 함께 사용해야 한다.  
Junit5 사용 시 명시할 필요 없음

@Test

@Test가 선언된 메소드는 테스트를 수행하는 메소드가 된다.
Junit은 각각 테스트가 독립적 실행되는 것이 원칙임으로 @Test마다 객체를 생성

@Ignore

@Ignore가 선언된 메소드는 테스트를 실행하지 않게 한다.

@Before

@Test 메소드 실행마다 실행
@Test 메소드에서 공통 사용하는 코드를 @Before에 선언해 사용

@After

@Test메소드 실행마다 실행

@BeforeClass

@Test보다 먼저 한 번만 수행되어야 할 경우에 사용

@AfterClass

@Test보다 나중에 한 번만 수행되어야 할 경우에 사용

유효성 검증 어노테이션

유효성 검증 기능

@Valid

해당 객체에 대해 유효성 검사를 수행한다.

@Validated

@Valid의 기능을 포함한 스프링 제공 어노테이션
group을 지정해 특정 컬럼만 검증할 수 있다.

커스텀 Validation

@Target

이 어노테이션을 어디서 선언할 수 있는지 정의한다.
설정시 ElementType을 통해 설정한다.

@Retention

어노테이션이 실제로 적용되고 유지되는 범위를 설정한다.
RetetionPolicy를 통해 설정한다.
RetetionPolicy.RUNTIME 컴파일 이후에도 JVM에 의해 계속 참조
RetetionPolicy.CLASS 컴파일러가 클래스를 참조할 때까지 유지
RetetionPolicy.SOURCE 컴파일 전까지만 유지, 컴파일 이후 사라짐

@Constraint

Validator와 시켜주는 역할을 수행하는 어노테이션
validatedBy를 통해 매핑할 인터페이스를 지정한다.

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = TelephoneValidator.class)

문자열 검증

@Null

필드의 값으로 null값만 허용

@NotNull

필드의 값으로 null을 허용하지 않음
"" " "은 허용

@NotEmpty

필드의 값으로 null, ""을 허용하지 않음
" "은 허용

@NotBlank

필드의 값으로 null, ""," "을 허용하지 않음

최댓값/최소값 검증

BigDecimal, BigInteger, int, long 등의 타입을 지원

@DecimalMax(value = "$numberString")

$numberString보다 작은 값 허용

@DecimalMin(value = "$numberString")

$numberString보다 큰 값 허용

@Min(value = "$number)

$number보다 작은 값 허용

@Max(value = "$number)

$number보다 큰 값 허용

범위 검증

@Positive

양수 허용

@PositiveOrZero

양수 및 0 허용

@Negative

음수 혀용

@NegativeOrZero

음수 및 0 허용

시간 검증

@Future

미래 날짜 허용

@FutureOrPresent.

미래, 현재 날짜 허용

@Past

과거 날짜 허용

@PastOrPresent

과거, 현재 날짜 허용

이메일 검증

@Email

이메일 형식 검사 ""는 허용

자릿수 범위 검증

@Digits(integer = $number1, fraction = $number2)

$number1의 정수 자릿수와 $number2의 소수 자릿 수 허용

Boolean 검증

@AssertTrue

true 체크 null은 체크하지 않음

@AssertFalse

false 체크 null은 체크하지 않음

문자열 길이 검증

@Size(min = $number1, max = $number2)

number1 number1~number2 사이의 범위 허용

정규식 검증

@Pattern(regexp = "$expression")

정규식을 검사한다.

예외 처리

@(Rest)ControllerAdvice

Spring에서 제공하는 @(Rest)Controller에서 발생하는 예외 관리, 처리 기능 어노테이션
범위 설정을 별도로 하지 않을 시 전역 범위에서 예외를 처리한다.
basePackages 예외 관제하는 범위 설정

@ExceptionHandler

@(Rest)Controller가 적용된 빈에서 발생하는 예외를 잡아 처리하는 메서드 정의 시 사용
value 어떤 예외 클래스를 처리할 지 등록할 수 있으며 배열 형식도 전달 가능해 여러 예외 클래스를 등록할수도 있다.
ex) value = RuntimeException.class

application.properities

@Value

application.properties 파일에 설정된 값을 가져오기 위한 어노테이션
@Value("${springboot.jwt.secret}"

Lombok

@Getter

해당 필드에 대한 Getter 메소드 생성

@Setter

해당 필드에 대한 Setter 메소드 생성

@NoArgsConstructor

매개변수 없는 생성자 자동 생성

@AllArgsConstructor

모든 필드 매개변수로 갖는 생성자 자동생성

@RequiredArgsConstructor

필드 중 final이나 @NotNull이 설정된 변수를 매개변수로 갖는 생성자 자동생성

  • 의존성 주입 시 final로 객체를 선언하면 알아서 생성자 주입을 시키는 역할 또한 수행한다.

@ToString

필드의 값을 문자열로 조합해서 리턴
exclude 속성을 통해 제외할 필드를 선택할 수 있다.

@EqualsAndHashCode

객체의 동등성과 동일성을 비교하는 연산 메텍스트서드 생성
동등성 : 같은 정보를 가진 것
동일성 : 같은 객체

@Data

위의 어노테이션을 포괄하는 어노테이션

@Value

@Data와 비슷하지만 필드를 변경할 수 없는 불변객체를 생성한다.
사용 시 @Setter를 제외한 어노테이션들이 추가된다.

@Getter @AllArgsConstructor @ToString @EqualsAndHashCode @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)

@FieledDefaults

@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) 멤버 변수들을 private, final 설정하는 어노테이션

Swagger 관련 어노테이션

@ApiParam

문서 자동화를 위해 사용하는 어노테이션
해당하는 파라미터 문서화를 위해 사용하는 어노테이션이다.
@ApiParam(value="파라미터에 대한 설명",required=true) //required 속성은 해당 파라미터가 필수인지 아닌지에 대해 사용

2022.8.24 수정

2022.9.28 수정
유효성 검사 어노테이션 추가

2022.11.24 수정

  • JsonProperty, JsonNaming 추가
  • @RequiredArgsConstructor 의존성 주입
  • @Value

2022.11.25 수정

  • @PostConstruct 추가

2023.01.27 수정

  • @Value, @FieledDefaults 추가

2023/02.08 수정

  • @ApiParam 추가
profile
차근차근
post-custom-banner

0개의 댓글