1. 로그 간략 정리
[장점]
1) 디버깅과 문제 해결
- 애플리케이션 실행 중에 발생하는 이벤트, 상태 및 오류에 대한 중요한 정보 제공
2) 성능
- 비동기 로깅, 로그 레벨 관리와 같은 기능으로 통해 성능에 미치는 영향을 최소화
3) 로그 레벨 관리
- ERROR / WARN / INFO / DEBUG / TRACE 세분화된 로그 레벨을 제공한다.
- 로그의 중요도에 따라 다르게 처리할 수도 있고, 필요한 로그 레벨만 볼 수 있다.
4) 모니터링
- 운영(애플리케이션 동작 추적, 특정 사용자의 활동 로그)
성능(로직 실행 시간, DB 쿼리 실행 시간)
보안(로그인 시도, 인증 실패, 권한 부여 거부) 과 같이 다양한 모니터링 및 분석이 가능하다.
5) 로그 고급 기능
- 로그 파일의 rolling, 포맷 설정, 출력 대상 설정(콘솔, 파일, 네트워크)과 같은 고급 기능을 사용할 수 있다.
@Slf4j
: 자바 기반의 '로깅'을 위한 facade 라이브러리이다.
즉. 로깅 구현체를 직접적으로 제공하지 않고, 다양한 로깅 프레임워크(Logback, Log4j..)에 대한 단일 인터페이스를 제공해
개발자가 로깅 구현체를 자유롭게 선택할 수 있도록 한다.
로그 호출
- log.info("hello world!");
- log.error("info log={}", error);
로그 포맷
- 시간, 로그 레벨, 프로세스 ID, 쓰레드 이름, 클래스명, 로그 메시지
로그 레벨
- Level : Trace > Debug > Info > Warn > Error
- application.yml 에서 설정
logging.level.root = info
- 개발 서버는 debug / 운영 서버는 info
2. HTTP 요청 메시지 - 쿼리 파라미터, HTML Form
1) @RequestParam
- http://localhost:8080/request-param/?userName=sun&age=24
2) @PathVariable
- http://localhost:8080/mapping/userA
3) @ModelAttribute
- 해당 객체 프로퍼티(필드)의 setter를 호출해서 파라미터의 값을 바인딩한다.
- http://localhost:8080/model-attribute?userName=sun&age=24
+. Spring은 생략 시 다음 어노테이션으로 매핑이 된다.
String, int, Integer 같은 단순 타입 → @RequestParam
나머지 = @ModelAttribute (aregument resolver 지정 타입 제외)
4) 특정 헤더 / 미디어 타입 조건 매핑
- http://localhost:8080/mapping-header
- headers / consumes / produces
/**
* 특정 헤더로 추가 매핑
* headers="mode",
* headers="!mode"
* headers="mode=debug"
* headers="mode!=debug" (! = ) */
@GetMapping(value = "/mapping-header", headers = "mode=debug")
public String mappingHeader() {
log.info("mappingHeader");
return "ok";
}
번외.
∙ url 다중 매핑
{"/hello-basic", "/hello-go"}
∙ 마지막 '/'
"/hello"와 "/hello/"는 서로 다른 URL 요청을 사용해야 한다.
∙ MultiValueMap
3. HTTP 요청 메시지 - message Body
HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용. JSON, XML, TEXT
- POST, PUT, PATCH
쿼리 파라미터와 다르게, HTTP message body를 통해 데이터가 직접 넘어오는 경우
@RequestParam, @ModelAttribute를 사용할 수 없다.
1) HttpEntity
2) RequestBody
- @RequestBody를 생략하면 @ModelAttribute로 바인딩 되어 쿼리 파라미터를 조회해 매핑 동작한다.
- HTTP Message Converter 가 response body message 의 json을 지정한 객체로 바꿔준다.
4. HTTP 응답
Spring에서 응답 데이터를 만드는 방법은 크게 3가지가 있다.
정적 리소스 / 뷰 템플릿 / HTTP 메시지
1) 정적 리소스
파일 경로: src/main/resources/static/basic/practice.html
웹 URL: http://localhost:8080/basic/practice.html
2) 뷰 템플릿
파일 경로: src/main/resources/template/practice.html
Model에 데이터를 넣고 뷰 템플릿을 호출한다.
3) HTTP 메시지
HTTP message body에 JSON 형식으로 데이터를 실어 보낸다.
5. 메시지 컨버터
HTTP request 본문을 객체로 변환하거나, HTTP response 본문으로 변환할 때 사용된다.
1) 기본 구조
Spring MVC에서 HttpMessageConverter 인터페이스 구조로 정의되어 있다.
- canRead(), canWrite() : 요청 / 응답 타입을 메시지 컨버터가 처리할 수 있는지 여부를 판단한다. (Class type, Media type)
- read(), write() : 실제 객체를 읽고 쓰는 역할을 한다.
2) 주요 메시지 컨버터
ByteArrayHttpMessageConverter
: byte[] 데이터 처리
- 클래스 타입: byte[], 미디어 타입: */*
- 요청: @RequestBody byte[] data
- 응답: @ResponseBody return byte[]
StringHttpMessageConverter
: 문자열 데이터 처리
- 클래스 타입: String, 미디어 타입: text/plain
MappingJackson2HttpMessageConverter
: JSON 데이터 처리
- 클래스 타입: 객체 or HashMap, 미디어 타입: application/json
MarshallingHttpMessageConverter
: XML 데이터 처리
- 클래스 타입: 객체 or HashMap, 미디어 타입: application/xml
3) 동작 구조
클라이언트가 요청을 보낼 때 크게 2가지 방법으로 보낼 수 있다.
1) url 쿼리
2) message body
url 쿼리로 요청을 보낼 때는 메시지 컨버터 필요없다. (@RequestParam, @ModelAttribute, @PathVariable ...)
Argument Resolver가 파라미터에 맞는 객체를 RequestMappingHandlerAdapter에 전달한다.
message body에 데이터를 담은 요청을 보낼 때는 메시지 컨버터가 필요하다. (@RequestBody, HttpEntity)
Arguement Resolver가 HTTP 메시지 컨버터를 호출해, 원하는 객체로 변환하고 RequestMappingHandlerAdapter에 전달한다.
'Spring > MVC 1' 카테고리의 다른 글
7. 스프링 MVC - 웹 페이지 만들기 (0) | 2024.03.19 |
---|---|
5. 스프링 MVC - 구조 이해 (0) | 2024.03.16 |
4. MVC 프레임워크 만들기 (0) | 2024.03.14 |
3. 서블릿, JSP, MVC 패턴 (0) | 2024.03.13 |
2. 서블릿 (0) | 2024.03.11 |