| 스프링 컨트롤과 주소 매핑
- HTTP는 근본적으로 텍스트 기반으로 데이터를 송수신하는 일회성의 프로토콜이며,
REST는 HTTP프로토콜로 자원에 대한 CRUD 요청을 하는 URI로 표현하는 기법을 말한다.
- URI에 사용되는 주소는 보통 / 에 따라서 경로를 나누고 그 안에 디렉토리나 파일명, request 등을 작성하는데,
고전적인 프로그래밍 방식에서는 www.example.com/home/index.jsp 와 같이 파일 확장자가 그대로 드러났었다.
- 그러나 오늘날엔 논리적인 주소를 사용해서 확장자를 숨긴다.
(예를들어, 인프런의 멘토링 페이지는 https://www.inflearn.com/mentors 를 경로로 쓴다. 파일 확장자는 안 보인다.)
- 스프링의 경우, Tymeleaf를 사용해서 이러한 논리주소를 손쉽게 물리주소와 매핑할 수 있다.
1. HttpServletResponse에서 HTML을 문자열로 직접 내보내기
- 수업에서는 스프링에서 @Controller로 서블릿에서 쓰던 코드를 작성했는데, 나도 따라해봤다.
* 이전에 Account API를 만들 때, 프로젝트 자체가 API 명세서를 기반으로 작업을 했었는데,
그때는 @RestController를 썼었다. 하지만 여기서는 @Controller를 사용한다.
(실제로 @RestController를 쓰면 논리주소 매핑이 안된다.)
이거는 만들고자 하는 프로그램의 목적에 따라 사용하는 컨트롤러 달라서이다.
언제? | 차이점 | |
@RestController | REST API 만들 때 | @Controller + @ResponseBody |
@Controller | 웹상에서 동적 페이지 만들어서 뷰로 보여줄 때 | - |
- 이 방식을 써도 URI에는 파일 확장자가 안 뜨고, /old 만으로 html이 나타난다.
@Controller
public class MainController {
@RequestMapping("/old")
public void oldMethod(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
String html = "<!doctype html>\n" +
"<html lang=\"ko\">\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <meta name=\"viewport\"\n" +
" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n" +
" <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n" +
" <title>Document</title>\n" +
"</head>\n" +
"<body>\n" +
" <h1>인덱스 페이지</h1>\n" +
" <img src = \"https://cdn.pixabay.com/photo/2022/05/21/09/30/cat-7211080_960_720.jpg\">\n" +
"</body>\n" +
"</html>";
writer.write(html);
writer.close();
}
}
[ 재미삼아 넣은 JSP 내장 객체 구조 ]
아래는 JSP의 내장 객체 구조인데(편의상 JSP/Servlet 동일하게 묶어 말하려 한다.)
재미있는 점은 아래의 구조 자체가 스프링의 전반적인 구조와 그리 다르지 않다는 점이다.
내장 객체 | 내용 | JSP/Servlet |
pageContext | 페이지에 대한 정보 저장 | PageContext |
request / response | HTTP 요청/응답 저장 | HttpServletRequest HttpServletResponse |
session | 세션 정보 저장 | HttpSession |
application | 웹 어플리케이션 환경 정보 저장 | ServletContext |
config | 설정 정보 저장 | ServletConfig |
2. Thymeleaf를 통한 View 페이지 매핑
(1) application.yml 에서 Thymeleaf에 대한 환경설정하기
// 아래는 환경설정 작성 예시를 위한 것으로
// ㄴ실제로는 디폴트로 html/utf-8/경로는 templates로 되어 있다.
spring:
thymeleaf:
prefix: .html
suffix: classpath:/templates/
** 아래는 thymeleaf의 properties 클래스인데, 디폴트를 확인할 수 있다.
@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {
private static final Charset DEFAULT_ENCODING = StandardCharsets.UTF_8;
public static final String DEFAULT_PREFIX = "classpath:/templates/";
public static final String DEFAULT_SUFFIX = ".html";
(2) application.yml에서 작성한 classpath 안에 html을 작성한다.
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>인덱스 페이지</h1>
<img src = "https://cdn.pixabay.com/photo/2022/05/21/09/30/cat-7211080_960_720.jpg">
</body>
</html>
(3) Controller에서 @Controller와 @RequestMapping
- 아래의 경우, "index"로 시작하는 파일을 templates 안에서 찾아 반환한다.
@Controller
public class MainController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String index() {
return "index";
}
}
>> 앱을 구동한 후, 브라우저에 ip주소:포트/ 를 치니 아래와 같이 나왔다.
[ 참고 및 출처 ]
부트캠프 수업을 들은 후 정리한 내용입니다.
https://dncjf64.tistory.com/288
'Framework > 프로젝트로 스프링 이해하기' 카테고리의 다른 글
[LMS 만들기] 비밀번호 초기화 요청 및 메일 링크를 통한 초기화 (1) | 2022.10.04 |
---|---|
[LMS 만들기] 스프링 시큐러티를 이용한 로그인/로그아웃 (0) | 2022.10.03 |
[LMS 만들기] 회원가입 페이지 만들기 (0) | 2022.10.02 |
[LSM 만들기] Maven 프로젝트 환경 보기 (0) | 2022.09.29 |
[LSM 만들기] 스프링부트 프로젝트 생성하기 (0) | 2022.09.28 |