Fascination
article thumbnail

[Spring Intro] Section 02. 스프링 웹 개발 기초

강의: 김영한의 스프링 입문

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와 템플릿 엔진: 서버에서 HTML을 프로그래밍해 동적으로 내려주는 것이다
  • API: JSON이라는 데이터 구조 포맷으로 클라이언틍게 데이터를 전달하는 방식이며, 서버끼리의 데이터 통신에도 사용한다

 

 

# 정적 컨텐츠

1. 정적 컨텐츠


스프링 부트 정적 컨텐츠 기능: https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content
  • 스프링 부트는 기본적으로 resources/static 경로 내의 파일을 정적 콘텐츠로 사용한다
  • 실습
    • resources/static/hello-static.html을 작성하고 확인한다

  • resources/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

 

2. 정적 컨텐츠 이미지

  • 웹 브라우저에서 localhost:8080/hello-static.html에 접속
  • 내장 tomcat 서버가 요청을 받아 spring에게 hello-staitc.html에 대해서 전달
  • Spring이 컨트롤러 쪽에 hello-static과 관련한 컨트롤러가 있는지 먼저 확인 (컨트롤러가 정적 콘텐츠보다 우선 순위를 가짐)
  • 매핑된 hello-static 컨트롤러가 없으므로 resources의 static 내에 해당 파일이 있는지 확인하고 있으면 브라우저로 반환

 

 

# MVC와 템플릿 엔진

1. MVC와 템플릿 엔진

  • MVC: Model, View, Controller
  • model1 방식: View에 모든 것을 구현하는 방식으로 대표적인 예시로 jsp가 있다

View: 화면을 그리는데 집중한다
Model, Controller: 비지니스 로직이나 내부적 처리에 집중한다

 

2. Controller

  • @RequestParam: url 파라미터를 받을 때 사용한다
  • HelloController에 다음 코드를 추가한다
@Controller
  public class HelloController {
      @GetMapping("hello-mvc")
      public String helloMvc(@RequestParam("name") String name, Model model) {
          model.addAttribute("name", name);
          return "hello-template";
      }
}

 

3. View

  • resources/templates/hello-template.html를 새로 만들어준다
<html xmlns:th="http://www.thymeleaf.org">
  <body>
  <p th:text="'hello ' + ${name}">hello! empty</p>
  </body>
 </html>

 

4. 접속 및 확인

  • localhost:8080/hello-mvc에 접속해보면 다음과 같이 에러 페이지가 발생하는 것을 확인할 수 있다
    • 로그를 확인해보면 필수 파라미터 name이 없는 것을 확인할 수 있다

  • 파라미터 정보 확인: Command + P (Mac 기준)
    • 파라미터 정보를 확인해보면 value() 또는 name()이 있다
    • required()의 default가 true임을 알 수 있으며 true인 경우에는 parameter 값을 반드시 입력해줘야 에러가 나지 않는다

  • GET 방식에서의 url 파라미터 전달 방식
    • http://localhost:8080/hello-mvc?name=spring!!

template에서 thymeleaf엔진의 <p> 태그는 태그로 감싸져 있는 내용이 th:text= 뒤에 오는 내용으로 치환되어 보여진다. 이때, 서버 없이 해당 파일을 열게되면 태그로 감싸고 있는 본래 내용이 보여진다

왼쪽은 스프링부트를 사용하여 페이지를 브라우저에 띄운 모습이고, 오른쪽은 서버 없이 웹페이지를 브라우저에 바로 띄운 모습이다

 

5. MVC, 템플릿 엔진 이미지

  • 웹 브라우저가 접속하면, 내장 tomcat 서버가 spring에 요청을 전달한다
  • spring은 helloController의 hello-mvc가 매핑이 되어있음을 확인하고 해당되는 메소드를 호출한다
  • hello-template를 returngkau model에는 인자로 받은 값(key가 name인 value 값)을 함께 spring에 전달한다
  • spring이 viewResolver가 return 받은 값과 똑같은 템플릿을 찾아 thymeleaf 템플릿 엔진으로 랜더링을해서 변환한 HTML을 웹 브라우저에 표시한다

ViewResolver: View를 찾아주고 템플릿 엔진을 연결한다

 

 

# API

1. MVC와 API

  • MVC: HTML을 바로 내리는 것이다 → 현재 강의는 웹과 스프링부트의 관계를 주로 설명하고 있어 이와 같이 정의하신 것이다
  • API: 데이터를 바로 내리는 것이다

 

2. @ResponseBody

ResponseBody에서의 Body는 HTML에서의 body 태그를 의미하는 것이 아니라 HTTP 프로토콜에서의 body 부분을 의미하는 것이다

 

3. @ResponseBody 문자 반환

  • hello-string
    • hello + [인자로 받은 name의 값]을 view 없이 return하여 바로 내려주는 것이다
    • 즉, @ResponseBody를 사용하면 viewResolver를 사용하지 않는다
@Controller
  public class HelloController {
      @GetMapping("hello-string")
      @ResponseBody
      public String helloString(@RequestParam("name") String name) {
          return "hello " + name;
      }
}
  • 접속: http://localhost:8080/hello-string?name=spring

 

4. @ResponseBody 객체 반환

  • hello-api
    • @ResponseBody는 객체를 JSON 형태로 변환한다
    • Java에서는 private로 선언된 변수에 바로 해당 클래스 외에 다른 곳에서 직접 접근이 불가능하므로 getter/setter 함수를 통해 값에 접근한다
    • 위와 같은 방식을 프로퍼티 접근 방식이라고도 부른다
@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://localhost:8080/hello-api?name=spring

 

5. 템플릿 엔진 vs @ResponseBody

  • 소스보기로 페이지를 비교했을 때 @ResponseBody를 사용한 경우 HTML 코드 없이 string만 있음을 확인할 수 있다 
  • View 없이 return 부분이 그대로 웹 브라우저에 표시된다는 것이 템플릿 엔진과의 차이점이다

hello-mvc source code
hello-string source code
hello-api source code

 

6. @ResponseBody 사용 원리

  • 웹 브라우저에서 접근하면 tomcat 내장 서버에서 hello-api가 왔음을 spring에게 알린다
  • springdms hello-api와 관련된 컨트롤러가 있음을 확인한다
  • 이때, ResponseBody 주석을 확인하면, HTTP 응답 Body에 문자 내용 혹은 객체를 반환한다
  • HttpMessageConverter의 처리
    • 기본 문자처리: StringHttpMessageConverter
    • 기본 객체처리: MappingJackson2HttpMessageConverter
    • byte 처리 등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있다

클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 두가지를 조합해서 HttpMessageconverter가 선택된다

 

profile

Fascination

@euna-319

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!