ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 스프링 어노테이션 정리
    WEB/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 설정들을 활성화 시켜주는 어노테이션

     

    댓글

Designed by Tistory.