[Spring][2] The practice of MVC pattern [MVC 패턴 실습]
BackEnd/Spring

[Spring][2] The practice of MVC pattern [MVC 패턴 실습]

목차

- RestController

- ViewResolver

- Tomcat Jasper

- JSTL


RestController

 

 첫 프로젝트 실행 시 src/main/java 안에 있는 com.cos.secondapp 패키지를 컴포넌트 스캔을 해서 IOC 컨테이너에 객체를 등록을 합니다. com.cos.secondapp 패키지만 스캔을 하는 이유는 여기에 Java파일들이 다 들어있기 때문입니다. 

 

@RestControllerTestController에만 추가를 해줬습니다.

 

IoC 컨테이너

(

1.     TestController.java

)

 인 상태입니다.

 

src/main/java

예시를 들면,

요청 값 : Post http://localhost:8080/

Header : x-www-form-urlencoded

Body: username=ssar&password=1234

 

 클라이언트가 위와 같이 요청을 했을 때 다음과 같은 일이 일어납니다.  

 

  1. servletDispatcher가 가로채서 IOC를 스캔 ->
  2. FrontController를 찾음 ->
  3. @PostMapping(“/”)호출 ->
  4. 매개변수(User data) ->
  5. 매개변수를 콘텐츠 타입(content-type)으로 파싱(parsing ->분석) 해서 매개변수까지 처리함 ->
  6. Post(new User(ssar, 1234)); 이런 식으로 매개변수에 디스 패쳐가 값을 파싱 해서 넣어줍니다. 파싱 하지 못하면 null 값으로 들어갑니다.

 

프런트 컨트롤러의 주소가 같으면 서버가 동작하지 않습니다.

자바에서 bean을 내부 객체라고 하는데 이 bean이 없으면 자바 객체가 없다는 뜻입니다.

 

 

RestController 에서의 MessageConverter, 그리고 반환 받는 content-type

 

 

RestController는 리턴을 메시지로 합니다.(json으로 리턴하게 만들어짐)

 

 

해양 데이터를 통신할 때 썼었다고 하네요. 그래서 되게 통신할 때 값이 많이 나갔는데, 그렇기 때문에 값싸게 비트 기반으로 데이터의 양이 작은 것들을 가지고 통신을 했다고 합니다.

 

 

 

수많은 해양케이블들

 

 

 

그래서 MessageConverter(메시지 컨버터)로 기본 content-typetext/plain으로 converter(컨버터)하며

Object 일시 json으로 converter(컨버터) 합니다.

 

 

 

MVC pattern에서 DispatcherServlet의 역할

 

 

RestController

 


ViewResolver

 

 

ViewResolver는 기본 리턴 값이 웹 형태(html, jsp)입니다. 왜냐하면 View를 렌더링 해서 클라이언트에게 보여줘야 하기 때문입니다.

 

ViewResolver 가 일할 때 templates 라이브러리가 없으면 확장자명 밑으로 있는 것을 찾을 수가 없는데요.  

 

이번 프로젝트에서는 Jsp 파일을 사용할 건데 ViewResolver는 기본적으로 Templates 종속적이며 ViewResolver가 찾는 확장자가 전부 다 다릅니다.

 

예를 들면 thymeleaftemplates engine으로 쓴다면 그 파일들의 확장자명은 .thymeleaf 형식일 것입니다. Spring framework의 기본 templates engineJsp 가 없기 때문에 return 값을 편하게 작성하여 사용하기 위해 ViewResolverbeans로써 prefixsurfixapplication.properties에 추가를 해줍니다.

 

prefix접두사, surfix접미사로 이해하면 빠릅니다.

 

 밑에 사진처럼 추가를 해주면 우리가 return "home"이라고 작성을 해도 bean에 추가를 했기 때문에 ViewResolver가 앞/뒤로 추가해줍니다. 그렇게 하면 home.jsp로 접근이 가능하겠죠.

 

webapp/WEB-INF/views/home.jsp 로 접근을 하게 됩니다.

 

 

application.properties

 

View Resolver의 일

 

  1.  Templates 안에서 ViewResolver가 View를 찾습니다
  2.  Templates 안에 없으면 static 폴더 안에서 View를 찾습니다. 폴더명 그대로 정적으로 찾아갑니다. 나중에 static 폴더에 잡다한 css, html 파일을 넣어두면 도움이 되겠죠?
  3.  Static 폴더만 URL 방식으로 접근합니다.

 

src/main/webapp/WEB-INF/views

 

 보통 우리가 파일을 보면 Webapp이 공개되지만 WEB-INF 안에 있는 건 공개되지 않게 합니다. 톰캣 서버가 외부 접근을 불가능하게 합니다.

 

 Jsp를 클라이언트의 직접적인 URL 접근을 막기 위해서 ( MVC 패턴을 유지해야 하고 Controller들이 접근하지 못하도록 그전에 차단해야 하는 이유임 ) 저 경로로 views들을 넣어줘야 합니다.

 

 

 

Jsp 경로

 

 

실행 화면

 

