본문 바로가기

Spring

제 2장 정적 컨텐츠, MVC, API

728x90
반응형
SMALL

스프링 웹 개발 기초

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

정적 컨텐츠

 - spring boot에서 /static 폴더에서 지원하고있다

static 파일 안에 hello-static.html 을 만들어준다.

<!DOCTYPE HTML>
<html>
<head>
    <title>static content</title>
    <meta http-equiv="Content-Type" content = "text/html; charset=UTF-8" />
</head>
<body>
정적컨텐츠입니다.
</body>
</html>

코드 삽입

실행 후 http://localhost:8080/hello-static.html 로 이동

동작 원리

1. localhost:8080/hello-static.html 을 요청을 보냄

2. Spring에 내장된 Tomcat에서 Mapping되어있는 것을 확인 (hello-static이 controller에 있는지 확인)

3. 없는 것을 확인 한 후, static 폴더에서 hello-static.html파일을 확인

4. 존재한다면 html 을 return

5. 만약 존재하지 않는 다면 error페이지

static.html 을 만들어주지 않았을 떄 보여짐

MVC와 템플릿 엔진

 - MVC : Model, View, Controller

  • View : 화면을 그리는데 집중
  • Controller: 비즈니스 로직이나 내부적인걸 처리하는데 집중

이러한 이유로 View와 Controller를 쪼갠다.

 

기존에 만들어왔던 HelloController에 아래 코드를 추가해준다.

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

그 다음

 

templates 디렉토리에 들어가서 hello-template.html 파일을 생성해주고 작성해준다.

hello-template.html 을 resources/template에 추가해준다.

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Hello</title>
    <meta http-equiv="Content-Type" content = "text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

 

완료 되면 실행

안된다. 왜 안되는지 확인해본다.

2023-08-21 14:25:38.792  WARN 47515 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'name' for method parameter type String is not present]

이 에러가 떳다. [name이 없는데 어떻게 만들어요? 라는 내용]

name값을 전달하자 보여준다

동작원리

1. localhost:8080/hello-mvc을 요청

2. helloController가 내장Tomcat을 통해 받음

3. helloController에 우리가 추가한 GetMapping "hello-mvc"로 코드 실행

4. return "hello-template"; 을 통해 hello-template.html을 viewResolver가 templates디렉토리에서 찾음

5. 찾았으면 우리가 추가한 thymeleaf 템플릿 엔진이 html을 변환시켜서 요청한 곳에 다시 반환

 

P.S 강의에서 helloController에서 선언한 함수에서

@RequestParam("name")에서 cmd + p 를 누르면 required true가 되어있다 어떻다 말씀하셨는데 이해가 잘 되지 않아서 참고한 링크들을 남긴다.

 

감사합니다

1. [https://hongku.tistory.com/119] -> RequestParam 사용법, 어떤식으로 사용되는지

2. [https://heavenly-appear.tistory.com/302] -> default value, required 등의 지정하는 방법

 

 

API

HelloController에

 

    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name){
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }
    static class Hello {
        private String name;

        public void setName(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }

 

위 코드 추가 입력

[꿀팁]

  • cmd + n 을 눌러 getter와 setter을 만들어 줄 수 있음 (일일이 타이핑 하지 않아도 됨)

실행시키면 이런 모습이 보여짐

 

동작원리

1. localhost:8080/hello-api 요청

2. helloController가 내장 Tomcat을 통해 받음

3. @ResponseBody 라는 태그가 붙어있는걸 확인하고 HttpMessageConverter로 요청을 보냄 (ViewResolver로 안보냄!)

4. 이때 요청한것이 객체면 JsonConverter로, 단순 문자열이면 StrongConverter로 변환!

5. 위 예시의 경우 Hello라는 객체이기 때문에 Json으로 변환

 

MORE

  • @ResponseBody를 사용하면 HTTP의 BODY 부분에 내용을 직접 반환하겠다는 의미
  • 기본 문자 처리 : StringHttpMessageConverter
  • 기본 객체 처리 : MappingJackson2HttpMessageConverter
  • 여러가지 처리들이 HttpMessageConverter가 기본 등록 되어있으나 주로 Json으로 사용한다.
  • 클라이언트의 HTTP Accept헤더와 서버의 컨트롤러 반환 타입 정보 이 두개를 조합해서 HttpMessageConverter가 선택됨!

 

 

 

 

spring 강의 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세

www.inflearn.com

 

728x90
반응형
LIST