오늘 진행한 학습 요약
1. 기초 Spring 4주차
- @Slf4j
- @Controller
- @RestController
- Annotation
- @RequestMapping
- @PathVariable
- 특정 파라미터 매핑
- Spring이 지원하는 Parameter
김영한 - 스프링 입문 강의 소개 링크 : https://youtu.be/qyGjLVQ0Hog?si=bAfflwZ3PDThiTdL
2. 알고리즘 코드카다 Day18~20 (작성 생략)
CodingTest Git-hub 링크 : https://github.com/chews26/CodingTest
학습 정리
1. 기초 Spring 4주차
- @Slf4j
- Slf4j는 인터페이스
- 구현체로 Logback같은 라이브러리를 선택
- 실제 개발에서는 Spring Boot가 기본으로 제공하는 Logback을 대부분 사용
- Logging
- Thread 정보, 클래스 이름과 같은 부가 정보를 함께 확인할 수 있음
- 별도의 로깅 라이브러리를 사용하여 로그를 출력
- Log Level
- TRACE > DEBUG > INFO > WARN > ERROR
- @Controller와 RestController
- Annotation 기반의 Spring에서 Controller(Handler)를 만들 때 사용하는 어노테이션
- @Controller
- View가 있는 경우에 사용
- Template Engine인 Thymeleaf, JSP 등을 사용하는 경우
- Thymeleaf
- SpringBoot build.gradle 의존성 추가
- return 값이 String이면 ThymeleafViewResolver 에 의해 View Name으로 인식
- @RestController
- 응답할 Data가 있는 경우에 사용
- 대부분 @RestController를 사용하여 API가 만들어짐
- return 값으로 View를 찾는것이 아니라 HTTP Message Body에 Data를 입력
- @RestController는 @Controller와 달리 각 메서드마다 @ResponseBody를 추가하지 않아도 됨
- Annotation
- @Component
- Spring Bean에 등록하는 역할
- Spring Bean은 애플리케이션의 구성 요소를 정의하는 객체
- Spring Bean에 등록하는 역할
- @Target
- @Target 이 선언된 하위 어노테이션이 어떤 범위에 적용되는지 설정
- @Retention
- @Retention 하위의 어노테이션이 얼마나 오래 유지되는지를 결정
- @Documented
- Javadoc 등의 문서화 도구에 의해 문서화되어야 함을 나타냄
- @Component
- @RequestMapping
- @RequestMapping
- 특정 URL로 Request를 보내면 들어온 요청을 Controller 내부의 특정 Method와 Mapping 하기 위해 사용
- 단순히 URL로 Mapping 하는것이 아니라 여러가지 요소(URL, Method 등)를 조합하여 Mapping
- URL path /example 만 허용(Mapping)
- 배열 형태로 다중 설정이 가능
- HTTP Method POST, GET, PUT, PATCH, DELETE, HEAD 모두 허용
- method 속성으로 HTTP 메서드를 지정하면 지정된것만 허용
- @GetMapping
- Target(ElementType.METHOD) Method Level에 해당 어노테이션을 적용한다 라는 의미
- 내부적으로 @RequestMapping(method = RequestMethod.GET) 을 사용
- Spring이 제공하는 Annotation들의 내부에 다 선언
- @RequestMapping 보다는 직관적이고 축약된 @GetMapping, @PostMapping 형식을 일반적으로 사용
- @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping
- @RequestMapping
- @PathVariable
- HTTP 특성 중 하나인 비연결성을 극복하여 데이터를 전달하기 위한 방법
- 경로 변수를 중괄호에 둘러싸인 값으로 사용할 수 있음
- user/{id}
- @PathVariable로 설정된 경로 변수는 반드시 값을 가져야 하며 값이 없으면 응답 상태코드 404 Not Found Error가 발생
- 파라미터 변수명과 PathVariable 변수명이 같으면 속성 값 생략 가능
- @PathVariable 다중 사용 가능
- 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}
- postId글의 comment 댓글 작성
- 특정 파라미터 매핑
- 속성 설정을 통하여 특정 헤더, 특정 파라미터와 Mapping
- Parameter 추가 매핑
- @GetMapping(value = "/users", params = "gender=man") public String params() {
- 실제 URL GET http://localhost:8080/users?gender=man 파라미터가 있어야 호출
- 속성 작성 규칙
- params = "gender"
- params의 key값은 커스텀이 가능하다
- value는 없어도 된다.
- params = "!gender"
- gender가 없어야 한다.
- params = "gender=man"
- gender=man 이어야 한다.
- params = "gender!=man"
- params의 value값이 man가 아니여야 한다.
- params = {"gender=man", "gender=woman"}
- 배열로 속성 값을 여러 개 설정이 가능하다.
- params = "gender"
- 특정 Header 매핑
- @PostMapping(value = "/users", headers = "Content-Type=application/json")
- MediaType 매핑, consume(수용)
- HTTP Header Content-Type(요청)과 매핑
- consumes 속성 value값으로는 이미 Spring에서 제공되는 Enum인 MediaType.APPLICATION_JSON_VALUE 형태로 사용
- MediaType 매핑 produces(제공)
- 요청 헤더의 Accept 값에 따라서 produces 하는 값이 변함
- Spring이 지원하는 Parameter
- @Controller의 사용 가능한 파라미터 목록 - 공식 문서
- @Controller의 사용 가능한 Response 값 목록 - 공식 문서
- HTTP 헤더 조회
- Spring에서 요청 Header에 쉽게 접근
- HttpServletRequest와 같이 파라미터로 다룰 수 있음
- MultiValueMap
- Map과 유사하게 Key, Value 형식으로 구현되어 있지만 하나의 Key가 여러 Value를 가질 수 있음
- HTTP Header, Reqeust Parameter와 같이 하나의 Key에 여러 값을 받을 때 사용