
내일배움캠프 18일차 TIL : Spring - Spring 어노테이션
어제는 lombok 어노테이션 했으니까 이번엔 Spring 어노테이션 정리해야겠다.
그리고 물론 다 하면 좋긴 하겠지만 일단 프로젝트에서 썼던 어노테이션을 위주로 먼저 정리하고 추후 한번에 혹은 여기에 다시 추가하는 형태로 정리하도록 하겠다.
결국 TIL이고 써봤던걸 이해하기 위해 적는거니까.
생성한 Class를 Spring Bean으로 등록할 때 사용하는 어노테이션이다.
@ComponentScan Annotation이 있는 클래스의 하위 Bean을 등록 될 클래스들을 스캔하여 Bean으로 등록한다.
Spring Framework는 @Component, @Service, @Repository, @Controller, @Configuration 중 1개라도 등록된 클래스를 찾으면, Context에 bean으로 등록한다.
개발자가 제어가 불가능한 외부 라이브러리와 같은 것들을 Bean으로 만들어 준다.
Spring MVC에서 사용하며 해당 Class가 Controller의 역할을 한다고 명시하기 위해 사용한다.
@Controller는 주로 View를 반환하기 위해 사용한다.
@RestController는 @Controller에 @ResponseBody가 추가된 것으로 Json 형태로 객체 데이터를 반환하기 위해 사용한다.
호출하는 클라이언트의 정보를 가져다 서버(controller)에 전달해주는 매핑
RequestMapping은 쉽게 말하자면 요청이 왔을 때 어떤 컨트롤러가 호출이 되어야 하는지 알려주는 지표 같은 것이다.
RequestMapping은 다중 요청도 가능하며 해당 기능은 요청들을 배열로 묶어 전달해줘야 한다.
RequestMapping은 value를 통해 요청받을 url을 설정하고, method를 통해 어떤 요청으로 받을지 정의하게 된다.
@RequestMapping(value = "/hello", method = RequestMethod.GET)
@RequestMapping(value = "/hello", method = RequestMethod.POST)
RequestMapping의 method 역할을 하는 어노테이션이다.
@RequestMapping("/api") // value만 존재한다면 value = "String"은 생략 가능
public class example() {
@GetMapping("/getSometing") // 예시 url
public String getExample() {}
@PostMapping("/postSometing")
public String postExample() {}
...
처럼 @RequestMapping의 method를 분담해준다.
/api/getsometing 으로 오는 요청을 담당한다.
@RequestMapping은 Class와 Method에 붙일 수 있고
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping들은 Method에만 붙일 수 있다.
뭐 어차피 쓰려고 하긴 했는데 필요성을 느낀건 이녀석들 때문이다.
개인 과제를 진행하면서 postman으로 api를 호출해봤는데 이거때문에 안된거... 아니 못했던거..
@RequestParam은 사용자가 전달하는 값을 1:1로 매핑한다.
/api/request-param 이라는 api가 존재할 때
/api/request-param?username="이름"&age="20"
처럼 url뒤에서 값을 전달해준다.
public String visit(@RequestParam(name = "username") String name,
@RequestParam(name = "age") Integer age,
Model model) {
public String visit(@RequestParam String name,
@RequestParam Integer age,
Model model) {
파라미터 변수명과 저장 하는 변수명이 똑같아야 함
public String visit(@RequestParam(required = true) String name,
@RequestParam(required = false) Integer age,
Model model) {
required = true가 default값이며 false인데 값이 들어오지 않는다면 null로 대체된다.
public String visit(@RequestParam(required = true) String name,
@RequestParam(required = false, defaultValue = "10") Integer age,
Model model) {
처럼 required=false일때 null대신 넣어줄 값을 지정한다.
Body에 전달되는 데이터를 메소드의 인자와 매칭시켜, 데이터를 받아서 처리할 수 있는 어노테이션으로 클라이언트가 보내는 HTTP요청 본문(Json과 같은)을 Java Object로 변환한다.
@Controller // 이 Class는 Controller 역할을 합니다
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
@RequestMapping(method = RequestMethod.POST)
public String addUser(@RequestBody User user) {
// POST method, /user 요청을 처리
String sub_name = user.name;
String sub_old = user.old;
}
}
@ResponseBody은 메소드에서 리턴되는 값이 View 로 출력되지 않고 HTTP Response Body에 직접 쓰여지게 된다. return 시에 json, xml과 같은 데이터를 return 한다.
@Controller // 이 Class는 Controller 역할을 합니다
@RequestMapping("/user") // 이 Class는 /user로 들어오는 요청을 모두 처리합니다.
public class UserController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public String getUser(@RequestParam String nickname, @RequestParam(name="old") String age {
// GET method, /user 요청을 처리
// https://naver.com?nickname=dog&old=10
User user = new User();
user.setName(nickname);
user.setAge(age);
return user;
}
}
Spring Framework에서 Bean 객체를 주입받기 위한 방법으로 Bean을 주입받기 위하여 사용한다.
크게 위 3가지 방법으로 객체를 주입받는다.
Spring Framework가 Class를 보고 타입에 맞게 Bean을 주입한다.
(타입을 먼저 확인하고 타입이 없다면 Name을 확인한다.