🌎 Web/Spring

[Spring] 스프링 웹 개발의 3가지 방법

오늘 ONEUL 2022. 10. 13. 00:56

스프링 웹 개발의 3가지 방법

  • 정적 컨텐츠 : like WELCOME pages
  • MVC와 템플릿 엔진 : jsp, php → HTML을 서버에서 프로그래밍해서 동적으로 내려줌
  • API : json이라는 데이터 포맷으로 클라이언트한테 데이터 전달

 

정적 컨텐츠

  • resources/static/hello-static.html
  • 인텔리제이 파일 생성 단축키 Ctrl + Alt + Insert
<!DOCTYPE HTML>
<html>
<head>
 <title>static content</title>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>

 

실행해보자

  • run을 돌리고 http://localhost:8080/hello-static.html로 접속하여 확인

 

정적 컨텐츠는 어떻게 동작하는 걸까?

  1. 웹 브라우저에 localhost:8080/hello-static.html을 입력
  2. 내장 톰캣 서버가 요청을 받아서 스프링한테 전달
  3. 스프링은 먼저 컨트롤러에 있는지 찾아봄(컨트롤러에 우선권)
  4. 관련 매핑 컨트롤러가 없다면 resources/static 안에서 찾음
  5. 있으면 웹 브라우저까지 반환

 

 

 

MVC와 템플린 엔진

  • MVC란? Model, View, Controller
  • View에서 모든 로직을 구현 → MVC1 패턴
  • 요즘 떠오르는 키워드 → 관심사 분리, 역할과 책임
  • View는 화면을 그리는 데에 집중
  • Controller나 Model은 비즈니스 로직과 관련이 있거나 내부적인 것을 처리하는 데에 집중

 

Controller

@Controller
public class HelloController {
 @GetMapping("hello-mvc")
 public String helloMvc(@RequestParam("name") String name, Model model) {
 model.addAttribute("name", name);
 return "hello-template";
 }
}
  • 외부에서 파라미터를 받을 때에는 @RequestParam이라는 어노테이션을 사용
  • 받아온 name을 Model에 담으면 View에서 랜더링 할 때 사용

 

View

  • resource/templates/hello-template.html
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
  • Thymeleaf 템플릿 엔진 사용
  • 파일 우클릭 → Copy Path → Absolute Path
    이렇게 하면 서버 없이 파일 자체 확인 가능

 

실행해보자

  • http://localhost:8080/hello-mvc 이렇게만 입력하면 에러, 파라미터가 없기 때문
  • @RequestParam 부분에서 Ctrl + P → 파라미터 정보 단축키
  • required라는 옵션의 기본값이 true이기 때문에 파라미터가 반드시 들어와야 함
  • http://localhost:8080/hello-mvc? name=spring!으로 접속하여 확인

 

MVC와 템플릿 엔진은 어떻게 동작하는 걸까?

  1. 웹 브라우저에 localhost:8080/hello-mvc를 입력
  2. 내장 톰캣 서버가 요청을 받아서 스프링한테 전달
  3. 스프링은 HelloController에 매핑되어 있는 메서드를 찾음
  4. hello-template로 리턴하면서 model에 (name:spring)을 담아 스프링한테 전달
  5. viewResolver가 동작하면서 templates에서 위의 메서드의 리턴 값과 똑같은 이름의 파일을 찾음
  6. Thymeleaf 템플릿 엔진이 변환하여 웹 브라우저에 반환

 

 

 

API

  • 템플릿 엔진을 이용하여 HTML을 내리는 것이 아닌 API 방식으로 데이터를 바로 내려줌

 

@ResponseBody 문자 반환

@Controller
public class HelloController {
 @GetMapping("hello-string")
 @ResponseBody // HTTP BODY에 데이터를 직접 넣겠다는 의미
 public String helloString(@RequestParam("name") String name) {
 return "hello " + name; // name에 spring을 넣는다면 "hello spring"
 }
}
  • @ResponseBody를 사용하면 뷰리졸버(viewResolver)를 사용하지 않음
  • 대신 HTTP의 BODY에 문자 내용을 직접 반환

 

실행해보자

  • http://localhost:8080/hello-string? name=spring!으로 접속하여 확인
  • 소스보기로 보면 html 태그 없이 문자만 있는 것을 확인할 수 있음

 

@ResponseBody 객체 반환

@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;
 }
 }
}
  • Hello라는 객체를 만들고 Getter와 Setter를 설정(단축키 Alt + Insert, 자바 빈 규약, 프로퍼티 접근방식)
  • 메서드의 리턴 값으로 객체를 반환
  • @ResponseBody를 사용하고, 객체를 반환하면 객체가 JSON으로 변환됨
  • 과거에는 XML 방식을 사용했으나, 요즘은 대부분 JSON 방식 사용

 

실행해보자

  • http://localhost:8080/hello-api? name=spring!으로 접속하여 확인
  • 소스보기로 보면 JSON 형태로 반환된 것을 확인할 수 있음

 

@ResponseBody 사용 원리는 뭘까?

  1. 웹 브라우저에 localhost:8080/hello-api를 입력
  2. 내장 톰캣 서버가 요청을 받아서 스프링한테 전달
  3. 스프링은 HelloController에 매핑되어 있는 메서드를 찾음
  4. @ResponseBody를 사용했다면?
    • HTTP의 BODY에 문자 내용을 직접 반환
    • viewResolver 대신 HttpMessageConverter가 동작
    • 기본 문자처리 : StringHttpMessageConverter
    • 기본 객체처리 : MappingJackson2HttpMessageConverter (Jackson은 객체를 JSON으로 바꿔주는 스프링 기본 라이브러리)
    • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
  5. JSON 형태 그대로 웹 브라우저에 반환
💡 참고 : 클라이언트의 HTTP Accept 해더와
서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter가 선택된다

 

 

 

 

※ 이 내용은 인프런에서 김영한 님의 스프링 입문 강의를 듣고 정리한 내용입니다.