simDev1234
심플하고 차분하게
simDev1234
전체 방문자
오늘
어제
  • 분류 전체보기
    • Computer Science
      • Basic Math
      • Data Structure
      • Algorithm
      • Database
      • OS
    • Language
      • Java
      • Kotlin
      • SQL
    • Framework
      • Spring
      • Orm&Mapper
      • 프로젝트로 스프링 이해하기
      • 스프링 라이브러리
    • Infra
      • Cloud
      • Docker
      • Redis
      • AWS, Azure
      • Device
    • Etc
      • CleanCoding
    • Git,Github

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자바프로그램
  • 참조타입
  • JVM메모리구조
  • 자바메모리구조
  • 404
  • 컨트롤러
  • 참조변수
  • null
  • 자바프로그래밍
  • 스프링
  • controllerTest
  • 자바
  • scanner #next() #nextLine()

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
simDev1234

심플하고 차분하게

[LMS 만들기] 스프링 컨트롤과 주소 매핑
Framework/프로젝트로 스프링 이해하기

[LMS 만들기] 스프링 컨트롤과 주소 매핑

2022. 9. 30. 04:31

|  스프링 컨트롤과 주소 매핑

- 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
    'Framework/프로젝트로 스프링 이해하기' 카테고리의 다른 글
    • [LMS 만들기] 스프링 시큐러티를 이용한 로그인/로그아웃
    • [LMS 만들기] 회원가입 페이지 만들기
    • [LSM 만들기] Maven 프로젝트 환경 보기
    • [LSM 만들기] 스프링부트 프로젝트 생성하기
    simDev1234
    simDev1234
    TIL용 블로그. * 저작권 이슈가 있는 부분이 있다면 댓글 부탁드립니다.

    티스토리툴바