TIL 22 [ Spring ( 어노테이션II, Request Mapping, 요청 데이터) ]

2025. 3. 19. 21:23·[내일배움캠프-Sparta]/Spring 6기
반응형

1. 학습내용

10:00 ~ 11:00 Spring 입문 과제 발제 ( 박성규 튜터님 )

Spring 어노테이션 II

@Slf4j - Logback 같은 라이브러리를 선택하며, 실제 개발에서는 스프링 부트가 기본으로 제공하는 Logback을 대부분 사용함 ( 로그, Log ) 

  • Thread 정보, 클래스 이름과 같은 부가 정보를 함께 확인할 수 있다.
  • 별도의 로깅 라이브러리를 사용하여 로그를 출력한다. ( System.out.println();을 사용 X ) 
  • Log Level 설정을 통하여 Error 메세지만 출력하도록 하도록 하기도 하고 로그 메세지를 일자별로 모아서 저장하여 외부 저장소에 보관하기도 한다.
    • Log Level
      • TRACE > DEBUG > INFO > WARN > ERROR

[ 사용시 주의사항 ]

@RequestMapping("/logging")
    public String logging() {

        String sparta = "Sparta";
        // TRACE -> DEBUG -> INFO -> WARN -> ERROR
        log.trace("문자 trace={}", sparta);
        log.debug("문자 debug={}", sparta);

        // default
        log.info("문자 info={}", sparta);// 문자 연산을 진행하지 않는다.
        log.warn("문자 warn={}", sparta);
        log.error("문자 error={}", sparta);

        log.info("문자 info " + sparta); // 문자 연산을 먼저 해버린다.
        return "success";
    }
// application.properties에서 TRACE를 선언해주면 TRACE,DEBUG 값 까지 출력이됨.    
// logging.level.com.example.springbasicannotation=TRACE

 

@Controller - Spring에서 Controller(Handler)를 만들 때 사용하는 어노테이션

  • View가 있는 경우에 사용한다.
  • 즉, Template Engine인 Thymeleaf, JSP 등을 사용하는 경우
  • Controller가 가장 광범위함.
package com.example.springbasicannotation.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ViewController {

    @RequestMapping("/view")
    public String example() {
        // logic
        return "sparta"; // ViewName이 return
    }
}

이 때 반환값 sparta는 템플릿 폴더의 sparta.html을 가리킨다.

Controller 동작 순서 ★

@RestController ( @Controller + @ResponseBody )

  • 응답할 Data가 있는 경우에 사용한다.
  • 현재는 대부분 @RestController를 사용하여 API가 만들어진다. (Restful API)
  • return 값으로 View를 찾는것이 아니라 HTTP Message Body에 Data를 입력한다.
  • @RestController는 @Controller와 달리 각 메서드마다 @ResponseBody를 추가하지 않아도 된다
package com.example.springbasicannotation.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ResponseController {

    @RequestMapping("/string")
    public String example() {
        // logic
        return "sparta"; // ViewName이 return 되는게 아니라, String Data가 반환된다.
    }
}

결과 값
RestController 동작 순서 ★

@Component  

    • Spring Bean에 등록하는 역할을 수행한다.
      • Spring Bean은 애플리케이션의 구성 요소를 정의하는 객체이다.
      • WAS가 Servlet 코드를 읽어 컨테이너에 등록했던 것을 떠올려 봅시다.
      • Servlet Container → Servlet을 지원하는 WAS 내부에는 서블릿 컨테이너가 있다. 서블릿 컨테이너는 서블릿을 초기화, 생성, 관리, 호출, 종료하는 역할을 수행한다.  
    • Servlet의 생명주기
      • Servlet은 서블릿 컨테이너가 생성 및 관리한다.
      • 즉, WAS(서블릿 컨테이너 포함)가 종료될 때 Servlet도 함께 종료된다.
    • Servlet 객체 생성시점
      • 개발자가 직접 인스턴스화 하여 사용하는것이 아닌, 코드만 작성하면 서블릿 컨테이너가 생성한다.
  • 서블릿 예시 코드
