WEB/Spring

[Spring] 스프링 어노테이션 정리

노력의천재 2020. 4. 25. 01:59

Spring 관련

@Component

해당 클래스가 스프링에서 객체로 만들어서 관리하는 대상임을 명시하는 어노테이션

 

@ComponentScan

- @Component가 있는 클래스를 스프링이 읽어주도록 하는 어노테이션

 

@Controller, @Service, @Repository

- @Componet의 구체화, 컨테이너에 bean으로 등록되며 해당 클래스가 Controller/Service/Repository로 사용됨을 명시하는 어노테이션

 

@Autowired

- 스프링 내부에서 자신이 특정한 객체에 의존적이므로 자신에게 해당 타입의 빈을 주입해주라는 표시

- 스프링은 @Autowired 어노테이션을 보고 스프링 내부에 관리되는 객체들 중에서 적당한 것이 있는지를 확인하고, 자동으로 주입

 

@RequestBody

- HTTP 요청 몸체를 자바 객체로 전달받음

- HTTP 요청의 body 내용을 자바 객체로 매핑하는 역할

 

@ResponseBody

- 자바 객체를 HTTP 응답 몸체로 전송함

- 자바 객체를 HTTP 요청의 body 내용으로 매핑하는 역할

 

@RestController

- @Controller + @ResponseBody

 

@RequestParam

- 파라미터로 사용된 변수의 이름과 전달되는 파라미터의 이름이 다른 경우에 유용하게 사용

- 앞단에서 form 전송을 할 때 종종 사용

 

@RequestMapping

@Controller
@RequestMapping("/home") // 1) Class Level
public class HomeController {
    /* an HTTP GET for /home */ 
    @RequestMapping(method = RequestMethod.GET) // 2) Handler Level
    public String getAllEmployees(Model model) {
        ...
    }
    /* an HTTP POST for /home/employees */ 
    @RequestMapping(value = "/employees", method = RequestMethod.POST) 
    public String addEmployee(Employee employee) {
        ...
    }
}

// 출처 : https://gmlwjd9405.github.io/2018/12/02/spring-annotation-types.html

모든 매핑 정보는 Spring에서 제공하는 HandlerMapping Class가 가지고 있음

  1. Class Level Mapping
    1. 모든 메서드에 적용되는 경우
    2. "/home"로 들어오는 모든 요청에 대한 처리를 해당 클래스에서 한다는 것을 의미
  2. Handler Level Mapping
    1. 요청 url에 대해 해당 메서드에서 처리해야 되는 경우
    2. "/home/emplyoees" POST 요청에 대한 처리를 addEmployee()에서 한다는 것을 의미

※ value : 해당 url로 요청이 들어오면 이 메서드가 수행

   method : 요청 method를 명시, 없으면 모든 http method 형식에 대해 수행

 

@GetMapping

@PostMapping

@PutMapping

@DeleteMapping

 

@InitBinder or @DateTimeFormat

파라미터의 수집을 다른 용어로 바인딩(Binding)이라고 합니다. 변환이 가능한 데이터는 자동으로 변환되지만 경우에 따라서는 파라미터를 변환해서 처리해야하는 경우도 존재합니다. 스프링 Controller에서는 파라미터를 바인딩할 때 자동으로 호출되는 @InitBinder를 통해 이러한 변환을 처리할 수 있습니다.

 

@ModelAttribute

- 강제로 전달받은 파라미터를 Model에 담아서 전달하도록 할 때 필요한 어노테이션

- 타입에 관계없이 무조건 Model에 담아서 전달되므로, 파라미터로 전달된 데이터를 다시 화면에서 사용해야 할 경우에 유용하게 사용

 

@ControllerAdvice (with @ExceptionHandler)

- AOP 개념을 이용하는 방식

- Controller를 작성할 때 메서드의 모든 예외사항을 전부 핸들링해야 한다면 중복적이고 많은 양의 코드를 작성해야 함

- AOP 방식을 이용하면 공통적인 예외사항에 대해서는 별도로 해당 어노테이션을 이용해서 분리할 수 있음

- @ControllerAdvice는 해당 객체가 스프링의 컨트롤러에서 발생하는 예외를 처리하는 존재임을 명시하는 어노테이션

- @ExceptionHanlder는 해당 메서드가() 들어가는 예외 타입을 처리하는 어노테이션입니다.

 

Lombok 관련

@AllArgsConstructor

