본문 바로가기
Spring

[Spring] SpringBoot(스프링부트) + Lombok(롬복) + JPA + Spring Security(스프링 시큐리티) + Junit 프로젝트에서 사용한 대표적인 어노테이션 정리

by 개발하는 지토 2020. 7. 10.

 

JAVA SPRING

스프링 개발을 하다 보면 정말 많은 어노테이션을 만나게 된다.

 

물론 자주 쓰이는 어노테이션의 쓰임새는 다들 알고 있겠지만 가끔 헷갈리는 어노테이션이 있다.

 

때마다 찾지 않고 바로 볼 수 있도록 자주 쓰이는 어노테이션을 정리해서 끄적여보겠다.

 

※ 틀린 정보는 댓글에 피드백 해주세요!!

 

- 이번에 진행한 프로젝트에서 사용했던 어노테이션을 위주로 정리함 -

Spring 어노테이션

Spring에서 지원하는 어노테이션이다.

Spring

@Autowired: 스프링이 관리하는 빈(Bean)을 주입받는다.

 

@GetMapping: HTTP Method인 Get의 요청을 받을 수 있는 API를 만들어줌

 

@RequestMapping: HTTP Method의 요청을 받을 수 있는 API를 만들어줌

ex) @Requestmapping(method = RequestMehod.GET) 등…

 

@RequestParam: 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션

 

@RestController: 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어 줌
예전에 @ResponseBody를 각 메서드마다 선언했던 것을 한 번에 사용할 수 있게 해 줌

 

@SpringBootApplication: 스프링 부트의 자동 설정, 스프링 Bean 읽기와 생성을 모두 자동으로 설정함
해당 어노테이션이 있는 위치부터 설정을 읽어가기 때문에 이 클래스는 항상 프로젝트의 최상단에 위치해야만 함

 

Spring Security(스프링 시큐리티)

@EnableWebSecurity: Spring Security 설정들을 활성화시켜줌

 

Spring Test & Junit

@After: Junit에서 단위 테스트가 끝날 때마다 수행되는 메서드를 지정
보통은 배포 전 전체 테스트를 수행할 때 테스트 간 데이터 침범을 막기 위해 사용함
여러 테스트가 동시에 수행되면 테스트용 데이터베이스에 데이터가 그대로 남아 있어 다음 테스트 실행 시 테스트가 실패할 수 있으므로 @After 어노테이션을 사용해서 테스트가 끝날 때 저장소의 데이터를 삭제함

 

@RunWith:

테스트를 진행할 때 Junit에 내장된 실행자 외에 다른 실행자를 실행시킴
ex) @RunWith(SpringRunner.class) -> SpringRunner라는 스프링 실행자를 사용함
즉, 스프링 부트 테스트와 Junit 사이에 연결자 역할을 함

 

@SpringBootTest: 통합 테스트를 제공하는 기본적인 스프링 부트 테스트 어노테이션
애플리케이션이 실행될 때의 설정을 임의로 바꾸어 테스트를 진행할 수 있으며 여러 단위 테스트를 하나의 통합된 테스트로 수행할 때 적합함

 

@WebMvcTest: 여러 스프링 테스트 어노테이션 중, Web(Spring MVC)에 집중할 수 있는 어노테이션
선언할 경우 @Controller, @ControllerAdvice 등을 사용할 수 있다
단, @Service, @Component, @Repository 등은 사용할 수 없다

 

@WithMockUser: 자동으로 SecurityContext 오브젝트 및 Authentication 오브젝트가 생성돼 @WithMockUser 어노테이션의 속성에서 지정한 대로 UserDetails 오브젝트가 설정됨
ex) @WithMockUser(roles="USER")

JPA 어노테이션

@Column: 테이블의 칼럼을 나타내며 굳이 선언하지 않더라도 @Entity가 적용된 클래스의 필드는 모두 칼럼이 된다.
사용하는 이유는, 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용함
문자열의 경우 VARCHAR(255)가 기본값인데, 사이즈를 500으로 늘리고 싶거나(ex:title), 타입을 TEXT로 변경하고 싶거나(ex:content) 등의 경우에 사용됨

 

@CreatedDate: Entity가 생성되어 저장될 때 시간이 자동 저장됨

 

@EnableJpaAuditing: JPA Auditing을 활성화하기 위한 어노테이션

 

@Entity: 테이블과 링크될 클래스임을 나타냄
기본값으로 클래스의 카멜 케이스 이름을 언더스코어 네이밍(_)으로 테이블 이름을 매칭함
ex) SalesManager.java -> sales_manager table

 

@EntityListeners: @EntityListeners(AuditingEntityListener.class) -> 해당 클래스에 Auditing 기능을 포함시킴 (Auditing: 생성, 수정시간을 체크함)

 

@Enumerated: JPA로 데이터베이스로 저장할 때 Enum 값을 어떤 형태로 저장할지를 결정함
기본적으로는 int로 된 숫자가 저장됨
숫자로 저장되면 데이터베이스로 확인할 때 그 값이 무슨 코드를 의미하는지 알 수가 없음 그래서 아래의 방법을 사용
ex) @Enumerated(EnumType.STRING) -> 문자열(EnumType.STRING)로 저장될 수 있도록 선언해서 사용함

 

@GeneratedValue: PK의 생성 규칙을 나타냄
스프링 부트 2.0에서는 GenerationType.IDENTITY 옵션을 추가해야만 auto_increment가 됨
스프링 부트 2.0 버전과 1.5 버전의 차이는 이곳을 참고

 

@Id: 해당 테이블의 PK 필드를 나타냄

 

@LastModifiedDate: 조회한 Entity의 값을 변경할 때 시간이 자동 저장됨

 

@MappedSuperclass: JPA Entity 클래스들이 BaseTimeEntity을 상속할 경우 필드들(createdDate, modifiedDate)도 칼럼으로 인식하도록 함
JPA Entity 클래스가 해당 클래스를 상속할 경우 필드들도 칼럼으로 인식하도록 함

 

@Query: SpringDataJpa에서 제공하지 않는 메서드를 쿼리로 작성할 때 사용함
ex) @Query("SELECT * FROM EXAMPLE")

 

@RequiredArgsConstructor: 선언된 모든 final 필드가 포함된 생성자를 생성해줌
final이 없는 필드는 생성자에 포함되지 않음

LomBok(롬복) 어노테이션

@Builder: 해당 클래스의 빌더 패턴 클래스를 생성
생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함

 

@Getter: 클래스 내 모든 필드의 Getter 메서드를 자동 생성

 

@NoArgsConstructor: 기본 생성자 자동 추가
public 클래스명() {}와 같은 효과

해당 어노테이션의 사용으로 @Autowired를 대신함

댓글