본문 바로가기
학습/Spring

[spring] 스프링 어노테이션 및 메소드 정리

by KKambi 2020. 5. 10.

Java

Annotation Detail
@interface

- 어노테이션 클래스에 선언

- 이 파일을 어노테이션 클래스로 선언

- 해당 클래스명을 가진 어노테이션이 생성되었다고 보면 됨!

1
2
3
4
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser{
 
}
 
@Target

- 어노테이션 클래스에 선언

- 이 어노테이션이 위치할 수 있는 곳을 결정한다

- ElementType.PARAMETER의 경우, 메소드의 파라미터로 선언된 객체에서만 사용가능

@Retention

- 어노테이션 클래스에 선언

- 이 어노테이션이 어떤 시점까지 유지될 수 있는지 결정한다

- 값 미지정 시 default = RetentionPolicy.CLASS

- 종류 = CLASS / RUNTIME / SOURCE

  • CLASS: 컴파일러에 의해 클래스 파일에선 유지되지만, 런타임 시 클래스를 메모리로 읽으면 사라진다
  • RUNTIME: 런타임까지 유지되므로, reflectively하게 읽힐 수 있다 -> 코드에서 이 정보를 바탕으로 로직을 구현할 수 있다
  • SOURCE: 컴파일러에 의해 버려진다 (주석 느낌)
@Override

- 오버라이딩하는 메소드에 선언

- 어노테이션이 없는 오버라이딩과의 유일한 차이: 안전장치 (실수방지)

@Aspect

- Aspect로 사용할 클래스에 선언

- AspectJ에 의해 Aspect로 사용될 것임을 의미

 

 

 

Spring & Spring Boot

Annotation Detail
@SpringBootApplication

- 프로젝트의 최상위 Application 클래스에 선언

- React의 최상단에서 ReactDOM이 최상위 컴포넌트를 렌더링하는 것을 생각

- @SpringBootApplication이 있는 위치부터 설정을 읽어가므로 프로젝트의 최상단에 위치

- 스프링부트의 자동설정, 스프링Bean읽기와 생성을 모두 자동으로 설정

- 어노테이션이 붙은 클래스의 main 메소드에서 실행하는 SpringApplication.run으로 내장 WAS 실행

@RestController

- 컨트롤러 클래스에 선언

- JSON을 반환하는 컨트롤러 생성

- 과거에는 @Controller를 사용 시, JSON를 반환하는 메소드마다 @ResponsBody를 선언해야 했다고 함

@GetMapping

@PostMapping

@PutMapping

@DeleteMapping

@PatchMapping

- HTTP Method에 매칭되는 메소드에 선언

- for standard Spring MVC controller methods

- 과거에는 @RequestMappng(method = RequestMethod.GET)이었다고 함

@RequestBody
@ResponseBody

- @RequestBody는 메소드의 인자 앞에 선언
- HTTP 요청의 body 내용을 자바 객체로 매핑

- @ResponseBody는 메소드에 선언
- 자바 객체를 HTTP 요청의 body 내용으로 매핑

@WebMvcTest

- 테스트 클래스에 선언

- Web(Spring MVC)에 집중할 수 있는 어노테이션

- 모든 자동설정을 비활성화시키고, MVC테스트에 관련된 설정만 적용한다

- 이를 명시하고, MockMvc를 @Autowired하면 해당 객체를 통해 MVC테스트 가능

- 함께 사용가능: @Controller / @ControllerAdvice / @JsonComponent 등

- 함께 사용불가능: @Service / @Component / @Repository / @SpringBootTest 등

@Autowired

- 멤버 필드에 선언

- 스프링 컨테이너가 관리하는 Bean을 주입받도록 한다.

@MockBean

@MockBean("덮어쓸 기존 Bean의 이름")

- 테스트 코드에서, 필요한 인스턴스에 선언

- 기존에 사용되던 Bean의 껍데기만 가져오고, 내부의 구현부는 사용자에게 위임한다.

- 해당 Bean의 어떤 메소드 Arguments / Return 을 조작할 수 있다.

- MockBean을 선언한 인스턴스의 메소드를 사용하고, thenReturn(개발자 지정 리턴값) 메소드를 체이닝함으로써 반환값을 조작할 수 있다.