@WebServlet(name="ExampleServlet", urlPatterns = "/example")
public class ExampleServlet extends HttpServlet { // HttpServlet을 상속받아 구현한다.
	
	@Override
	protected void service(
		HttpServletRequest request,  // HTTP 요청 정보를 쉽게 사용할 수 있게 만드는 Servlet
		HttpServletResponse response // HTTP 응답 정보를 쉽게 제공할 수 있게 만드는 Servlet
	) {
		// application logic
	}

}
@WebServlet(name="Example2Servlet", urlPatterns = "/example2")
// 위와 같은 코드

@WebServlet(name="Example3Servlet", urlPatterns = "/example3")
// 위와 같은 코드

@WebServlet(name="Example4Servlet", urlPatterns = "/example4")
// 위와 같은 코드
  • Servlet Container가 하는 일
    1. 서블릿을 초기화, 생성, 관리, 호출, 종료하는 역할을 수행
      1. Servlet 객체를 싱글톤으로 관리한다.
    2. 동시 요청에 대한 처리를 위해 Multi Thread를 지원한다.

💬 Q. 싱글톤이 무엇인가요?

A. 객체를 하나만 생성하여 생성된 인스턴스를 공유하여 사용하는것을 의미합니다. 특정 클래스의 인스턴스가 여러개 생성되지 않도록 하여 자원의 낭비를 방지하고, 인스턴스를 공유함으로써 상태를 일관되게 유지하기 위함입니다. 하지만, 공유 변수 사용을 주의해야 합니다.

  • @Indexed
    • 클래스가 컴포넌트 스캔의 대상으로 Spring Bean에 더 빠르게 등록되도록 도와줌.

@Target 

  • @Target 이 선언된 하위 어노테이션이 어떤 범위에 적용되는지 설정한다.
  • TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR 등.. 여러가지 각각의 Enum마다 적용되는 범위가 상단에 주석으로 설명되어 있다. ( ElementType으로 들어가면 )

@Retention

  • 하위의 어노테이션이 얼마나 오래 유지되는지를 결정한다.

RetentionPolicy Enum 속성

  1. SOURCE ( 컴파일러 )
    • 소스 코드(.java)에서만 유지된다.
    • 컴파일러에 의해 클래스 파일로 저장되지 않는다.
  2. CLASS
    • 컴파일된 클래스 파일(.class)에 저장되지만, JVM이 실행 시 읽지 않는다. (주석과 같음)
    • Default 값이다.
  3. RUNTIME ( 실행 중 )
    • 클래스 파일(.class)에 저장되고, JVM에 의해 런타임 시점에 읽을 수 있다.
    • 즉, 실제 런타임 시점의 코드에 반영되어 영향을 준다.

@Documented

  • Javadoc 등의 문서화 도구에 의해 문서화되어야 함

Request Mapping

@RequestMapping

  1. Spring Boot 3.0 버전 이하
    • URL path /example, /example / 모두 허용
  2. Spring Boot 3.0 버전 이상(현재 버전)
    • URL path /example 만 허용(Mapping)한다.
  3. 속성값들을 설정할 때 배열 형태로 다중 설정이 가능하다

ex) @RequestMapping({”/example”, “/example2”, “/example3”})

  1. HTTP Method POST, GET, PUT, PATCH, DELETE, HEAD 모두 허용한다
  2. method 속성으로 HTTP 메서드를 지정하면 지정된것만 허용한다.
// HTTP Method 는 GET만 허용한다.
@RequestMapping(value = "/v1", method = RequestMethod.GET)
public String exampleV1() {
    // logic
    return "this is sparta!";
}
  • @GetMapping
    1. Target(ElementType.METHOD) Method Level에 해당 어노테이션을 적용한다 라는 의미
    2. 내부적으로 @RequestMapping(method = RequestMethod.GET) 을 사용하고 있다.
  • 코드예시
