TIL

효준·2024년 10월 31일
0

10월 31일 목요일
AM 알고리즘 문제 풀이, 강의 수강
PM 4,5주차 강의 수강

💡 Today Issue

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 Request
POST /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한다.

🕐회고

새로운것을 배우니 꽤나 재미있다. 이제 시작이니 해이해지지 않도록 노력하자.

profile
사진은 캣타워가 생겨 포효하는 고양이입니다.

0개의 댓글

관련 채용 정보