MockMvc

- org.springframework.test.web.servlet.MockMvc

- Web Application을 서버에 배포하지 않고도 Web API를 테스트할 수 있음

- 이 클래스를 통해 HTTP GET, POST 등에 대한 테스트 가능

perform( )

- MockMvc 객체의 perfomr( ) 메소드를 이용하여 HTTP Request에 대한 요청 진행

param( )

- import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders

- MockMvc 객체의 perform 메소드 안에서, http method 메소드에 체이닝되어 사용

- API 테스트에서 사용될 요청 파라미터를 설정

- String 값만 허용

- 따라서, 숫자/날짜 등의 데이터를 등록할 때 문자열 변환 메소드를 사용

ex) String.valueOf(1000)

jsonPath( )

- import static org.springframework.test.web.servlet.result.MockMvcResultMatchers

- JSON 응답값을 필드별로 검증할 수 있는 메소드

- $를 기준으로 필드명 명시

mvc.perform(
       get("/hello/dto")
           .param("name", name)
           .param("amount"String.valueOf(amount)))
       .andExpect(status().isOk())
       .andExpect(jsonPath("$.name", is(name)))
       .andExpect(jsonPath("$.amount", is(amount)));
@RequestParam

- 메소드의 파라미터 부분에 선언

- 외부에서 API를 호출할 때 입력한 쿼리스트링을 가져오는 어노테이션

@PathVariable

- 메소드의 파라미터 부분에 선언

- 외부에서 API를 호출할 때 Mapping Annotation에서 지정한 변수를 가져오는 어노테이션

@Transactional

- org.springframework.transaction.annotation

- 메소드 상단에 선언

- 트랜잭션 기능이 적용된 프록시 객체가 생성

- @Transactional이 포함된 메소드가 호출 될 경우, PlatformTransactionManager를 사용하여 트랜잭션을 시작하고, 정상 여부에 따라 Commit 또는 Rollback
- MySQL일 경우 Inno일때만 트랜잭션이 작동

- proxy를 사용할 때 반드시 public 메소드에 사용

- (readOnly = true) 옵션을 통해 조회 전용 + 조회 속도의 개선

Model

- org.springframework.ui.Model;

- 서버 템플릿 엔진에서 사용할 수 있는 객체 저장

- GetMapping이 이루어지는 인덱스 컨트롤러의 라우팅 메소드에서 파라미터로 받고, 템플릿에서 불러오는 이름으로 속성을 추가해주면 된다.

- ex) postsService.findAll( ) 에서 가져온 결과를 mustache에 전달하는 매개체

@GetMapping("/")
public String index(Model model){
    // posts는 mustache에서 불러오는 이름
    model.addAttribute("posts", postsService.findAll( ));
   return "index";
}
@Bean / @Component

- IOC Container에 등록할 자바 객체들에 선언

- @Bean: 개발자가 컨트롤할 수 없는 외부 클래스를 Bean으로 등록할 때

  • 외부 클래스의 인스턴스를 생성하여 반환하는 메소드를 만든다
  • 그 메소드에 선언한다

- @Component: 개발자가 컨트롤할 수 있는 클래스(직접 작성한 클래스)를 등록할 때

  • 직접 작성한 클래스에 선언한다

 

 

 

 

 

 

 

 

 

Lombok

- AccessLevel.PRIVATE / PROTECTED / PUBLIC / NONE을 사용하여 접근지정자를 설정할 수 있다.

Annotation Detail
@Getter / @Setter

- DTO 클래스에 선언

- 멤버 필드에 개별적으로 선언할 수도 있음

@RequiredArgsConstructor

- 클래스에 선언

- 선언된 모든 final 필드 / @NonNull 필드를 파라미터로 받는 생성자 추가

- final / @NonNull이 없는 필드는 생성자에 포함되지 않음

@NoArgsConstructor

- 클래스에 선언

- 기본 생성자 자동 추가 (public)

- public Posts( ) { } 를 자동으로 추가한다고 생각!

cf) builder 패턴을 생성하는 @Builder를 생성자에 선언한다면, 기본 생성자가 필요하기에@NoArgsConstructor는 찰떡궁합!

@Builder

- 생성자 / 클래스에 선언