// Post, GET, Put, Patch, Delete 모두 가능
@GetMapping(value = "/v2")
public String exampleV2() {
	// logic
	return "this is sparta!";
}
  • Spring이 제공하는 Annotation들의 내부에 다 선언되어 있다.
    • 대부분의 필요한 기능들이 이미 만들어져 있다. 사용 하면된다.
  • @RequestMapping 보다는 직관적이고 축약된 @GetMapping, @PostMapping 형식을 일반적으로 사용한다.

 

@PathVariable

  • HTTP 특성 중 하나인 비연결성을 극복하여 데이터를 전달하기 위한 방법 중 하나이다. URL로 전달된 값을 파라미터로 받아오는 역할을 수행한다.
  • 경로 변수를 중괄호에 둘러싸인 값으로 사용할 수 있다. ex) user/{id}
  • 기본적으로 @PathVariable로 설정된 경로 변수는 반드시 값을 가져야 하며 값이 없으면 응답 상태코드 404 Not Found Error가 발생한다.
  • 최근 Restful API를 설계하는 것이 API의 기준이 되며 해당 어노테이션의 사용 빈도가 높아졌다.
  • 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}
  • 규칙
    1. 파라미터 변수명과 PathVariable 변수명이 같으면 속성 값 생략 가능
@RequestMapping("/posts")
@RestController
public class PathVariableController {
	
	// postId로 된 post 단건 조회
	@GetMapping("/{postId}")
	public String pathVariableV1(@PathVariable("postId") Long data) {
		// logic
		String result = "PathvariableV1 결과입니다 : " + data;
		return result;
	}
}
@RequestMapping("/posts")
@RestController
public class PathVariableController {
	
	// 변수명과 같다면 속성값 생략가능
	@GetMapping("/{postId}")
	public String pathVariableV2(@PathVariable Long postId) {
		// logic
		String result = "PathvariableV2 결과입니다 : " + postId;
		return result;
	}
	
}

2. @PathVariable 다중 사용 가능

@RequestMapping("/posts/{postId}")
@RestController
public class PathVariableController {
	
    @GetMapping("/comments/{commentId}")
    public String pathVariableV4(
        @PathVariable Long postId,
        @PathVariable Long commentId
    ) {
    // logic
    String result = "PathvariableV4 결과입니다 postId : " + postId + "commentsId : " + commentId;
    return result;
	}	
}

 

특정 파라미터 매핑

  • 속성 설정을 통하여 특정 헤더, 특정 파라미터와 Mapping 할 수 있다.
package com.example.springbasicannotation.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ParameterController {

    // params 속성값 추가
    @GetMapping(value = "/users", params = "gender=man")
    public String params() {
        // logic
        String result = "params API가 호출 되었습니다.";
        return result;
    }
}

실제 URL [GET] http://localhost:8080/users?gender=man 파라미터가 있어야 호출된다.

  • 파라미터가 없다면?
    • 400 Bad Request 클라이언트 측 에러
  • 속성 작성 규칙
    1. params = "gender"
      • params의 key값은 커스텀이 가능하다
      • value는 없어도 된다.
    2. params = "!gender"
      • gender가 없어야 한다.
    3. params = "gender=man"
      • gender=man 이어야 한다.
    4. params = "gender!=man"
      • params의 value값이 man가 아니여야 한다.
    5. params = {"gender=man", "gender=woman"}
      • 배열로 속성 값을 여러 개 설정이 가능하다.

특정 Header 매핑

@RestController
public class ParameterController {
	
	// headers 속성값 추가
  @PostMapping(value = "/users", headers = "Content-Type=application/json")
  public String headers() {
      // logic
      String result = "headers API가 호출 되었습니다.";
      return result;
  }
	
}

  • HTTP Header를 사용하기 때문에 Postman으로 테스트 해야 한다.
  • ex) key=Content-Type / value=application/json
  • 속성 작성 규칙은 위 params 속성 값의 규칙과 같다.