- 인스턴스 변수로 선언된 모든 것을 파라미터로 받는 생성자를 작성하는 어노테이션

- 만일 여러 개의 인스턴스 변수들 중에서 특정한 변수에 대해서만 생성자를 작성하고 싶다면 @NonNull이나 final을 이용(이 두개가 붙은 인스턴스 변수에 대한 생성자만 만들어내기 때문)

 

@NoArgsConstructor

- 기본 생성자를 자동으로 추가

 

@RequiredArgsConstructor

 

@Getter

- 클래스 내 모든 필드의 Getter 메소드를 자동으로 생성

 

@Setter

- setter 메소드를 생성해주는 역할, @Setter에는 다음과 같이 3가지의 속성을 부여할 수 있음

- value : 접근 제한 속성을 의미, 기본값은 lombok.AccessLevel.PUBLIC

- onMethod : setter 메소드 생성 시 메소드에 추가할 어노테이션을 지정

- onParam : setter 메소드의 파라미터에 어노테이션을 사용하는 경우에 적용

 

@Data

- Lombok에서 가장 자주 사용되는 어노테이션

- @ToString, @EqualsAndHashCode, @Getter/Setter, @RequiredArgsConstructor를 모두 결합한 형태로 한 번에 자주 사용되는 모든 메소드를 생성할 수 있다는 장점이 있음

- 세부적인 설정이 필요없는 경우라면 @Data를 주로 이용하는 것을 추천

 

@Builder

- 어느 필드에 어떤 값을 채워야 할 지 명확하게 정하여 생성 시점에 값을 채워줌

- 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함됨

 

※ 생성자 vs Builder

  • 생성 시점에 값을 채워주는 역할은 같음
  • 그러나 빌더를 사용하면 어느 필드에 어떤 값을 채워야 할 지 명확하게 인지할 수 있음
  • 해당 클래스의 빌더 패턴 클래스를 생성

@Log4j

- 로그 객체를 생성하는 어노테이션

 

JPA 관련

@Table

엔티티 클래스에 매핑할 테이블 정보를 알려줍니다.

ex) @Table(name = "USER")

이 어노테이션을 생략하면 클래스 이름을 테이블 이름 정보로 매핑합니다.

 

@Entity

테이블과 링크될 클래스임을 나타냅니다.

기본값으로 클래스의 카멜케이스 이름을 언더스코어 네이밍(_)으로 테이블 이름을 매칭

ex) SalesManger.java -> sales_manger table

 

@Id

해당 테이블의 PK(기본 키) 필드를 나타냅니다.

 

@GeneratedValue

@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

PK 생성 규칙을 나타냅니다.

스프링 부트 2.0에서는 GenerationType.IDENTITY 옵션을 추가해야만 auto_increment 됩니다.

 

@Column

 @Column(length = 500, nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    private String author;

테이블의 칼럼(열)을 나타내며, 굳이 선언하지 않아도 해당 클래스의 필드는 모두 칼럼이 됩니다.

사용하는 이유는 기본값 외에 추가로 변경이 필요한 옵션이 있는 경우 사용합니다.

 

@PrePersist

@PrePersist가 붙은 함수는 데이터베이스에 새 데이터가 저장되기 전에 자동으로 호출됨, 데이터 저장 전에 가입일을 현재 날짜로 지정해줄 때 유용함

 

@PreUpdate

마찬가지로 데이터 업데이트 명령을 날리기전에 자동으로 호출됨

 

Test 관련

@ContextConfiguration

스프링이 실행되면서 어떤 설정 정보를 읽어 들여야 하는지를 명시하는 어노테이션입니다. 속성으로는 locations를 이용해서 문자열의 배열로 XML 설정 파일을 명시할 수 있고, classes 속성으로 @Configuration이 적용된 클래스를 지정해 줄 수도 있습니다.

// 지정된 클래스나 문자열을 이용해서 필요한 객체들을 스프링 내에 객체로 등록하는 어노테이션(스프링의 빈으로 등록)

// XML
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml") 
// JAVA
@ContextConfiguration(classes = {RootConfig.class})

 

@Runwith

테스트 시 필요한 클래스를 지정하는 어노테이션입니다. 스프링은 SpringJUnit4ClassRunner 클래스가 대상이됩니다.

 

@Test

junit에서 해당 메소드가 jUnit상에서 단위 테스트의 대상인지 알려주는 어노테이션입니다.

 

Security 관련

@EnableWebSecurity

Spring Security 설정들을 활성화 시켜주는 어노테이션