-
[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가 가지고 있음
- Class Level Mapping
- 모든 메서드에 적용되는 경우
- "/home"로 들어오는 모든 요청에 대한 처리를 해당 클래스에서 한다는 것을 의미
- Handler Level Mapping
- 요청 url에 대해 해당 메서드에서 처리해야 되는 경우
- "/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 설정들을 활성화 시켜주는 어노테이션
'WEB > Spring' 카테고리의 다른 글
[Spring] The prefix "mybatis-spring" for element "mybatis-spring:scan" is not bound. (0) 2020.05.28 [Spring Boot] h2 Database 인덱스 auto_increment 초기화 (0) 2020.05.05 [Spring] 어노테이션(Annotation)을 이용한 스프링 설정 (0) 2020.04.06 [Spring] 생명주기(Life Cycle) (0) 2020.04.05 [Spring] 의존 객체 선택 (0) 2020.04.04 - Class Level Mapping