Controller에서 "home"리턴 값으로 home.jsp를 받음 

 

 

home.jsp

 


 get Tomcat Jasper into Maven dependencies

 

 톰켓 제스퍼를 MVNrepository에서 찾아서 프로젝트 Maven dependencies에 넣어줍니다. Spring이 기본 templates engine으로 Jsp를 빼 버렸기 때문에 우리가 engine을 추가를 해줘야 합니다. 제스퍼는 Jsp를 파싱 하여 서블릿 코드로 컴파일하는 역할을 하게 됩니다. 

 

https://mvnrepository.com/

 

 

Tomcat Jasper

 

 

 자바 버전톰캣 버전호환이 되어야 합니다. 만약에 개발을 다 끝내고 카페 24에 배포를 하는데, 그 사이트에서 제공해주는 서비스의 톰캣 버전이 내가 개발한 자바 버전이 호환이 되지 않는다면 배포가 되지 않기 때문에 정말 힘들겠죠? 그전에 서버와 지금 개발하고 있는 자바 버전호환되는지 알아야 합니다.

 

 

 

Tomcat Version with Java Version

 

 이 프로젝트에서는 9.0.46 버전을 사용하겠습니다.

 

9.0.46

 

Maven 코드가 보입니다

 

 코드를 pom.xml에 추가를 합니다. 이렇게 하면 Maven Dependencies에 추가됩니다.

 

 

 

 


 

Jstl

 jstl도 추가를 해줍니다. jsp에서 기존의 스클립틀릿 태그보다 좋은 가독성뿐만 아니라 작업능률을 늘려 작업하기 쉽게 도와줍니다.

 

popular 선택

 

 


Tips

 

  • 이렇게 하면 폴더를 두 개 이상을 한 번에 만들 수 있습니다.

 

  • 프런트 컨트롤러의 주소가 같으면 서버가 동작하지 않습니다.
  • 자바에서 bean을 내부 객체라고 하는데 이 bean이 없으면 자바 객체가 없다는 뜻입니다.
  • 디스 패쳐가 메서드를 실행시킬 때 함수의 매개변수를 체크합니다

 


Reference

https://mangkyu.tistory.com/49

 

[Spring] @Controller와 @RestController 차이

Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있습니다. 전통적인 Spring MVC의 컨트롤러인 @Controller와 Restuful 웹서비스의 컨트롤러인 @RestController의 주요한 차..

mangkyu.tistory.com

https://galid1.tistory.com/527

 

SpringMVC - Spring MVC 동작원리 - 5 (ViewResolver, DispatcherServlet 기본전략 등록 과정)

DispatcherServlet의 initViewResolver SpringBoot나 이미 설정되어있는 Spring을 사용하신 분들은 위와같이 Controller의 handler들에서 간단히 view(문자열)이름만을 반환하면 사용자에게 해당 view가 보이게..

galid1.tistory.com

https://velog.io/@hyun-jii/%EC%8A%A4%ED%94%84%EB%A7%81-component-scan-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EB%8F%99%EC%9E%91-%EA%B3%BC%EC%A0%95

 

스프링 component-scan 개념 및 동작 과정

스프링 component-scan의 개념과 동작 과정에 대해 알아보려고 한다!얼마 전 면접에서 component-scan의 동작 과정에 대해 설명해달라는 질문을 받았다...질문을 받았을 때, component-scan...? 이것은..스캔하

velog.io

https://highcode.tistory.com/24

 

[Spring] Restful한 스프링 @ResponseBody vs @RestController

Spring 에서 restful 하게 작성하기 위해 @Controller 내에 @ResponseBody 사용하거나 혹은 @RestController 을 사용할 수 있습니다. 스프링 MVC 프레임 워크와 REST 일반적인 Spring MVC 컨트롤러와 RESTful 웹..

highcode.tistory.com

https://victorydntmd.tistory.com/166

 

[Spring] 방명록 애플리케이션 (5) - 뷰 객체 생성 ( ViewResolver )

Spring으로 방명록 애플리케이션을 구현하는 시리즈입니다. [Spring] 방명록 애플리케이션 (1) - 환경 설정 [Spring] 방명록 애플리케이션 (2) - 준비 단계 ( 스프링 활용하기 ) [Spring] 방명록 애플리케이

victorydntmd.tistory.com

https://www.submarinecablemap.com/

 

Submarine Cable Map

TeleGeography’s free interactive Submarine Cable Map is based on our authoritative Global Bandwidth research, and depicts active and planned submarine cable systems and their landing stations. Selecting a cable on the map projection or from the submarine

www.submarinecablemap.com

https://velog.io/@ye050425/JSP-JSTL-%EC%A0%95%EB%A6%AC

 

[JSP] JSTL 정리

JSTL (JSP Standard Tag Library) JSP 개발을 단순화하기위한 태그 library 장점 빠른 개발 -> JSP를 단순화하는 많은 태그를 제공 코드 재사용성 -> 다양한 페이지에서 JSTL 태그 사용 가능 스크립틀릿 태그를

velog.io