스프링 입문 (정적 컨텐츠, MVC와 템플릿 엔진, API)

ju_bro·2022년 5월 9일
0

Spring

목록 보기
1/5
post-thumbnail

🌠 프로젝트 생성

  • Java 11, IntelliJ, Gradle 사용


🌠 라이브러리 살펴보기

gradle은 의존관계가 있는 라이브러리를 함께 다운로드 합니다.

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
   implementation 'org.springframework.boot:spring-boot-starter-web'
   testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

1. 스프링 부트 라이브러리 (의존관계)

  • spring-boot-starter-thymeleaf : 타임리프 템플릿 엔진(View)

  • spring-boot-starter-web
    spring-boot-starter-tomcat : 톰켓(웹서버)
    spring-webmvc : 스프링 웹 MVC

  • spring-boot-starter(공통) : 스프링 부트 + 스프링 코어 + 로깅
    spring-boot -> spring-core
    spring-boot-starter-logging -> logback, slf4j

2. 테스트 라이브러리 (의존관계)

  • spring-boot-starter-test
    junit : 테스트 프레임워크
    mockito : 목 라이브러리
    assertj : 테스트 코드를 좀 더 편하게 작성하도록 도와주는 라이브러리
    spring-test : 스프링 통합 테스트 지원


🌠 View 환경설정

Welcome Page 기능

스프링 부트는 src -> main -> resources 위치에

static/index.html

파일을 올려두면 Welcome page 기능을 제공합니다.


만약, static 폴더에 index.html 파일이 존재하지 않는다면
웹 브라우저의 요청에 따라 Controller에서 Mapping된 함수를 찾아 return 합니다.

즉, 컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버(viewResolver)가 화면을 찾아서 처리합니다.

  • templates 폴더의 html
resources:templates/ + {ViewName} + .html


🌠 정적 컨텐츠, MVC와 템플릿 엔진, API

1. 정적 컨텐츠

내장 톰켓 서버가 웹 브라우저의 요청을 받고 스프링 컨테이너에 넘기는데,
정적 컨텐츠의 경우 관련 Controller가 없으므로 static 위치의 해당 html을 찾아 웹 브라우저에 반환합니다.


예시 코드:

@GetMapping("hello")
public String hello(Model model) {
    model.addAttribute("data","hello");
    return "hello";
}

📌 핵심 : 정적 컨텐츠는 파일을 그대로(정적으로) 고객에게 전달


2. MVC와 템플릿 엔진

  • MVC : Model, View, Controller
    정적 컨텐츠와 마찬가지로 내장 톰켓 서버가 웹 브라우저의 요청을 받고 스프링 컨테이너에 넘기면 Mapping된 Controller를 찾아 해당 Mathod를 호출해줍니다.
    viewResolver는 Mathod의 return값으로 넘겨받은 html을 templates 위치에서 찾아 Model로 감싸져 있는 매개변수 값과 함께 Thymeleaf 템플릿 엔진에게 넘겨 처리하도록 합니다.
    최종적으로 Thymeleaf 템플릿 엔진이 렌더링하여 변환된 html을 웹 브라우저에 반환합니다.


    예시 코드:
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) { 
    model.addAttribute("name", name);
    return "hello-template";
}

📌 핵심 :
(1) 정적일 때는 변환하지 않고 그대로 반환하였지만 템플릿 엔진에서는 변환하여 웹 브라우저에 반환합니다.
(2) 템플릿 엔진은 Model, View, Controller 방식으로 쪼개어 html을 프로그래밍 한 것으로 렌더링 하여 Client에게 전달합니다.


3. API

  • API : Application Programing interface
    내장 톰켓 서버가 웹 브라우저의 요청을 받고 스프링 컨테이너에게 넘기면 Mapping된 Controller를 찾습니다.
    해당 Contoller에 @ResponseBody 어노테이션이 있다면 viewResolver에게 전달하지 않고 HttpMessageConverter에게 전달합니다.
    이때, Controller의 return 값이 객체라면 Json 형식으로, 문자열이라면 String 형식으로 변환하여 웹 브라우저에 반환해줍니다.


    예시 코드:
@GetMapping("hello-api")
@ResponseBody // json 형태로 객체 데이터를 반환
public Hello helloApi(@RequestParam("name") String name) {
    Hello hello = new Hello(); // 객체
    hello.setName(name);
    return hello;
}

static class Hello {
    private String name; // key

    public String getName() {
        return name;
    }
   
    public void setName(String name) {
        this.name = name; // value
    }
}

📌 핵심 : Spring에서 API 방식은 ResponseBody를 통해 HttpMessageConverter를 사용하여 Json형식으로 바꾸어 객체를 반환하는 것으로 View 방식을 이용하지 않고 바로 http response로 반환해줍니다.



이 글은 인프런 "김영한" 님의 [스프링 입문] 강의를 듣고 개인적으로 학습하기 위해 정리한 글입니다. 🙂

https://inf.run/M2nF

profile
Inha University

0개의 댓글