스프링 공부를 하다가 기본적인 정의는 짚고 넘어가야될 것 같아서 정리를 하기로 했다.
백엔드 개발을 할 때도 모르는 부분은 그냥 검색만 하고 넘어갔는데 이 기회에 정리를 하고 어떤 annotation들이 있는지 파악하고 넘어가도 괜찮을 것 같다.
1. Annotation이란?
Annotation(@)은 사전적 의미로는 주석이라는 뜻이다.
자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술이다.
즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있다.(meta data : 데이터를 위한 데이터)
Annotation을 사용하면 코드량이 감소하고 유지보수하기 쉬우며, 생산성이 증가한다.
어노테이션이 하는 역할
- 컴파일러에게 문법 에러를 체크하도록 정보를 제공한다.
- 프로그램을 빌드할 때 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
- 런타임에 특정 기능을 실행하도록 정보를 제공한다.
2. Annotation의 종류
- 표준 어노테이션 - 메타 어노테이션 - 사용자 정의 어노테이션
자바에서 기본적으로 제공하는 어노테이션 @Override - 메서드를 오버라이딩하는 것 @Deprecated - 앞으로 사용하지 않을 대상임 @FunctionalInterface - 함수형 인터페이스 @SuppressWarning - 컴파일러가 경고메시지를 나타내지 않음 @SafeVaragrs - 제네릭과 같은 가변 인자의 매개변수를 사용할 때 경고를 표시하지 않음 |
어노테이션에 붙이는 어노테이션으로, 어노테이션을 정의한다. @Target - 어노테이션을 정의할 때 대상을 지정 @Documented - 정보를 javadoc로 작성된 문서에 포함 @Inherited - 어노테이션이 하위 클래스에 상속되도록 @Retention - 어노테이션이 유지되는 기간을 정함 @Repeatable - 어노테이션 반복 적용 |
사용자가 직접 정의해서 사용하는 어노테이션 |
3. Spring에서 사용되는 대표적인 Annotation
@Component
개발자가 생성한 Class를 Spring의 Bean으로 등록할 때 사용하는 Annotation입니다.
Spring은 해당 Annotation을 보고 Spring의 Bean으로 등록합니다.
@Controller
SpringMVC에서 해당 class가 Controller의 역할을 한다고 명시
@Restcontroller
컨트롤러가 rest 방식을 처리하기 위한 것임을 명시- 단순히 객체만을 반환하고 객체 데이터는 JSON, XML 형식으로 HTTP 응답에 담아서 전송
@Controller와 @RestController는 뭐가 다른지 궁금해서 찾아봤는데
@RestController == @Controller + @ResponseBody라고 생각하면 된다.
Spring4.0에서 RESTful 웹 서비스를 보다 쉽게 개발할 수 있도록 추가 되었다.
@Controller @ResponseBody
public class MVCController{
logic...
}
@RestController
public class ReftFulController{
logic...
}
두개 동일한 동작을 한다.
@Service
Service Layer 클래스에 사용
@ComponentScan
Spring Framework는 @Component, @Service, @Repository, @Controller, @Configuration 중 1개라도 등록된 클래스를 찾으면, Context에 bean으로 등록합니다. @ComponentScan Annotation이 있는 클래스의 하위 Bean을 등록 될 클래스들을 스캔하여 Bean으로 등록해줍니다.
@Configuration
설정클래스임을 명시하고 아래의 Bean을 사용해서 자바 객체를 수동으로 지정할 수 있다.
@Bean
스프링 컨테이너가 관리하는 자바객체로 수동 지정한다. 메소드 이름으로 빈 이름이 결정되므로 항상 unique하게 정해야 한다.
@Configuration으로 지정된 클래스에 작성한다.
@Autowired
Bean 객체를 주입받기 위한 방법은 3가지가 있다 ( @Autowired, 생성자, Setter ) 이 중에서 @Autowired를 사용할 수 있고 Spring Framework가 Class를 보고 Type에 맞게 Bean에 주입한다. - DI(의존성 주입)
@Repository
DAO 또는 Repository 클래스에 사용한다.
DataAccessException 자동변환과 같은 AOP 적용대상을 선정하기 위해 사용한다.
@RequestMapping("url-pattern")
호출하는 클라이언트의 정볼르 가져다가 서버(controller)에 전달해주는 역할
-> 간단하게 얘기하면 웹에서 요청이 들어왔을 때 어떤 컨트롤러가 호출이 되어야 하는지 알려주는 지표
@RequestMapping("/api/v1")
@PostMapping("url-pattern")
해당 Url을 post method일 때 매핑한다.
@GetMapping("url-pattern")
해당 Url을 get method일 때 매핑한다.
@ReqestParam
사용자가 전달하는 값을 1:1로 매핑해준다.
@RequestMapping("/request_mapping")
public String test(@RequestParam(name = "age") Integer age,
@RequestParam(name = "time") Date time ){
...
}
@PathVariable("key")
uri 템플릿 변수에 접근할 때 사용한다. uri에 있는 변수를 가져올 수 있다.
@GetMapping("/member/{shortUrl}")
public String shorten(@PathVariable("shortUrl") String shortUrl){
return "short: " + shortUrl;
}
@RequestHeader
Request의 header 값을 가져올 수 있으며, 해당 Annotaion을 쓴 메소드의 파라미터에 사용한다.
@PostMapping("/data")
public String getToken(@RequestHeader(value= "Authorization" String Auth){
// 요청 처리
}
@RequestBody
HTTP요청의 body내용에 접글할 때 사용한다.
@PostMapping("/data")
public String add(@RequestBody User user){
String name = user.name;
String age = user.age;
}
@RequiredArgsConstructor
Lombok에서 스프링에서 DI(의존성 주입) 방법 중에 생성자 주입을 임의의 코드없이 자동으로 설정해주는 어노테이션 final이나 @NonNull로 선언된 필드만을 파라미터로 받는 생성자를 자동 생성한다.
@RestController
@RequiredArgsConstructor
@RequestMapping("/example")
public class RequiredArgsConstructorControllerExample {
private final FirstService firstService;
private final SecondService secondService;
private ThirdService thirdService;
//final이 없기 때문에 직접 생성자를 주입시켜줘야 됨
...
}
//
//@RequiredArgsConstructor를 사용하지 않았을 때 직접 생성자를 주입시켜주는 모습
//
@RestController
@RequestMapping("/example")
public class RequiredArgsConstructorControllerExample {
private final FirstService firstService;
private final SecondService secondService;
private ThirdService thirdService;
@Autowired
public RequiredArgsConstructorControllerExample(FirstService firstService, SecondService secondService, ThirdService thirdService) {
this.firstRepository = firstRepository;
this.secondRepository = secondRepository;
this.thirdRepository = thirdRepository;
}
}
@AllArgsConstructor/NoArgsConstructor
AllArgsCon - 클래스의 모든 필드값을 파라미터로 받는 생성자를 자동으로 생성한다.
@AllArgsConstructor
public class Person {
private String name;
private int age;
// getters and setters
}
//어노테이션 사용하지 않을 경우
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
NoArgsCon - 파라미터가 없는 디폴트 생성자를 자동으로 생성한다.
@NoArgsConstructor
public class Person {
private String name;
private int age;
// getters and setters
}
//어노테이션 사용하지 않을 경우
public class Person {
private String name;
private int age;
public Person(){}
}
참고
https://ittrue.tistory.com/156
https://dncjf64.tistory.com/288