[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개의 댓글