이외에도 produces, consume을 통한 MediaType 매핑도 있다.

요청 데이터 ( HTTP ,  Spring )

- 새롭게 알게 된 점
@Controller 는  ( 템플릿 엔진의 )view가 있어야함.  Controller가 더 광범위함.★

@RestContorller는 응답 Data가 있어야함.  (백엔드 개발자는 주로 Rest컨트롤러 쓴다고 보면됨)★
필드위에 선언되는 @id , @column 은 JPA에 관련된 어노테이션이다.

Client에서 Server로 Data를 전달하는 방법

📚 Client에서 Server로 Data를 전달하는 방법은 Query Parameter, HTTP Form Data, HTTP Request Body 크게 세가지가 있다.

 

[1] GET + Query Parameter(=Query String)

  • URL의 쿼리 파라미터를 사용하여 데이터 전달하는 방법

http://localhost:8080/request-params?key1=value1&key2=value2

@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");
    }
}
  • response.getWriter().write()
    • HttpServletResponse를 사용해서 응답값을 직접 다룰 수 있다.
    • @Controller 지만 @ResponseBody를 함께 사용한 것과 같다.

[2] 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");
    }
}

[3] HTTP Request Body

  • 데이터(JSON, TEXT, XML 등)를 직접 HTTP Message Body에 담아서 전달한다.
  • 주로 @RestController에서 사용하며, 대부분 JSON 형식으로 데이터를 전달한다.
    • POST, PUT, PATCH Method에서 사용한다.
    • GET, DELETE Method는 Body에 데이터를 담는것을 권장하지 않는다.

JSON을 Java 객체로 변환하려면 Jackson과 같은 라이브러리를 사용해야 한다. Spring Boot는 기본적으로 Jackson 라이브러리의 ObjectMapper를 제공하며, starter-web에 포함되어 있습니다.

 

@RequestParam

  • URL에서 파라미터 값과 이름을 함께 전달하는 방식으로 주로 HTTP 통신 Method 중 GET 방식의 통신을 할 때 많이 사용한다. @Requestparam을 사용하면 요청 파라미터 값에 간편하게 접근(Parameter Binding)할 수 있다.
@Slf4j
@Controller
public class RequestParamControllerV2 {

	@ResponseBody
	@GetMapping("/v1/request-param")
	public String requestParamV1 (
        @RequestParam("name") String userName,
        @RequestParam("age") int userAge													
	) {
        // logic
        log.info("name={}", userName);
        log.info("age={}", userAge);
        return "success";
	}

}
  1. @Controller + @ResponseBody
    • View를 찾는 것이 아니라 ResponseBody에 응답을 작성한다(=@RestController)
  2. @RequestParam
    • 파라미터 이름으로 바인딩한다.
  3. @RequestParam(”속성값”)
    • 속성값이 파라미터 이름으로 매핑된다.

※  “속성값”과 변수명이 같으면 생략이 가능하다.

  • @RequestParam 사용법
    1. 어노테이션, 속성값 모두 생략
      • @RequestParam은 생략이 가능하다.
      • 위의 방식은 권장하지 않습니다. 명시적으로 표시되어있지 않으면 팀의 협의가 있지 않는 경우 다른 개발자들에게 혼동을 주게 됩니다. 최소 @RequestParam String name 속성 값 생략 형태를 쓰면 됩니다.
    2. required 속성 설정
      • 파라미터의 필수 값을 설정한다.
      • API 스펙을 규정할 때 사용한다.
