[Spring] Client<-Server 데이터 전달 Response문 결정하기

말하는 감자·2025년 3월 20일

내일배움캠프

목록 보기
24/73

이전 게시글과 연결된다 : 이전게시글

Client <- Server 데이터 전달 방법

  • 1️⃣ 정적 리소스 전달 : 원본 그대로 전달 (.html)
  • 2️⃣ View Templete 전달 : 서버사이드 랜더링에 의해 동적으로 변한 뷰가 전달됨 (.jsp, thymeleaf 템플릿 사용)
  • 3️⃣ HTTP Message Body : 응답 데이터를 직접 Message Body에 담아 반환






1️⃣ 정적 리소스 전달

사용 어노테이션 : @Controller

원본 그대로 전달 (.html).

서버의 별도 처리없이 그냥 저장된거 반환해줌

🔗url : http://localhost:8080/hello/world.html
상세 디렉토리 : src/main/resources/static/hello/world.html << 인데
srcmain/resources/static 까지는 기본 생성이라 url에서 생략됨

/static 대신 /public 혹은 /META-INF/resources 도 사용 가능하다.






2️⃣ View Templete 전달

사용 어노테이션 : @Controller

1️⃣ 정적 리소스 전달 과 다른점

  • 함수가 반환될 때 동적으로 바뀌는 데이터들이 동봉?되어 있어야함.

    @RequestMapping("/response-view1")
    public String responseView(Model model) {
        model.addAttribute("data", "sparta");

        return "thymeleaf-view";
    }

Model에 대해서

스프링이 지원하는 Model 객체

여기서 말하는 Model은 8. Model And View 반환에서 나오는 Model이다.
Model은 @Controller 어노테이션이 있고, 반환에 "동적인 뷰"가 필요할 때 사용이된다.

서버 <-> 클라이언트 사이의 통신에 Json 데이터폼이 사용되는 것 처럼
컨트롤러 <-> 뷰 사이의 전달 수단으로 Model이라는 데이터폼(지금은 그렇게 생각 할 수 잇음)이 사용된다고 보면 된다.


제이슨과 유사하게 attributeName : , attributeValue : 쌍으로 구성되어있고,
리스트 처럼 addAttribute 함수를 통해서 요소들을 추가해준다.

주요 사용 방법
1. @RequestMapping메서드의 메서드 인자에 사용 << 지금쓰는거
모델에서 객체를 생성하거나 접근하며, WebDataBinder를 통해 요청과 바인딩합니다.
2. @Controller 클래스에서 메서드 레벨 애노테이션으로 사용
모든 @RequestMapping 메서드가 호출되기 전에 모델을 초기화합니다.
3. @RequestMapping 메서드 자체에서 사용
해당 메서드의 반환 값을 모델 속성으로 표시합니다.



❓만약, 동적 페이지 안에서 필요한 데이터를 추가하지 못했다면?

위 스크립트를 보면 html에서 <h2 th:text="${data}"></h2> 처럼 data라는 이름을 가진 속성이 필요하다.
그런데 여기서 addAttribute 없이 그냥 호출하면 우째될까?



결과

그냥 빈칸으로 출력된다. 오류가 뜨지는 않음.






3️⃣ HTTP Message Body

사용 어노테이션 : @RestController, @ResponseBody, @ResponseEntity<Object>

🔶 특: HTTP Message Converter를 통하여 적합한 형태로 변환되어 반환된다.

  • 즉, 반환하는 데이터가 단순 문자열이든 기본 타입이든 간에 Spring은 적합한 HttpMessageConverter를 찾아 이를 HTTP 응답 바디로 변환할 수 있따.
  • 뷰 이름을 반환하는 @Controller 메서드에서는 HttpMessageConverter가 사용되지 않는다.

정적 HTML, View Template 또한 HTTP Message Body에 담겨서 전달된다.
현재 설명하는 Response의 경우는 정적 HTML, View Template을 거치지 않고 직접 HTTP Response Message를 만들어 전달하는 경우를 말하는것.



@ResponseBody

반환하는 데이터가 뷰가 아닌 데이터 그대로일 때(TEXT, JSON) 사용
메서드 위에 @ResponseStatus(HttpStatus.OK) 같이 응답코드를 작성할 수 있음 (하지만 메서드에서 응답 코드를 경우에 따라 바꿔야 할 경우 바꿀 수 없음.



@ResponseEntity

위의 @ResponseBody와 다르게 ResponseEntity의 두번 째 파라미터는 상태 코드를 지정하는 Enum 상수?가 있다.

얘는 제네릭에 들어오는 변수 형태에 따라서 두가지로 나뉜다.
1. @ResponseEntity<> : @ResponseEntity<String>,@ResponseEntity<Integer>
2. @ResponseEntity<Object> : @ResponseEntity<Tutor>, @ResponseEntity<사용자지정 클래스>


@ResponseBody
@GetMapping("/v5/response-body")
public ResponseEntity<Tutor> responseBody() {
		
	Tutor tutor = new Tutor("wonuk", 100);
	
	return new ResponseEntity<>(tutor, HttpStatus.OK);
}

이런식으로 사용됨 (RequestEntity랑 비슷. 근데 이건 response용도고 requestEntity는 읽기 전용임)






🗝️정리

  • 요청
    • **@RequestParam, @ModelAttribute, @RequestBody**
  • 응답
    • 정적 리소스, View Template(@Controller), @ResponseBody, ResponseEntity<Object>
profile
대충 데굴데굴 굴러가는 개발?자

0개의 댓글