10월 31일 목요일
AM 알고리즘 문제 풀이, 강의 수강
PM 4,5주차 강의 수강
logging
client-Server Data 전달
RequestParam
ModelAttribute
Logging
String sparta = "Sparta"; log.info("문자 info={}", sparta); - 문자 연산을 진행하지 않는다. log.info("문자 info " + sparta); - 문자 연산을 진행하면서 로그가 실행되지 않아도 불필요 하게 문자 연산이 실행된다.
Client에서 Server로 Data전달하는 방법
GET + Query Parameter(= Query String)
➔URL의 쿼리 파라미터를 사용하여 데이터 전달하는 방법http://localhost:8080/request-params?key1=value1&key2=value2
➔HttpServletRequest 사용
@Slf4j @Controller public class RequestParamController { @GetMapping("/request-params") public void params( HttpServletRequest request, HttpServletResponse response ) throws IOException { String key1Value = request.getParameter("key1"); String key2Value = request.getParameter("key2"); log.info("key1Value={}, key2Value={}", key1Value, key2Value); response.getWriter().write("success"); } }
POST + HTML Form(x-www-form-urlencoded)
HTTP Request Body에 쿼리 파라미터 형태로 전달하는 방법
➔ HTTP RequestPOST /form-data content-type: application/x-www-form-urlencoded key1=value1&key2=value2
➔ HttpServletRequest 사용
@Slf4j @Controller public class RequestBodyController { @PostMapping("/form-data") public void requestBody( HttpServletRequest request, HttpServletResponse response ) throws IOException { String key1Value = request.getParameter("key1"); String key2Value = request.getParameter("key2"); log.info("key1Value={}, key2Value={}", key1Value, key2Value); response.getWriter().write("success"); } }
HTTP Request Body
➔ HttpServletRequest 사용@Getter @Setter public class Board { private String title; private String content; }
package com.example.springbasicannotation.controller; import com.example.springbasicannotation.entity.Board; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.ServletInputStream; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.util.StreamUtils; import org.springframework.web.bind.annotation.PostMapping; import java.io.IOException; import java.nio.charset.StandardCharsets; @Slf4j @Controller public class RequestBodyController { // JSON을 객체로 변환해주는 Jackson 라이브러리 private ObjectMapper objectMapper = new ObjectMapper(); @PostMapping("/request-body") public void requestBody( HttpServletRequest request, HttpServletResponse response ) throws IOException { ServletInputStream inputStream = request.getInputStream(); String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); log.info("messageBody={}", messageBody); Board board = objectMapper.readValue(messageBody, Board.clss); log.info("board.getTitle()={}, board.getContent()={}", board.getTitle(), board.getContent()); response.getWriter().write("success"); } }
@RequestParam
- defult = @RequestParam(required=true)
➔ 속성값과 변수명 일치시 생략 가능하다. AND 어노테이션도 생략 가능하지만 되도록 지양한다.
➔ required=false 일때 null이 들어갈 수 있는 타입이어야한다. ex)Integer
➔ true일시 값이 필수적으로 있어야한다.
➔ 만약, required=true라도 변수의 타입이 String 일때 빈문자열이 들어갈 수 있으므로 defaultValue를 설정한다. => 빈 문자열도 defaultValue로 설정한 값으로 바뀐다.
@ModelAttribute
@Data public class Tutor { private String name; private int age; } @Controller public class ModelAttributeController { @ResponseBody @PostMapping("/v1/tutor") public String requestParamV1( @RequestParam String name, @RequestParam int age ) { Tutor tutor = new Tutor(); tutor.setName(name); tutor.setAge(age); return "tutor name = " + name + " age = " + age; } }
- @RequestParam의 Mapping을 사용하면 객체를 생성하는 코드가 포함된다.
➔이때 @ModelAttribute는 위 과정을 자동화 한다@ResponseBody @PostMapping("/v2/tutor") public String modelAttributeV2( @ModelAttribute Tutor tutor ) { String name = tutor.getName(); int age = tutor.getAge(); return "tutor name = " + name + " age = " + age; }
이와 같은 코드로 변경할 수 있으며 동작 순서는
- 파라미터에 @ModelAttribute가 있으면 파라미터인 Tutor 객체를 생성한다.
- 요청 파라미터 이름으로 객체 필드의 Setter를 호출해서 바인딩한다.
- 파라미터 이름이
name
이면setName(value);
메서드를 호출한다.- 파라미터 이름과 필드 이름이 반드시 같아야 한다!
Spring에서는 @RequestParam이나 @ModelAttribute가 생략되면
String
,int
,Integer
와 같은 기본 타입은 @RequestParam과 Mapping하고 나머지 경우들(객체)은 모두 @ModelAttribute 와 Mapping한다.
새로운것을 배우니 꽤나 재미있다. 이제 시작이니 해이해지지 않도록 노력하자.