@ResponseBody
@GetMapping("/v4/request-param")
public String requestParam (
    @RequestParam(required = true) String name, // 필수
    @RequestParam(required = false) int age	// 필수가 아님										
) {
	// logic
    log.info("name={}", name);
    log.info("age={}", age);
    return "success";
}
  • @RequestParam을 사용하면 기본 Default값은 True이다.
    • True로 설정된 파라미터 값이 요청에 존재하지 않으면 400 BadRequest(클라이언트 측 에러)
    • required = false 설정이 되어있으면 해당 파라미터는 없어도 된다.
  • 주의! http://localhost:8080/v4/request-param?name=sparta 요청한다면?
  • 500 Error가 발생한다.
  • int Type에는 null을 넣을 수 없다. 0이라도 들어가야 한다.
  • int age를 Integer age로 변경해줘야함

  3. default 속성 적용

  • 파라미터의 기본 값을 설정한다.
  • name Parameter 의 값이 없으면 기본적으로 “sparta”으로 설정한다
  • ex) http://localhost:8080/v5/request-param?age=100
@ResponseBody
@GetMapping("/v5/request-param")
public String requestParam (
    @RequestParam(required = true, defaultValue = "sparta") String name,
    @RequestParam(required = false, defaultValue = "1") int age											
) {
    // logic
    log.info("name={}", name);
    log.info("age={}", age);
    return "success"	
}

 

@ModelAttribute

  • 요청 파라미터를 받아 필요한 Object로 바인딩 해준다. 주로 HTML 폼에서 전송된 데이터를 바인딩하고 HTTP Method POST인 경우 사용된다.
  • @ModelAttribute 적용
  • ex) http://localhost:8080/v2/tutor+ x-www-form-urlencoded
@ResponseBody
@PostMapping("/v2/tutor")
public String modelAttributeV2(
    @ModelAttribute Tutor tutor													
) {		
    String name = tutor.getName();
    int age = tutor.getAge();

    return "tutor name = " + name + " age = " + age;
}
  • @ModelAttirubte 동작 순서
    1. 파라미터에 @ModelAttribute가 있으면 파라미터인 Tutor 객체를 생성한다.
    2. 요청 파라미터 이름으로 객체 필드의 Setter를 호출해서 바인딩한다.
      1. 파라미터 이름이 name 이면 setName(value); 메서드를 호출한다.
      2. 파라미터 이름과 필드 이름이 반드시 같아야 한다!
  • Setter가 없다면?
    • 객체 필드에 값이 set되지 않는다.
  • 파라미터의 타입이 다른 경우
    • 만약 요청 파라미터 age 에 int가 아닌 String 이 전달된다면?
    • BindException 발생
    • 이런 경우 때문에 **Validation(검증)**이 필요하다.

HTTP Message Body(요청)

💡 @RequestParam, @ModelAttribute는 GET + Query Parameter와, POST HTML Form Data를 바인딩하는 방법

  • HTTP Message Body에 직접적으로 Data가 전달되는 경우이다.
    • Request Body의 Data를 바인딩하는 방법
  • REST API에서 주로 사용하는 방식이다.
  • HTTP Method POST, PUT, PATCH에서 주로 사용한다.
    • GET은 Request Body가 존재할 수는 있지만 권장하지 않는다.
  • JSON, XML, TEXT 등을 데이터 형식으로 사용한다.
  • HttpServletRequest 예시
    • request.getInputStream();
@Slf4j
@Controller
public class RequestBodyStringController {
	
  @PostMapping("/v1/request-body-text")
  public void requestBodyTextV1(
          HttpServletRequest request,
          HttpServletResponse response
  ) throws IOException {

      ServletInputStream inputStream = request.getInputStream();
      String bodyText = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
      
      response.getWriter().write("response = " + bodyText);

  }

}
  • I/O 예시
    • InputStream(읽기) 파라미터 지원
      • HTTP Request Body Data 직접 조회
    • OutputStream(쓰기) 파라미터 지원
      • HTTP Response Body 직접 결과 출력
