목차
- RestController
- ViewResolver
- Tomcat Jasper
- JSTL
RestController
첫 프로젝트 실행 시 src/main/java 안에 있는 com.cos.secondapp 패키지를 컴포넌트 스캔을 해서 IOC 컨테이너에 객체를 등록을 합니다. com.cos.secondapp 패키지만 스캔을 하는 이유는 여기에 Java파일들이 다 들어있기 때문입니다.
@RestController을 TestController에만 추가를 해줬습니다.
IoC 컨테이너는
(
1. TestController.java
)
인 상태입니다.
예시를 들면,
요청 값 : Post http://localhost:8080/
Header : x-www-form-urlencoded
Body: username=ssar&password=1234
클라이언트가 위와 같이 요청을 했을 때 다음과 같은 일이 일어납니다.
- servletDispatcher가 가로채서 IOC를 스캔 ->
- FrontController를 찾음 ->
- @PostMapping(“/”)호출 ->
- 매개변수(User data) ->
- 매개변수를 콘텐츠 타입(content-type)으로 파싱(parsing ->분석) 해서 매개변수까지 처리함 ->
- Post(new User(ssar, 1234)); 이런 식으로 매개변수에 디스 패쳐가 값을 파싱 해서 넣어줍니다. 파싱 하지 못하면 null 값으로 들어갑니다.
프런트 컨트롤러의 주소가 같으면 서버가 동작하지 않습니다.
자바에서 bean을 내부 객체라고 하는데 이 bean이 없으면 자바 객체가 없다는 뜻입니다.
RestController는 리턴을 메시지로 합니다.(json으로 리턴하게 만들어짐)
해양 데이터를 통신할 때 썼었다고 하네요. 그래서 되게 통신할 때 값이 많이 나갔는데, 그렇기 때문에 값싸게 비트 기반으로 데이터의 양이 작은 것들을 가지고 통신을 했다고 합니다.
그래서 MessageConverter(메시지 컨버터)로 기본 content-type은 text/plain으로 converter(컨버터)하며
Object 일시 json으로 converter(컨버터) 합니다.
ViewResolver
ViewResolver는 기본 리턴 값이 웹 형태(html, jsp)입니다. 왜냐하면 View를 렌더링 해서 클라이언트에게 보여줘야 하기 때문입니다.
ViewResolver 가 일할 때 templates 라이브러리가 없으면 확장자명 밑으로 있는 것을 찾을 수가 없는데요.
이번 프로젝트에서는 Jsp 파일을 사용할 건데 ViewResolver는 기본적으로 Templates 종속적이며 ViewResolver가 찾는 확장자가 전부 다 다릅니다.
예를 들면 thymeleaf를 templates engine으로 쓴다면 그 파일들의 확장자명은 .thymeleaf 형식일 것입니다. Spring framework의 기본 templates engine에 Jsp 가 없기 때문에 return 값을 편하게 작성하여 사용하기 위해 ViewResolver의 beans로써 prefix와 surfix을 application.properties에 추가를 해줍니다.
prefix는 접두사, surfix는 접미사로 이해하면 빠릅니다.
밑에 사진처럼 추가를 해주면 우리가 return "home"이라고 작성을 해도 bean에 추가를 했기 때문에 ViewResolver가 앞/뒤로 추가해줍니다. 그렇게 하면 home.jsp로 접근이 가능하겠죠.
webapp/WEB-INF/views/home.jsp 로 접근을 하게 됩니다.
View Resolver의 일
- Templates 안에서 ViewResolver가 View를 찾습니다
- Templates 안에 없으면 static 폴더 안에서 View를 찾습니다. 폴더명 그대로 정적으로 찾아갑니다. 나중에 static 폴더에 잡다한 css, html 파일을 넣어두면 도움이 되겠죠?
- Static 폴더만 URL 방식으로 접근합니다.
src/main/webapp/WEB-INF/views
보통 우리가 파일을 보면 Webapp이 공개되지만 WEB-INF 안에 있는 건 공개되지 않게 합니다. 톰캣 서버가 외부 접근을 불가능하게 합니다.
Jsp를 클라이언트의 직접적인 URL 접근을 막기 위해서 ( MVC 패턴을 유지해야 하고 Controller들이 접근하지 못하도록 그전에 차단해야 하는 이유임 ) 저 경로로 views들을 넣어줘야 합니다.
실행 화면
get Tomcat Jasper into Maven dependencies
톰켓 제스퍼를 MVNrepository에서 찾아서 프로젝트 Maven dependencies에 넣어줍니다. Spring이 기본 templates engine으로 Jsp를 빼 버렸기 때문에 우리가 engine을 추가를 해줘야 합니다. 제스퍼는 Jsp를 파싱 하여 서블릿 코드로 컴파일하는 역할을 하게 됩니다.
자바 버전은 톰캣 버전과 호환이 되어야 합니다. 만약에 개발을 다 끝내고 카페 24에 배포를 하는데, 그 사이트에서 제공해주는 서비스의 톰캣 버전이 내가 개발한 자바 버전이 호환이 되지 않는다면 배포가 되지 않기 때문에 정말 힘들겠죠? 그전에 서버와 지금 개발하고 있는 자바 버전이 호환되는지 알아야 합니다.
이 프로젝트에서는 9.0.46 버전을 사용하겠습니다.
코드를 pom.xml에 추가를 합니다. 이렇게 하면 Maven Dependencies에 추가됩니다.
Jstl
jstl도 추가를 해줍니다. jsp에서 기존의 스클립틀릿 태그보다 좋은 가독성뿐만 아니라 작업능률을 늘려 작업하기 쉽게 도와줍니다.
Tips
- 이렇게 하면 폴더를 두 개 이상을 한 번에 만들 수 있습니다.
- 프런트 컨트롤러의 주소가 같으면 서버가 동작하지 않습니다.
- 자바에서 bean을 내부 객체라고 하는데 이 bean이 없으면 자바 객체가 없다는 뜻입니다.
- 디스 패쳐가 메서드를 실행시킬 때 함수의 매개변수를 체크합니다
Reference
https://mangkyu.tistory.com/49
https://galid1.tistory.com/527
https://highcode.tistory.com/24
https://victorydntmd.tistory.com/166
https://www.submarinecablemap.com/
https://velog.io/@ye050425/JSP-JSTL-%EC%A0%95%EB%A6%AC
'BackEnd > Spring' 카테고리의 다른 글
[Spring][4]DB Connection Practice[DB 연결 실습] (0) | 2021.06.30 |
---|---|
[Spring][3]Dependency Injection[의존성 주입] (0) | 2021.06.28 |
[Spring][1] MVC pattern [MVC 패턴] (0) | 2021.06.24 |
The foundation for entering Spring [ 스프링 입문의 기초 지식 ][2] (0) | 2021.06.23 |
The foundation for entering Spring [ 스프링 입문의 기초 지식 ][1] (0) | 2021.06.22 |