- 해당 생성자를 빌더 패턴으로 사용할 수 있도록 빌더 메소드 자동 추가

- 클래스에 선언 시, 모든 멤버 필드에 대해 빌드를 허용하는 문제점 발생!

- 생성자에 선언 시, 이 생성자에 포함된 필드만 빌더에 포함된다.

 

 

 

JUnit & AssertJ

Category
Annotation Detail
JUnit @RunWith(연결자)

- 테스트 클래스에 선언

- 테스트 진행 시 JUnit에 내장된 실행자 외에 다른 실행자를 설정가능

- 책에서는 SpringRunner.class 사용 (SpringJUnit4ClassRunner와 동일)

- 스프링부트 테스트와 Junit 사이의 연결자 역할

JUnit @Test

- 테스트 메소드에 선언

- 단위 테스트를 위한 라이브러리 JUnit이므로, 각 테스트가 독립적으로 실행

- @Test마다 객체를 생성하여 내부적으로 실행

AssertJ assertThat

- assertj라는 테스트 검증 라이브러리의 검증 메소드

- 검증하고 싶은 대상을 메소드 인자로 입력

- 메소드 체이닝 지원 (isEqualTo, ...)

AssertJ isEqualTo

- asserj의 동등 비교 메소드

- assertThat(A).isEqualTo(B)일 때, A == B 이면 성공

JUnit @After

- JUnit에서 단위 테스트가 끝날 때마다 수행되는 메소드에 선언

- 용도

  • 배포 전, 전체 테스트를 수행할 때, 테스트 간 데이터 침범을 막기 위해
  • 여러 테스트를 수행할 때, 테스트용 DB인 H2에 방해가 될 수 있는 이전 데이터가 남아있을 때

 

 

 

JPA(Java Persistence API)

Annotation Detail
@Entity

- 테이블과 링크될 클래스에 선언 (객체로 사용할 테이블)

- 클래스의 카멜케이스를 언더스코어 네이밍으로 하여 테이블을 생성

ex) SalesManager.java -> sales_manager tb

@Id - 해당 테이블의 id 필드에 선언
@GeneratedValue

- 해당 필드의 자동 생성 전략을 설정가능

- auto_increment를 위해선 strategy = GenerationType.IDENTITY 인자를 추가해야 함 (boot 2.0 이상)

 

@Column

- 테이블의 칼럼이 될 멤버 필드에 선언

- 선언하지 않아도 @Entity Class의 필드는 모두 칼럼이 된다

- 선언하면, 기본값 외의 추가 옵션을 설정할 수 있다.

ex) 문자열의 경우 VARCHAR(255)의 기본값 사이즈를 바꿀 수 있다.

ex) 문자열 기본 타입을 TEXT로 변경할 수 있다.

@Query("SQL Query")

- 메소드에 선언

- 필요한 쿼리메소드를 SpringDataJPA에서 제공하지 않을 때, 직접 SQL쿼리를 메소드에 할당할 수 있음

 

@Enumerated( TYPE )

- 테이블의 칼럼이 될 멤버 필드에 선언

- Enum 값을 어떤 형태로 저장할지 결정

- 기본 = int로 된 숫자

- 숫자로 저장되면 DB확인 시, 그 값이 어떤 의미인지 알 수 없으므로

@Enumerated(EnumType.STRING)을 애용하자!

 

 

 

Spring Security

Annotation Detail

@EnableWebSecurity

+

extends WebSecurityConfigureAdapter

- 보안 설정이 필요한 클래스에 선언

- Spring Security 설정들을 활성화

- 함께 사용

- 인증 / 권한부여 / 로그인, 로그아웃 페이지의 렌더링 등

@WithMockUser

- 모의 사용자가 필요한 테스트 메소드에 선언

- 인증된 모의 사용자 설정 가능

- roles="권한이름"

   
   

 

 

 

 

 

<참고>

스프링 부트와 AWS로 혼자 구현하는 웹 서비스_이동욱

https://goddaehee.tistory.com/167

https://cchoimin.tistory.com/entry/Transactional-%EC%84%B8%ED%8C%85-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95

https://spring.io/blog/2013/07/03/spring-security-java-config-preview-web-security

 

댓글