Annotation(@)은 사전상으로 주석의 의미이지만, Java에서는 주석 이상의 기능을 가지고 있다. 즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있다.
소스코드에 추가하면 단순 주석의 기능을 하는 것이 아니라 특별한 기능을 사용할 수 있다. Spring Framework는 해당 클래스가 어떤 역할인지 정하기도 하고, Bean을 주입하기도 하며, 자동으로 getter나 setter를 생성하기도 한다. 특별한 의미를 부여하거나 기능을 부여하는 등 다양한 역할을 수행할 수 있다.
이러한 Annotation을 통하여 코드량이 감소하고 유지보수하기 쉬우며, 생산성이 증가된다.
Spring Framework는 @Component, @Service, @Repository, @Controller, @Configuration이 붙은 클래스를 찾아서 Context에 bean으로 등록한다.
@ComponentScan Annotation이 있는 클래스의 하위 Bean을 등록 될 클래스들을 스캔하여 Bean으로 등록해준다.
ApplicationContext.xml에 < bean id="suyeon" class="suyeon" /> 과 같이 xml에 bean을 직접등록하는 방법도 있고, 위와 같이 Annotation을 붙여서 하는 방법도 있다.
개발자가 생성한 Class를 Spring의 Bean으로 등록할 때 사용하는 Annotation이다.
@Component
public class Woman {
public Woman() {
System.out.println("hi");
}
}
@Component(value="MyWoman")
public class Woman {
public Woman() {
System.out.println("hi");
}
}
Component에 대한 추가 정보가 없다면 Class의 이름을 카멜케이스로 변경한 것이 Bean의 id로 사용된다.
@Bean과 다르게 name이 아닌 value를 이용해 Bean의 id를 지정한다.
@Bean은 개발자가 직접 제어가 불가능한 외부 라이브러리와 같은 것들을 Bean으로 만들 때 사용한다.
Bean을 주입받기 위하여 @Autowired를 사용한다.
Spring Framework가 Class를 보고 Type에 맞게(Type을 먼저 확인 후, 없으면 Name을 확인) Bean을 주입한다.
Spring의 Controller를 의미한다. Spring MVC에서 Controller 클래스에 사용한다.
@Controller // 이 Class는 Controller 역할을 한다.
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리한다.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
public String getUser(Model model) {
// GET method, /user 요청을 처리
}
}
Spring의 Controller 중 View로 응답하지 않는, Controller를 의미한다.
method의 반환 결과를 JSON 형태로 바꾸고 HttpResponse에 담아 반환한다.
즉, @RestController = @Controller + @ResponseBody 이다.
💬 스프링이 오브젝트를 JSON으로 바꾸는 것처럼 오브젝트를 저장하거나 네트워크를 통해 전달할 수 있도록 변환하는 것을 직렬화(serialization)라고 하고, 반대의 작업을 역직렬화(deserialization)라고 한다.
API와 view를 동시에 사용하는 경우에 사용한다.
대신 API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환한다.
view(화면) return이 주목적이다.
view가 필요없는 API만 지원하는 서비스에서 사용한다. (Spring 4.0.1부터 제공)
@RequestMapping 메서드가 기본적으로 @ResponseBody 의미를 가정한다.
data(json, xml 등) return이 주목적이다.
@RequestMapping(Method=RequestMethod.GET)과 같다.
@PostMapping, @PutMapping, @PatchMapping, @DeleteMapping 등도 있다. ( (Spring 4.3부터 제공)
@RequestMapping(Method=RequestMethod.POST)과 같다.
URL의 경로로 넘어오는 값을 변수로 받을 수 있다.
REST API에서 값을 호출할 때 주로 많이 사용한다.
http://localhost:8080/1
@GetMapping("/{id}")
//(required = false) > 이 매개변수가 꼭 필요한 것은 아니라는 뜻.
public String testControllerWithPathVariables(@PathVariable(required = false) int id) {
return "Hello World! ID " + id;
}
@GetMapping("/user/{userId}/invoices")
public List<Invoice> listUsersInvoices(@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
}
위의 경우 GET /user/{userId}/invoices?date=190101 와 같이 URI가 전달될 때,
구분자 {userId}는 @PathVariable(“userId”)로,
뒤에 이어붙은 parameter는 @RequestParam(“date”)로 받아온다.
@PathVariable과 비슷하다.
?moviename={moviename} 와 같이 요청 매개변수로 넘어오는 값을 변수로 받을 수 있다.
HTTP GET 요청에 대해 매칭되는 request parameter 값이 자동으로 들어간다.
url 뒤에 붙는 parameter 값을 가져올 때 사용한다.
http://localhost:8080/home?page=2
@GetMapping("/home")
public String show(@RequestParam("page") int pageNum {
}
Body에 전달되는 데이터를 메소드의 인자와 매칭시켜, 데이터를 받아서 처리할 수 있는 Annotation이다.
클라이언트가 보내는 HTTP 요청 본문(JSON 및 XML 등)을 Java 오브젝트로 변환한다.
클라이언트가 body에 json, xml과 같은 형태로 값(주로 객체)을 전송하면, 해당 내용을 Java Object로 변환한다.
@ResponseBody은 메소드에서 리턴되는 값이 View로 출력되지 않고 HTTP Response Body에 직접 쓰여지게 된다. return 시에 json, xml과 같은 데이터를 return 한다.
이미 RestController Annotation이 붙어 있다면, 쓸 필요가 없다.
매개 변수가 없는 생성자(기본 생성자)를 구현해 준다.
클래스의 모든 멤버 변수를 매개변수로 받는 생성자를 구현해 준다.
클래스의 모든 멤버 변수의 Getter method를 생성해 준다.
클래스의 모든 멤버 변수의 Setter method를 생성해 준다.
클래스의 모든 멤버 변수의 ToString method를 생성해 준다.
@Getter @Setter @EqualsAndHashCode @AllArgsConstructor을 포함한 Lombok에서 제공하는 필드와 관련된 모든 코드를 생성해 준다.
실제로 사용하지 않는것이 좋다.
Builder는 오브젝트 생성을 위한 디자인 패턴 중 하나다.
어느 필드에 어떤 값을 채워야 할지 명확하게 정하여 생성 시점에 값을 채워준다.
참고 자료
🔗 https://melonicedlatte.com/2021/07/18/182600.html#1-annotation%EC%9D%B4%EB%9E%80
🔗 https://jang8584.tistory.com/299?category=282648