본문 바로가기
개발/Spring

MVC Response - Spring MVC

by 컴쏘 2023. 12. 5.
728x90

Spring MVC의 응답을 학습해보자

1) Welcome Page

스프링 부트는 정적 페이지와 템플릿 시작 페이지를 모두 지원

  • 구성된 정적 콘텐츠 위치에서 index.html 파일을 찾음
  • 하나라도 없으면 index 템플릿을 찾음

둘 중 하나라도 찾으면 자동으로 응용 프로그램 시작 페이지로 사용

 

파일 경로

resources
ㄴ static 
  ㄴ index.html
  
or
  
resources
ㄴ templates
  ㄴ index.html

 

테스트

welcome page 설정 연습

  • 테스트 메서드 : ResponseStaticTest.responseIndexPage
  • 수행 방법
    • resources/static/hi.html을 이용해서 학습 테스트 성공시키기
    • welcome page 설정을 위해 적절한 위치에 이동 혹은 파일명 변경

 

참고 링크

https://docs.spring.io/spring-boot/docs/3.1.2/reference/htmlsingle/#web.servlet.spring-mvc.welcome-page

 

주어진 코드

  • ResponseStaticTest.responseIndexPage
  • resources/static/index.html

 

ResponseStaticTest.responseIndexPage 데스트 코드를 추가하면서 build.gradle에 의존성을 추가하게 되었다.

 

build.gradle 의존성 추가

// 오류 메시지 테스트를 제공하고 테스트 코드 가독성을 향상 시키며 쉽게 사용할 수 있도록 설계된 Java 라이브러리
testImplementation "org.assertj:assertj-core:3.20.2"

// REST API 테스트 라이브러리 
testImplementation "io.rest-assured:rest-assured:5.3.2"

 

테스트 코드를 보니 /index 페이지에 대한 HTTP GET 요청을 보내고 해당 페이지의 응답이 정상적으로 이루어지는 지를 테스트 하는 코드였다.

 

resource/static/index.html을 추가하면 테스트를 통과한다.

responseIndexPage()
resources/static/index.html

2) Static Page

resources/static 아래의 경로에 위치한 파일은 접근 가능

  • 서비스에서 필요한 정적 자원들을 해당 경로에 위치 시킨 후 활용 가능

 

테스트

정적 페이지 설정 테스트

  • 테스트 메서드 : cholog.ResponseStaticTest.responseStaticPage
  • 수행 방법
    • resources/templates/hello.html 을 이용해서 학습 테스트 성공 시키기
    • 정적 페이지 설정을 위해 적절한 위치에 이동을 하거나 파일명을 변경

 

참고 링크

https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-config/static-resources.html#page-title

 

주어진 코드

  • ResponseStaticTest.responseStaticPage
  • resources/templates/hello.html

 

/hello.html 정적 페이지에 대한 HTTP GET 요청을 보내고, 해당 페이지의 응답이 정상적으로 이루어졌는지를 테스트한다.

 

resources/templates/hello.html을 추가하면 테스트에 통과하게 된다.

resources/templates/hello.html
responseStaticPage()

 

3) Template Engine

동적으로 페이지 처리를 하기 위해서는 템플릿 엔진을 활용할 수 있다.

  • Thymeleaf를 활용하여 요청에 대한 동적 처리를 해보도록 하자.
  • 쿼리 스트링(?name=brown)으로 전달한 name 값을 @RequestParam을 활용하여 Controller Method의 Parameter로 주입받기
  • Controller Method 내에서 뷰로 값을 전달하기 위해서 Model 객체를 활용
  • Model 객체는 Controller Method의 Parameter로 주입 받을 수 있고**, addAttribute Method를 값을 전달** 받을 수 있음

복습하기

Controller Method 내에서 뷰로 값을 전달하기 위해서 Model 객체를 활용

 

위의 문장을 이해해보자.

 

참고 링크

https://medium.com/@jang.wangsu/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-mvc-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80-1d74fac6e256

 

MVC 아키텍처

 