@PostMapping("/v2/request-body-text")
public void requestBodyTextV2(
    InputStream inputStream,
    Writer responseWriter
) throws IOException { 
		
	String body = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
	
	responseWriter.write("response = " + bodyText);
}
  • HttpEntity 예시
    • HttpMessageConverter 사용 → 추후 설명
    • HttpEntity를 사용하면 HttpMessageConverter를 사용한다.
@PostMapping("/v3/request-body-text")
public HttpEntity<String> requestBodyTextV3(HttpEntity<String> httpEntity) { 
		
	// HttpMessageConverter가 동작해서 아래 코드가 동작하게됨
	String body = httpEntity.getBody();
		
	return new HttpEntity<>("response = " + body); // 매개변수 = Body Message
	
}
  • Spring의 HttpMessageConverter 덕분에 간편하게 Request Data에 접근할 수 있다.
    1. HttpEntity를 사용하면 HttpMessageConverter가 동작하여 자동으로 매핑된다.
    2. 요청 뿐만이 아닌 응답까지 HttpEntity 하나만으로 사용이 가능해진다.

💡 Converter는 ****어떤 뭔가를 다른 뭔가로 바꿔주는(Convert) 장치를 말한다. 예를 들면 태양빛을 전기로 바꿔주는 장치 또한 컨버터이다.

HttpEntity

  • HttpEntity는 HTTP Header, Body 정보를 편리하게 조회할 수 있도록 만들어준다.
  • HttpEntity 역할
    1. Http Request Body Message를 직접 조회한다
    2. Request 뿐만 아니라 Response도 사용할 수 있도록 만들어준다.
    3. Response Header 또한 사용할 수 있다.
    4. Request Parameter를 조회하는 기능들과는 아무 관계가 없다.
    5. View를 반환하지 않는다.
  • HttpEntity를 상속받은 객체
    • RequestEntity<>
      • HTTP Request Method, URL 정보가 추가 되어있다.
    • ResponseEntity<>
      • HTTP Response 상태 코드 설정이 가능하다.

@RequestBody, @ResponseBody

  •  각각 Request, Response 객체의 Body에 편하게 접근하여 사용할 수 있다.
@Controller // @RestController = @Controller + @ResponseBody
public class RequestBodyStringController {
	
  @ResponseBody
  @PostMapping("/v5/request-body-text")
  public String requestBodyTextV5(
          @RequestBody String body,
          @RequestHeader HttpHeaders headers
  ) {
      // HttpMessageConverter가 동작해서 아래 코드가 동작하게됨
      String bodyMessage = body;

      return "request header = " + headers + " response body = " + bodyMessage;
  }
}
  • @RequestBody
    • 요청 메세지 Body Data를 쉽게 조회할 수 있다.
    • @RequestBody는 생략할 수 없다. 생략하면 @ModelAttribute가 된다.
  • @RequestHeader
    • 요청 헤더 정보 조회
  • @ResponseBody
    • 응답 메세지 바디에 값을 쉽게 담아서 전달할 수 있도록 해준다.
    • View가 아닌 데이터를 반환한다.
  • 요약
    1. 요청 파라미터, HTML Form Data에 접근하는 경우
      • @RequestParam, @ModelAttribute 를 사용한다.
    2. Http Message Body에 접근하는 경우
      • @RequestBody를 사용한다. (JSON, XML, TEXT)

JSON

  • @RestController 에서 가장 많이 사용되는 데이터 형식이다. 현재 대부분의 API는 Request, Response 모두 JSON 형태로 통신한다.
  • Json 형태로 Data를 전송할 때는 Request Header의 content-type이 꼭 application/json 이여야 한다,
@Controller
public class JsonController {
	
