Spring/MVC

[Spring/입문] 스프링 웹 개발 기초

lumana 2024. 4. 28. 18:44

스프링 웹 개발 기초


정적 컨텐츠

  • 서버에서 특별한 동작을 하지 않고 파일을 그대로 웹브라우저(client)로 전달
  • 스프링 부트는 정적 컨텐츠를 제공함
  <!DOCTYPE HTML>
  <html>
  <head>
      <title>static content</title>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
  <body>
  정적 컨텐츠 입니다.
  </body>
  </html>
  • localhost:8080/hello-static.html
  • 원하는 파일을 넣으면 파일 그대로 반환됨
  • 내장 톰켓 서버가 요청을 받고 Spring에 controller가 있는지 찾아봄
  • hello-static이라는 컨트롤러, 맵핑된 컨트롤러가 존재X
  • resources 안에 있는 static/hello-static.html을 찾음
  • 찾은 파일을 반환

MVC와 템플릿 엔진

  • Model, View, Controller
  • 서버에서 변형을 해서(EX. HTML 파일 변경) 웹브라우저(client)로 전달
    <html xmlns:th="http://www.thymeleaf.org">
    <body>
    <p th:text="'hello ' + ${name}">hello! empty</p>
    </body>
    </html>
    • 단순히 hello-mvc를 열면 에러 발생
    • localhost:8080/hello-mvc?name=spring!!!!!!
      • 파라미터를 넘겨줘야 함
    • controller가 name=spring!!!!!!을 보고 model의 name에 spring!!!!!!을 담음
    • ${name} : 모델의 key 값이 name인 것에서 value를 꺼냄
@Controller 
public class HelloController { 
    @GetMapping("hello-mvc") 
    public String helloMvc(@RequestParam("name") String name, Model model) { 
        model.addAttribute("name", name); 
        return "hello-template"; 
    } 
}
  • 작동방식
    • 웹브라우저에서 localhost 8080에 hello-mvc 넘기면 Spring Boot가 내장 톰켓 서버를 거침
    • 내장 톰캣 서버는 hello-mvc를 스프링한테 전달
    • 스프링은 helloController 메서드에 맵핑이 돼 있는걸 확인하고 이 메서드를 호출
    • helloController는 hello-template와 key(name):value(spring)을 스프링한테 전달
    • 스프링 viewResolver가 return의 string과 똑같은 파일을 찾아서 Thymeleaf 템플릿 엔진에서 처리해 달라고 전달
      • ViewResolver는 뷰를 찾고 템플릿을 연결시켜줌
    • 템플릿 엔진이 렌더링 후 변환한 HTML을 반환함

API

  • 데이터 구조 포맷으로 클라이언트 한테 데이터를 전달(요즘은 JSON 많이 사용)
    • @ResponseBody : http의 body부에 데이터를 직접 넣겠다
    • 템플릿 엔진과 차이점 : view가 따로 존재하지 않고, name 문자가 그대로 전달됨
    • http://localhost:8080/hello-string?name=spring 열어보면 html 태그가 존재하지 않고, 단순히 문자열 그대로 내려감. 즉 데이터가 그대로 내려감
     @Controller
     public class 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;
    } }
    }
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
	return "hello " + name; // "hello spring" 
}
  • 작동 방식
    • 톰켓 내장 서버에서 hello-api를 스프링에 전달
    • 스프링에서 hello-api controller를 찾음
    • responseBody의 annotaion이 존재(얘가 없으면 viewResolver로 전달됨)
    • httpMessageConverter가 동작 --> 리턴 타입이 객체임 --> JsonConverter가 동작해서 json 포맷으로 변환
      • 리턴 타입이 string이면 StringConverter가 동작
      • 기본 문자처리: StringHttpMessageConverter
      • 기본 객체처리: MappingJackson2HttpMessageConverter
    • json을 http 바디에 실어서 client에게 전달
    • HTTP Accept 해더에 특정 포맷을 지정해주면 해당 메시지컨버터가동작을 함

참조) 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강좌 (인프런 김영한)