[Spring] 입문_스프링 웹 개발 방법 3가지

gayoung·2022년 2월 12일
0

스프링 완전 정복

목록 보기
3/33
post-thumbnail

1. 정적 컨텐츠

resources/static/hello-static.html

<!DOCTYPE HTML>
<html>
<head>
    <title>Hello</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Hello
<a href="/hello">hello</a>
</body>
</html>

[ 작동원리 ]

  • hello-static 관련 컨트롤러가 없으므로 바로 hello-static.html을 찾아 그대로 출력해줌

2. MVC와 템플릿 엔진

  • view는 화면을 그리는데 모든걸 쏟음
  • controller, model -> 내부적인거 통제(비즈니스 로직, 서버 등)
  • 템플릿 엔진: 랜더링이 된 html을 고객에게 전달

2-1. controller에서 지정한 단어 넘기기

  • model.addAttribute로 "hello!!"를 지정함

[ 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";
    }
}

[ View ]

<!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="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
</body>
</html>

  • parameter로 값을 받아오지못하면 white label이 뜸

2-2. 외부에서 단어 입력해 넘기기

  • 파라미터(name)을 받아와서 hello-template.html에 model.addAttribute를 이용해 name을 넘겨줌

[ Controller ]

@GetMapping("hello-mvc")
public String helloMvc(@RequestParam(value="name", required = true) String name, Model model) {
    model.addAttribute("name", name);
    return "hello-template";
}
  • required=true가 default이므로 안적어도 괜찮음

[ View ]

<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
  • thymeleaf의 장점
    • 서버없이 absolute path를 이용해 크롬에서 열어도 (hello! empty)로 나옴
    • 동작을 하면 th:text의 내용으로 나옴

[ 작동 원리 ]


3. API

3-1. @ResponseBody 문자 반환

  • html파일 없이 http의 body부에 직접 데이터 넣기
  • json이라는 데이터 포멧으로 클라이언트한테 데이터 전달(다양한 방법이 있지만, 최근에는 json으로 많이 함)

[ Controller ]

@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
    return "hello " + name;
}
  • @ResponseBody : html의 가 아나리 http(header/body)에서의 body부에 내가 직접 데이터 넣겠다는 의미
  • @ResponseBody 를 사용하면 뷰 리졸버(viewResolver) 사용하지 않음(.html)

3-2. @ResponseBody 객체 반환

  • @ResponseBody 를 사용해 객체를 반환하며, 이때 객체는 json으로 변환됨

[ Controller ]

@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;
    }
}

[ 작동 원리 ]

  • HTTP의 BODY에 문자 내용을 직접 반환
  • viewResolver(MVC패턴의 view) 대신에 HttpMessageConverter 가 동작
  • 기본 문자처리: StringHttpMessageConverter
  • 기본 객체처리: MappingJackson2HttpMessageConverter
  • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

0개의 댓글