로깅
java private Logger log = LoggerFactory.getLogger(getClass());
@Slf4j
public class LogTest{
public String logTester(){
String name = "name";
log.info("이것은 로그 입니다.");
log.info("name ={}",name);
}
}
로그 레벨 순서
LEVEL: TRACE > DEBUG > INFO > WARN > ERROR
올바른 로그 사용법
log.debug("data={}",data);
log.debug("data="+data) 이런식으로 하면 +를 연산자로 인식하여 더하기 연산이 발생한다.
쓰레드 정보, 클래스 이름 등 부가정보를 함께 볼 수 있고, 출력 모양을 조절할 수 있다.
로그 레벨을 설정하여 상황에 맞게 출력을 조절할 수 있다.
콘솔뿐 아니라 파일이나 네트워크 등 별도의 위치에 로그를 남길 수 있다.
성능도 System.out 보다 좋다.
매핑 정보
@RestController
@Controller는 반환 값이 String이면 뷰 이름으로 인식하고 렌더링
@RestController는 Http메세지 바디에 그대로 String을 입력한다.
HTTP 메서드
@RequestMapping 에 method 속성으로 HTTP 메서드를 지정하지 않으면 HTTP 메서드와 무관하게
호출된다.( GET, HEAD, POST, PUT, PATCH, DELETE )
HTTP 메서드 매핑 축약
편리한 축약 애노테이션
-@GetMapping
-@PostMapping
-@PutMapping
-@DeleteMapping
-@PatchMapping
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {
log.info("mappingPath userId={}", data);
return "ok";
}
이외에도 특정 파라미터, 헤더, 미디어 타입 등을 조건으로 세워 맵핑할 수 있다.
HTTP요청 파라미터 - 쿼리 파라미터, HTML Form
String username = request.getParameter("username");
public String requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge) {
log.info("username={}, age={}", memberName, memberAge);
return "ok";
}
파라미터 이름이 변수 이름과 같다면
@RequestParam("name")
-> name부분 생략 가능
@RequestParam(required = true) String username,
@RequestParam(required = false) Integer age)
기본 값이 필수(true)이고 false 설정시 파라미터가 필수가 아니게 된다.
@RequestParam(required = true, defaultValue = "guest") String username,
defaultValue를 통해 기본값을 설정할 수 있다.
public String requestParamMap(@RequestParam Map<String, Object> paramMap) {
log.info("username={}, age={}", paramMap.get("username"),
paramMap.get("age"));
return "ok";
}
HTTP 요청 파라미터 - @ModelAttribute
실제 개발시에 객체에 파라미터 값을 넣기 위해서는 값을 받아서 직접 그 객체에 set을 통해 값을 주입해줘야 한다.
하지만 스프링은 이 과정을 완전히 자동화 해주는 @ModelAttribute 기능을 제공한다.
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(),
helloData.getAge());
return "ok";
}
@ModelAttribute 코드가 있으면 Spring 은 해당 객체(여기서는 HelloData) 를 생성하고 해당 객체의 프로퍼티의 setter 을 호출해서 파라미터 값을 입력한다.
스프링은 해당 생략시 다음과 같은 규칙을 적용한다.
- String , int , Integer 같은 단순 타입 = @RequestParam
- 나머지 = @ModelAttribute (argument resolver 로 지정해둔 타입 외)
HTTP 요청 메시지 - 단순 텍스트
1. InputStream
HTTP 메시지 바디의 데이터를 InputStream 을 사용해서 직접 읽을 수 있다.
public void requestBodyStringV2(InputStream inputStream, Writer responseWriter)
throws IOException {
String messageBody = StreamUtils.copyToString(inputStream,
StandardCharsets.UTF_8);
log.info("messageBody={}", messageBody);
responseWriter.write("ok");
}
2. HttpEntity
HttpEntity: HTTP header, body 정보를 편리하게 조회
- 메시지 바디 정보를 직접 조회
- 요청 파라미터를 조회하는 기능과 관계 없음 @RequestParam X, @ModelAttribute X
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
String messageBody = httpEntity.getBody();
log.info("messageBody={}", messageBody);
return new HttpEntity<>("ok");
}
3. RequestBody
public String requestBodyStringV4(@RequestBody String messageBody) {
log.info("messageBody={}", messageBody);
return "ok";
}
HTTP 요청 메시지 - JSON
@RequestBody 객체 변환
public String requestBodyJsonV3(@RequestBody HelloData data) {
log.info("username={}, age={}", data.getUsername(), data.getAge());
return "ok";
}
HttpEntity , @RequestBody 를 사용하면 HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가 원하는 문자나 객체 등으로 변환해준다.
HTTP 메시지 컨버터는 문자 뿐만 아니라 JSON도 객체로 변환해준다.
@RequestBody는 생략이 불가능하다.
-> 생략하면 @ModelAttribute가 실행되기 때문이다.
@ResponseBody
응답의 경우에도 @ResponseBody 를 사용하면 해당 객체를 HTTP 메시지 바디에 직접 넣어줄 수 있다.
이 경우엔 JSON 형식으로 응답이 생성된다.
물론 이 경우에도 HttpEntity 를 사용해도 된다.