4-1. Spring Annotation 1강
- Slf4j ... Slf4j는 인터페이스이고, 그 구현체로 Logback 같은 라이브러리를 선택. 실제 개발에서는 Spring Boot가 기본으로 제공하는 Logback을 대부분 사용
- logging ... Thread 정보, 클래스 이름과 같은 부가 정보를 함께 확인. 실제 운영 환경에서는 System.out.println();을 사용하여 Console에 정보를 출력하지 않고, 별도의 로깅 라이브러리를 사용해 로그를 출력. Log Level 설정을 통해 Error 메세지만 출력하도록 하기도 하고, 로그 메시지를 일자별로 모아서 저장해 외부 저장소에 보관하기도 함.
- Log Level: TRACE > DEBUG > INFO > WARN > ERROR
- Controller VS @RestController ... Annotation 기반의 Spring에서 Controller(Handler)를 만들 때 사용하는 어노테이션
- @Controller: View가 있는 경우에 사용 (즉, Template Engine인 Thymeleaf, JSP 등을 사용하는 경우)
- @RestController: 응답할 Data가 있는 경우에 사용. (현재는 대부분 @RestController를 사용하여 API가 만들어짐(Resful API). return 값으로 View를 찾는 것이 아니라 HTTP Message Body에 Data를 입력함)
4-2 Spring Annotation 2강
- Annotation 자세히 보기 ... Spring에서 사용하는 Annotation들이 각각 어떤 역할을 수행하는지 알아보는 방법 학습하기 -> 모르는 Annotation이 나올 경우 어떻게 사용해야 하는지 스스로 찾아낼 수 있음.
- @Component ... Spring Bean에 등록하는 역할 수행. Spring Bean은 Application의 구성 요소를 정의하는 객체
- @Indexed ... 클래스가 컴포넌트 스캔의 대상으로 Spring Bean에 더 빠르게 등록되도록 도와줌 (숙련 주차에서 자세히 다룰 것)
- @Target ... @Target이 선언된 하위 어노테이션이 어떤 범위에 적용되는지 설정.
- ElementType Enum 속성(각각의 Enum마다 적용되는 범위가 상단에 주석으로 설명되어 있음)
- @Retention ... @Retention 하위의 어노테이션이 얼마나 오래 유지되는지를 결정.
- RetentionPolicy Enum 속성 ... 1. SOURCE(소스 코드(.java)에서만 유지. 컴파일러에 의해 클래스 파일로 저장되지 않음) 2. CLASS(컴파일된 클래스 파일(.class)에 저장되지만, JVM이 실행 시 읽지 않는다.(주석과 같음). Default값임) 3. RUNTIME(클래스 파일(.class)에 저장되고, JVM에 의해 런타임 시점에 읽을 수 있음. 즉, 실제 런타임 시점의 코드에 반영되어 영향을 줌)
- @Documented ... Javadoc 등의 문서화 도구에 의해 문서화되어야 함을 나타냄
- 다시보는 @Controller VS @RestController ... 개발에서 우선순위는 항상 자세히 선언된 것이 우선순위가 높다
- @Controller 다시보기
- @Target(ElementType.Type) ... Class, Interface, Annotation, Enum, Record Declaration(Java16)에 적용할 수 있음
- @Retention(RetentionPolicy.RUNTIME) ... 클래스 파일(.class)에 저장되고, JVM에 의해 런타임 시점에 읽을 수 있음
- @Document ... Javadoc 등의 문서화 도구에 의해 문서화되어야 함을 나타냄
- @Component ... Spring Bean에 등록 / 싱글톤으로 관리
- @RestController 다시보기
- @Controller에 @ResponseBody가 결합된 어노테이션
- @RestController는 @Controller와 달리 각 메서드마다 @ResponseBody를 추가하지 않아도 된다.
4-3 Request Mapping 1강
- RequestMapping ... 특정 URL로 Request를 보내면 들어온 요청을 Controller 내부의 특정 Method와 Mapping 하기 위해 사용/ Client로부터 요청이 왔을 때 어떤 Controller가 호출될지 Mapping하는 것은 단순히 URL로 Mapping하는 것이 아니라 여러가지 요소(URL, Method 등)를 조합하여 Mapping함.
- @RequestMapping
- URL path/example 만 허용(Spring Boot 3.0버전 이상)
- 속성값 설정 시 배열 형태로 다중 설정 가능 (ex. @RequestMapping({"/example", "/example2", "/example3"})
- HTTP Method POST, GET, PUT, PATCH, DELETE, HEAD 모두 허용
- method 속성으로 HTTP 메서드를 지정하면 지정한 것만 허용됨.
- Spring이 제공하는 Annotation들의 내부에 다 선언되어 있음. 사용하면 됨. @RequestMapping보다는 직관적이고 축약된 @GetMapping, @PostMapping 형식을 일반적으로 사용 (@PutMapping, @DeleteMapping, @PatchMapping)
- 위의 Method Mapping의 Target은 Method Level임. 반면, @RequestMapping의 Target은 class, method 레벨에 적용 가능.
- Restful API의 계층 구조 ex. users/{userID}, category/{categoryId}/product/{productId}
- prefix로 선언할 URL을 class 레벨에 적용하는 것이 주로 사용.
- PathVariable ... HTTP 특성 중 하나인 비연결성을 극복하여 데이터를 전달하기 위한 방법 중 하나. URL로 전달된 값을 파라미터로 받아오는 역할을 수행.
- @PathVariable
- 경로 변수를 중괄호 {}에 둘러싸인 값으로 사용할 수 있다. (ex. user/{id}
- @PathVariable로 설정된 경로 변수는 반드시 값을 가져야 하며, 값이 없으면 응답 상태코드 404 Not Found Error가 발생
- 최근 Restful API를 설계하는 것이 API의 기준이 되며 해당 어노테이션의 사용 빈도가 높아짐 > Restful API를 설계하게 되면 URL path 만으로 어떤 Resource을 사용하는지, HTTP Method 만으로 어떤 기능이 동작되는지 쉽게 알아볼 수 있음.
- Restful API ... C(POST), R(GET), U(PUT, PATCH), D(DELETE)
- Restful API 설계 예시
- @PathVariable 규칙
- 파라미터 변수명과 PathVariable 변수명이 같으면 속성 값 생략 가능
... GetMapping("/{postId}")에 Long data 값을 지정해줌. 이걸 @PathVariable Long postId로 해서 파라미터 변수명 postId와 PathVariable 변수명을 같게 해줄 수도 있음
- @PathVariable 다중 사용 가능
- 이렇게 postId와 commentId 두 개를 상속했다.
- 다음과 같이 /posts/{postId}까지를 상위 Class의 prefix로 뺄 수 있음
4-4 Request Mapping 2강
- 특정 파라미터 매핑 ... 속성 설정을 통해 특정 헤더, 특정 파라미터와 Mapping 할 수 있다.
- Parameter 추가 매핑
- 예시
- 속성 작성 규칙
- 특정 Header 매핑
- 예시
헤더의 타입을 지정. ... POSTMAN에서 Body에 json 형태가 지정되어 있어야 호출 됨.
- MediaType 매핑, consume(수용) ... HTTP Header Content-Type(요청)과 매핑됨. consummes 속성 value 값으로는 이미 Spring에서 제공되는 Enum인 MediaType.APPLICATION_JSON_VALUE 형태로 사용
- 속성 작성 방법
- MediaType 매핑 produces(제공) ... 요청 헤더의 Accept 값에 따라서 produces 하는 값이 변함.
- consumes 속성 사용법과 같음. 위에 나온 모든 MediaType은 Spring이 제공하는 Enum을 사용하면 됨. (ex. produces = "application.json" -> produces = MediaType.APPLICATION_JSON_VALUE)
- Spring이 지원하는 Parameter ... 어노테이션 기반 Spring의 Controller는 다양한 파라미터를 쉽게 사용할 수 있도록 지원함
- @Controller 파라미터 목록 공식문서가 있음
- @Controller의 사용 가능한 Response 값 목록 공식 문서가 있음
- HTTP 헤더 조회 ... Spring에서 요청 Header에 쉽게 접근 가능. HttpServletRequest와 같이 파라미터로 다룰 수 있음.
- MultiValueMap ... Map과 유사하게 Key, Value 형식으로 구현. 하나의 Key가 여러 Value를 가질 수 있음. HTTP Header, Request Parameter와 같이 하나의 Key에 여러 값을 받을 때 사용함. (ex. key1=value1&key1=value2
어렵다! @Annotation을 활용해서 컨트롤러를 맵핑시키고, 파라미터나 consume, produce, PathVariable로 매핑 규칙을 정해주는 것 같은 느낌인데, 맞게 이해했는지 모르겠다. 전반적으로 다시 훑어볼 필요가 있을 듯. 일단, 쭉 스키밍해보고 다시 이해해보자. 고생했다!