    @ResponseBody // @RestController = @Controller + @ResponseBody
    @PostMapping("/v6/request-body-json")
    public Tutor requestJson(@RequestBody Tutor tutor) {
        return tutor;
  }	
}
  • View를 조회하지 않고 Response Body에 Data를 입력해서 직접 반환한다.
  • 요청 뿐만이 아니라 응답에도 HttpMessageConverter가 동작한다.
    • MappingJackson2HttpMessageConverter 적용
    • 응답 객체인 Tutor가 JSON으로 변환되어 반환된다.
  • HttpEntity를 사용해도 된다.
  • 요약
    1. 요청 데이터는 @RequestBody를 사용해서 바인딩 하면 된다.
    2. @RequestBody 는 생략이 불가능하다.
      • @ModelAttribute가 적용되기 때문
    3. HttpMessageConverter 가 요청 응답 데이터를 모두 변환할 수 있다.
      • JSON은 MappingJackson2HttpMessageConverter 를 사용한다.
      • Request Header의 Content-Type은 application/json 이어야 한다.
        • Header로 어떤 Converter가 동작할지 판별한다.

 

2. 내일 학습 할 것: Spring 입문 6주차 , 알고리즘  

 

반응형

'[내일배움캠프-Sparta] > Spring 6기' 카테고리의 다른 글

TIL 24 [ Spring ( 3 Layer 아키텍처, DB, SQL, JDBC, SQL Mapper ) ]  (0) 2025.03.21
TIL 23 [ Spring ( 응답 데이터, 메모장 만들기 실습 ) + 스탠다드반 ( 예외처리 )]  (0) 2025.03.20
TIL 21 [ Spring( 어노테이션, lombok, 프레임워크, 빌드 도구, 웹 기술 역사 + 스탠다드반 (Spring MVC) ]  (0) 2025.03.18
TIL 20 [ Spring( 네트워크, 용어, HTTP, Rest API ) ]  (0) 2025.03.17
TIL 19 [ Java (스트림) , 미니세션 (클래스,객체) + 키오스크 과제 해설 ]  (0) 2025.03.14
'[내일배움캠프-Sparta]/Spring 6기' 카테고리의 다른 글
  • TIL 24 [ Spring ( 3 Layer 아키텍처, DB, SQL, JDBC, SQL Mapper ) ]
  • TIL 23 [ Spring ( 응답 데이터, 메모장 만들기 실습 ) + 스탠다드반 ( 예외처리 )]
  • TIL 21 [ Spring( 어노테이션, lombok, 프레임워크, 빌드 도구, 웹 기술 역사 + 스탠다드반 (Spring MVC) ]
  • TIL 20 [ Spring( 네트워크, 용어, HTTP, Rest API ) ]
dimenshun
dimenshun
한 소년의 개발 일기
    반응형
  • dimenshun
    Dev Life Notes
    dimenshun
  • 전체
    오늘
    어제
    • 분류 전체보기 (268)
      • CS (23)
        • 자료구조 (0)
        • 알고리즘 (0)
        • 컴퓨터 구조 (8)
        • 네트워크 (6)
        • 운영체제 (3)
        • DB ( + SQLD ) (5)
        • SW공학 (1)
      • 프로그래밍 (3)
        • Java (0)
        • Spring (0)
        • HTML,CSS (3)
        • JavaScript (0)
      • 개발 툴 (7)
        • Git(버전관리) (1)
        • Docker (3)
        • AWS (2)
        • JSP (1)
      • 코딩테스트(Algorithm) (125)
        • 백준 (6)
        • 프로그래머스 (119)
      • [내일배움캠프-Sparta] (110)
        • Spring 6기 (106)
        • KPT 회고 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    컴퓨터구조
    운영체제
    트랜잭션
    세션
    It
    개발자
    메모리
    KPT
    네트워크
    웹
    network
    CPU
    배포
    cs
    내일배움캠프
    코딩테스트
    Testcode
    OS
    Til
    web
    AWS
    db
    SQL
    spring
    백엔드
    Java
    docker
    SQLD
    Python
  • hELLO· Designed By정상우.v4.10.3
dimenshun
TIL 22 [ Spring ( 어노테이션II, Request Mapping, 요청 데이터) ]
상단으로

티스토리툴바