스프링 입문 2 - 스프링 웹 개발 기초

박철민·2022년 8월 2일
0

스프링 완전 정복

목록 보기
3/8

스프링 웹 개발 기초

웹을 개발하는데에 있어 3가지 방법이 있다.
정적 컨테츠, MVC와 템플릿 엔진, API

그냥 서버에서 뭐하는 것 없이 파일을 서버에 내려주는것

모델 view controller

API
JSON이라는 데이터 포멧으로 값을 넘겨주는 방식

서버끼리 통신시 API방식으로 한다. HTML을 사용할 필요가 없기 때문에

1. 정적 컨텐츠

스프링 부트는 정적인 컨텐츠를 제공을 해줍니다.

기본 설정으로 local에서 찾아서 해준다. 그것들이 rsource에 담겨 져 있는 것을 찾아서 건네준다.

코드

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

결과

동작 방식

큰 개념으로 다음과 같다.

여러가지가 많이 나온다. 디테일한 것보다는 상위의 것을 보여준다.

내장 톰캣에서 요청을 받고 스프링에 넘긴다.

스프링 컨테이너는 관련 컨테이너가 없어서 이것을 밑으로 넘겨준다.

static/hello-static.html을 받아줍니다.


-- 테스트--

다음과 같이 controller에서 잡아주면 어떻게 될까?

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

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

    @GetMapping("hello-static.html")
    public String helloHtml(Model model) {
        model.addAttribute("data", "hello-html!");
        return "hello";
    }
}


결과

Container가 먼저 잡는다!


2. MVC와 템플릿 엔진

MVC : Model, View, Controller

옛날에는 Model이랑 View가 구분되지 않는다.

MVC로 많이 하는데 개발 처음할때 관심사를 분리한다.

VIEW는 화면을 구성하는데 집중한다.

Controller, Model은 내부적인 것을 처리하는데 집중을 한다.

과거에 VIEW, Controller, Model이 하나에 있을 때
JSP 파일 하나에 수천이 넘어갔다

유지보수가 너무 힘들고 보기 힘들다.

요즘에는 컨트롤 뷰 나누는 것이 기본이다.

모델에 필요한 것들을 담아 주고받는 것이 많다.

HelloController.java

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HelloController {

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

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


hello-template.html

<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</h
tml>

localhost:8080/hello-mvc?name=spring!

동작 방식

어떻게 이렇게 동작을 하는가?

URL에 name =spring!이 넘겨집니다.
컨트롤러는 그것을 받아 모델아 담아 viewResolver에 넘겨줍니다.

viewResolver(화면 관련 해결자)가 동작하여
view를 찾아서 건네줍니다.

tempaltes가 model을 받아서 그 중 키 값을 참고해서 값을 다뤄준다.

템플릿 엔진이 HTML 변환 해서 보내줍니다.


3. API

@ResponseBody 문자 반환

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

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

//    @GetMapping("hello-static.html")
//    public String helloHtml(Model model) {
//        model.addAttribute("data", "hello-html!");
//        return "hello";
//    }


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

    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name) {
        return "hello " + name;
    }
}

@ResponseBody를 사용하면 뷰 리졸저를 사용하지 않는다.
HTTP에 바디 부에 이 데이터를 직접 넣어주겠다라는 의미이다.

뷰가 존재하지 않는다.

localhost:8080/hello-string?name=spring!!!!

그냥 문자가 그대로 간다.

템플릿 엔진은 화면을 뭔가 가지고 조작을 하지만 이것은 그냥 데이터를 다룬다.

문자로 하는 방식이 있지만 잘 안쓴다.

진짜는 지금

데이터 방식!

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 String getName() {
            return name;
        }

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

JSON 방식으로 되는 것을 알 수 있다.

과거에는 XML이었으나 최근에는 거의 JSON 방식으로 통일이 되었습니다.

getter, setter

이것을 자바 빈 규약이라고 합니다.

메서드를 통해서만 접근을 한다.

이러한 용식을 프로퍼티 접근 방식이라고 합니다.

동작방식

@ResponseBody 사용 원리

톰캣 내장 서버에서 hello-api 요청이 온 것을 던져준다.
스프링은 그것에 맞는 컨트롤러에 건네준다.
😯어라? @ResponseBody가 있다!

HTTP의 BODY에 문자 내용을 직접 반환

😯문자가 아닌데? 객체인데?

객체는 JSON 방식으로 처리하자!
-> 이게 기본 정책!

ResponseBody이면 객체를 넘기고 몇가지 조건을 봅니다!

ViewResolver 대신에 HttpMessageConverter가 작동합니다!
기본 문자 처리는 StringConvertor
기본 객체 처리는 MappingJackson2HttpMessageCOnverter가 처리를 합니다.
- (JSON으로 바꿔주는 대표 라이브러리 Jackson, GSON이 있습니다.)
byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음.

깊게 파면 우리의 입맛에 맞춰서 바꾸기도 한다.

-> 지금 우리가 그렇게 바꿔서 하고 있다.

현재 주류 개발 방식은 API 방식!

API 방식이 익숙하지 않아 많이 힘들다.

-> 좀 더 배우고 잘 사용할 수있도록 노력할것

메시지 컨버터

클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 'HttpMessageController'가 선택됩니다!


이렇게 3가지 경우를 배웠습니다/

정적 컨텐츠 -> 파일을 그대로 한다.

MVC -> 랜더링을 해서 그것을 넘겨준다.

API -> JSON 스타일로 변환을 해준다.,

profile
넓고 깊은 지식을 위해 삽질 중

0개의 댓글