MVC(Model - View - Controller) : 3가지 형태로 역할을 나누어 개발하는 방법론, 관심사 분리

  • Model : 어플리케이션이 “무엇”을 할 것인지 정의, 내부 비즈니스 로직을 처리하기 위한 역할
    • 처리되는 알고리즘, DB와 상호 작용(CRUD), 데이터 …
  • Controller : Model이 “어떻게 ”처리할 지를 알려주는 역할, 화면에서 사용자의 요청을 받아서 처리되는 부분을 구현. 요청 내용을 분석해서 Model과 View에 업데이트 요청을 함
    • 사용자로부터 입력을 받고 Model 또는 View 중개인 역할
  • View : 화면에 “무엇”인가를 “보여주기 위한 역할”을 함. 컨트롤러 하위에 종속되어, Model이나 Controller가 보여주려고 하는 모든 필요한 것들을 보여줌
    • 최종 사용자에게 “무엇”을 화면(UI)으로 보여줌

 

요약하자면, Controller만 Model과 View와 연결되어있고, Model(비즈니스 로직 처리)과 View(UI 의존)는 직접적인 소통이 불가하다. Controller는 Model과 View가 각각 무엇을 해야할 지 알고 있고, 통제한다.

 

MVC의 한계 : Controller에 다수의 Model과 View가 복잡하게 연결되어 있는 상황(Massive ViewController)이 발생할 수 있다. 대규모 프로그램 개발 시 문제점이 발생한다.

  • MVC의 한계를 보완한 다양한 패턴이 있다. ex. MVP, MVVM, Clean Architecture …

 

다시 돌아와서 문장을 봐보자.

Controller Method 내에서 뷰로 값을 전달하기 위해서 Model 객체를 활용

 

Controller가 사용자의 요청을 받은 후, 그에 맞는 데이터를 Model에서 가져와 View에게 전달하여 최종적으로 사용자에게 응답하는 과정이라는 것을 알 수 있다.


 

테스트

  • 테스트 메서드 : ResponseTemplatesTest.responseTemplatesPage
  • 수행 방법
    • MemberController.world 메서드를 작성하여 학습 테스트를 성공시키기
    • /hello 요청 시 resources/templates/hello.html 페이지가 응답할 수 있도록 설정하기

 

참고 링크

https://spring.io/guides/gs/serving-web-content/

https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/requestparam.html

https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/arguments.html

https://www.baeldung.com/thymeleaf-in-spring-mvc

 

우선 test 코드를 추가해줬다.

테스트 코드를 살펴보니, 쿼리 스트링으로 GET 요청에 대한 응답을 확인하고 있었다.

 

responseTemplatesPage()

get 안에 template 대신 hello로 변경

 

hello.html도 추가해줬다. (나중에 hello로 파일명 변경)

resources/templates/hello.html

우선, hello package 안에 member를 만들어줬다.

 

Controller와 Service만 있으면 만들 수 있을 것 같아, 하위 폴더로 생성해주었다. (직접해보니 Service까지 가지는 않았다.)

member

 

Controller에서 RequestParam으로 parameter를 받고, 이 parameter를 Model을 이용해서 View로 전달하면 된다.

MemberController

 

4) Json 응답

컨트롤러 메서드의 리턴 타입을 그대로 body에 담아 응답을 하기 위해서는 @ResponseBody를 활용할 수 있다.

테스트

  • 테스트 메서드 : ResponseJsonTest.responseJson
  • 수행 방법
    • MemberController.json 메서드를 작성하여 학습 테스트 성공시키기
    • /json 요청 시 {”name”: “brown”, “age”: 20} 응답할 수 있도록 설정하기

 

참고 링크

https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/responsebody.html#page-title

https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/return-types.html

 

테스트 코드를 살펴보니, Person 객체가 있었다. Person을 만들어주자.

responseJson()

 

Person을 만들어주기 위해서 controller, service, domain, dto 하위 폴더를 생성했다.

Person

 

domain에 Person 객체를 생성하였다.

Person

 

record로 response dto도 만들어주었다.

response dto
service 코드
controller 코드
결과

 

 

 

BDD 동아리 Spring 스터디 공부 자료를 참고하였습니다. 
우테코의 일부 코치님들이 진행하는 프로젝트에서 지원해주셨습니다. 
728x90

'개발 > Spring' 카테고리의 다른 글

Spring Annotation MVC - Spring MVC  (0) 2023.12.05
HTTP - Spring MVC  (0) 2023.12.04
API Web Application 만들기 - Spring MVC  (0) 2023.12.04
Gradle 프로젝트 구축하기  (0) 2023.12.04
Framework와 Project  (0) 2023.11.29