Annotation은 자바 코드에 추가하는 마법 코드!
프레임워크가 특정 동작을 수행할 수 있도록 명시하고 전달하는 방식이라고 할 수 있다
예시로 @Override @controller @RestController 등등이 있다
: 로깅 라이브러리를 사용하기 위해 선언하는 annotation
→ 자동으로 logger를 추가한다.
로그 레벨
TRACE → DEBUG → INFO → WARN → ERROR : 레벨 순서대로 더 상세한 정보를 제공한다
@Slf4j
@RestController
public class Slf4jController {
@RequestMapping("/logging") //링크 맵핑 -> 뒤에 맵핑에서 좀 더 자세히 보쟈
String name = "sparta";
log.trace("문자 trace={}" ,name)
log.trace("문자 debug={}" ,name)
log.trace("문자 info={}" ,name)
log.trace("문자 warn={}" ,name)
log.trace("문자 error={}" ,name)
return "success"; //성공적으로 실행되면 success 반환됨!
: HTML을 반환할 때 사용한다 (View화면) - 예를 들어 Thymeleaf 사용해서 화면 보여주기
@Controller
public class ViewController {
@RequestMapping("/view") // view 페이지로 ~~
public String example() {
return "sparta";
}
}
: Json 데이터를 반환할 때 사용한다
→ @Controller 랑 @ResponseBody 의 역할 동시수행 !
@RestController
public class RestController {
@RequestMapping("/string") // string 페이지로 ~~
public String example() {
return "sparta";
}
}
: URL로 들어오는 요청을 Controller의 메서드와 연결해주는 annotation
method = RequestMethod.GET -> .HTTP메서드 요러케 표현하기
→ 모든 HTTP 메서드를 다 처리할 수 있다 (GET, POST, PUT 등등)
@RestController
@RequestMapping("/prefix")
public class RequestMappingController {
@RequestMapping(value = "/v1", method = RequestMethod.GET)
public String exampleV1() {
return "this is sparta!";
}
}
근데 이런 맵핑은 아래의 GetMapping이 좀 더 직관적이고 보기 좋다
더 편한 겟맵핑이 있는데 왜 리퀘스트를 쓰냐? RequestMapping은 보통 prefix 설정할때 쓰인다!
: @RequestMapping의 단축형, 주로 GET 요청을 처리한다.
@GetMapping("/v2")
비슷하게 다른 요청에서는 @PostMapping, @PutMapping, @DeleteMapping도 같은 방식으로 사용이 가능!
@RestController
@RequestMapping("/prefix") // -> 리퀘스트맵핑은 프리픽스 해주는걸로 많이 사용됨
public class RequestMappingController {
@GetMapping("/v2")
public String exampleV2() {
return "this is sparta!";
}
}
: URL 경로 일부를 따로 입력받아서 거기 넣어가지고 사용하고 싶을때 사용해보자
@RestController
@RequestMapping("/posts") //post라는 prefix 경로에
public class PathVariableController {
@GetMapping("/{postId}") //입력받아서 넣어주자
public String pathVariable(@PathVariable Long postId) {
return "Pathvariable 결과입니다 : " + postId;
}
}
ex) /posts/1 → postId = 1
: URL의 쿼리 파라미터를 받아오자
@RestController
public class RequestParamController {
@GetMapping("/users")
public String getUserByGender(@RequestParam String gender) {
return "gender = " + gender;
}
}
http://localhost:8080/users?gender=man 이러케 사용이 가능하다~~
: HTTP 요청의 Body 내용을 객체로 변환하여 받아오기 위해 사용
주로 POST 요청에서 JSON 데이터를 받는 경우!
반환값을 뷰 파일로 찾는 게 아니라, 응답으로 직접 보내라는 것 (ex- 문자열 그대로 출력하거나 JSON으로 보내기)
@RestController
public class RequestBodyController {
@PostMapping("/users")
public String createUser(@RequestBody User user) {
return "User name = " + user.getName();
}
}
위에서 봤듯이 @controller는 뷰를 찾는데에 쓰고 @RestBody는 반환값을 응답으로 직접 보낸 건데
이 두개를 쓰기 귀찮으니까~~ @RestController로 합쳐서 사용할 수 있음!
그러면 모든 메서드가 자동으로 @ResponseBody 처리된다
@RestController
public class TestController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring!";
}
}
위의 코드는 브라우저에서 localhost:8080/hello로 요청하면, 화면에 'Hello, Spring!' 이라는 글자가 그대로 출력된다.
→ 뷰 파일을 찾는 게 아니고, 그냥 'Hello, Spring!'이라는 값을 직접 보내주는 것이라는 점!
| ANNOTATION | 기능 |
|---|---|
| @Controller | HTML 뷰 반환용 |
| @RestController | API 데이터 반환용 |
| @RequestMapping | URL 경로 매핑 |
| @GetMapping | GET 요청 전용 |
| @PathVariable | URL 경로의 변수 사용 |
| @RequestBody | 요청 Body로부터 데이터 추출 |
| @Component | 스프링 빈으로 등록 (싱글톤 관리) |