자바에서 Annotation은 코드 사이에 주석처럼 쓰이며, 특별한 의미, 기능을 수행하도록 하는 기술이다. 추가적인 정보를 제공해주는 메타데이터
Slf4j는 Logback 라이브러리를 이용해 로그를 남기기 위한 공통 인터페이스이다.
application은 Slf4t를 이용하여 로깅 라이브러리가 어떤 것이든 같은 방법으로 로그를 남길 수 있게 된다.
장점 : 나중에 더 좋은 라이브러리가 생겨 교체하더라도, application의 코드를 변경할 필요가 없다
로깅이란? 정보를 제공하는 일련의 기록인 로그(log)를 생성하도록 시스템을 작성하는 활동.
Thread 정보, 클래스 이름과 같은 부가 정보를 함께 확인할 수 있다.
실제 운영 환경에서는 System.out.println();을 사용하여 Console에 정보를 출력하지 않고, 별도의 로깅 라이브러리를 사용하여 로그를 출력한다.
Log Level : TRACE > DEBUG > INFO > WARN > ERROR
오른쪽으로 갈수록 심각한 오류를 의미
@Component
public class Student {
public Student() {
System.out.println("hi");
}
}
@Component(value = "mystudent")
public class Student {
public Student() {
System.out.println("hi");
}
}
여기서 스프링 빈(Spring Bean)이란?
스프링 컨테이너가 관리하는 자바 객체를 빈(Bean)이라 한다.
애플리케이션의 구성 요소를 정의하는 객체이다.
지금까지는 사용자가 new 키워드를 통해 객체를 생성하고 메소드를 호출했다. 스프링에서는 new를 사용하지 않고 빈을 사용한다.
-Policy에 관련된 annotation으로, 컴파일 이후에도 JVM에서 참조가 가능한 RUNTIME으로 지정한다.
Client로부터 요청이 왔을 때 어떤 Controller가 호출될지 Mapping하는것은 단순히 URL로 Mapping 하는것이 아니라 여러가지 요소(URL, Method 등)를 조합하여 Mapping한다.
요청 URL을 어떤 Method가 처리할지 mapping해주는 Annotation이다.
요청을 받는 형식(HTTP Method)인 GET, POST, PATCH, PUT, DELETE, HEAD를 정의하기도 한다.
요청 받는 형식을 정의하지 않는다면, 자동적으로 GET으로 설정된다.
@RequestMapping**({**”/example”, “/example2”, “/example3”**})
**method 속성으로 HTTP 메서드를 지정하면 지정된것만 허용한다.
- @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping (일반적으로 이렇게 사용함)
반면에 @RequestMapping의 Target은 class, method 레벨에 적용이 가능하다.
Restful API의 계층 구조
ex) users/{userId}, category/{categoryId}/product/{productId}
@RequestMapping("/prefix")
@RestController
public class RequestMappingController {
// Post, GET, Put, Patch, Delete 모두 가능
@GetMapping(value = "/v3")
public String exampleV3() {
// logic
return "this is sparta!";
}
}
경로 변수를 중괄호에 둘러싸인 값으로 사용할 수 있다. ex)user/{id}
기본적으로 @PathVariable로 설정된 경로 변수는 반드시 값을 가져야 하며 값이 없으면 응답 상태코드 404 Not Found Error가 발생한다.
최근 Restful API를 설계하는 것이 API의 기준이 되며 해당 어노테이션의 사용 빈도가 높아졌다.
- Restful API를 설계하게 되면 URL path 만으로 어떤 Resource을 사용하는지,
HTTP Method 만으로 어떤 기능이 동작되는지 쉽게 알아볼 수 있다.
- - Restful API 설계 예시
- postId글의 comment 댓글 작성
- POST + `posts/{postId}/comments`
- postId글의 comment 댓글 전체 조회
- GET + `posts/{postId}/comments`
- **postId글의 commentId 댓글 단 건 조회**
- GET + `posts/{postId}/comments/{commentId}`
- **postId글의 commentId 댓글 수정**
- PUT **+** `posts/{postId}/comments/{commentId}`
- **postId글의 commentId 댓글 삭제**
- DELETE + `posts/{postId}/comments/{commentId}`
@PathVariable 규칙
- 파라미터 변수명과 PathVariable 변수명이 같으면 속성 값 생략 가능
package com.example.springbasicannotation.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ParameterController {
// parms 속성값 추가
@GetMapping(value = "/users", params = "gender=man")
public String params() {
// logic
String result = "params API가 호출 되었습니다.";
return result;
}
}
실제 URL GET http://localhost:8080/users?gender=man
파라미터(?gender=man)가 있어야 호출된다.
속성 작성 규칙
params = "gender"
params = "!gender"
params = "gender=man"
params = "gender!=man"
params = {"gender=man", "gender=woman"}