본문 바로가기
백엔드 공부/스프링 입문

스프링 웹 개발 기초

by CSEGR 2024. 3. 5.
728x90

(인프런) 김영한 님의 스프링입문 - 코드로 배우는 스프링부트,웹 MVC, DB접근기술  강의를 보고 리뷰한 글입니다. 

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

 

static 폴더에 hello-static.html 파일을 만든다. 

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

정적 파일이 그대로 반환되어 렌더링 된다. 

http://localhost:8080/hello-static.html 주소를 치면 톰켓 서버에서 스피링 컨테이너에서 hello-static 관련 컨트롤러를 찾아본다. (우선순위)

하지만 파일이 존재하지 않으므로 resources의 static 에서 hello-static.html을 찾는다. 

존재하면 html 파일 반환 및 렌더링 

MVC와 템플릿 엔진 

MVC = Model View Controller

 

<HelloController>

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") //웹어플리케이션에서 /hello라고 들어오면 이 메소드 호출함.
    public String hello(Model model){
        model.addAttribute("data", "Spring!!!");
        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>

<!DOCTYPE HTML>
<html xmlns:th = "http://www.thymeleaf.org">
<body>
<p th:text = "'안녕하세요. ' + ${name}" >Hello! empty</p>
</body>
</html>

 

주소에 localhost:8080/hello-mvc?name={name}

name 부분에 넣는 값에따라 HelloController의  name 부분에 들어 가는 값이 변한다. 

이후 hello-template.html에 ${name} (= 모델에서 key 값을 꺼낸다는 의미) 부분에 들어간다. 

 

 

API 

@ResponseBody 를 사용하는 경우 HTTP의 BODY에 문자 내용을 직접 반환 

'viewResovler'대신에 'httpMessageConverter'가 동작

● 문자열의 경우 

HelloController 부분에 추가 

	@GetMapping("hello-spring")
    @ResponseBody //http 에서 바디부에 이 데이터를 직접 넣어주겠다는 의미
    public String helloSpring(@RequestParam("name") String name){
        return "hello "+ name;
    }

 

localhost:8080/hello-spring?name=spring을 넣는경우 소스를 보면, html 태그 없이 hello spring이라고 되어있음. 

Mvc와 다르게 템플릿을 조작하는 방식이 아닌 데이터를 그대로 내려줌.  

 

 

●데이터의 경우 

 

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 형식으로 렌더링이 된다.

웹 브라우저에서 localhost:8080/hello-api를 치면 톰켓 서버에서 hello-api를 스프링에 던진다. 

@ResponseBody이 없으면 viewResolver에 던져서 해당되는 템플릿을 찾아서 돌려줌. 

하지만 @ResponseBody가 있고 문자열인 경우 이 문자열을 HTTP 응답에 바로 넣어서 넘겨줌. -> StringConverter 동작

문자열이 아니고 객체를 넘겨주는 경우 json 형태로 데이터를 만들어서 HTTP 응답에 반환해줌. -> JsonConverter 동작 

 

즉, 

기본 문자 처리 : StringHttpMessageConverter

기본 객체 처리 : MappingJackson2HttpMessageConverter

 

 

728x90