반응형
스프링 웹 개발 기초
프로젝트 생성
https://start.spring.io/ 에서 프로젝트를 GENERATE하고 IDE에서 임포트하자.
라이브러리
Gradle
은 의존관계가 있는 라이브러리를 함께 다운로드 한다.
스프링 부트 라이브러리
- spring-boot-starter-web
- spring-boot-starter-tomcat
- spring-webmvc
- springboot-starter-thymeleaf
- spring-boot-starter(공통) : 스프링 부트 , 스프링 코어, 로깅 기능
웹 개발에는 크게 정적 컨텐츠, MVC와 템플릿 엔진, API 세 가지로 나눌 수 있다.
스프링 부트는 static/index.html 을 올려두면
Welcome page
기능을 제공한다.
정적 컨텐츠
HTML 파일을 있는 그대로 사용자에게 보여주는 방식이다. 스프링 컨테이너에서 요청에 대한 정보를 컨트롤러에서 찾고 없으면 static/요청파일
을 찾아서 반환해준다.
MVC와 템플릿 엔진
현재 가장 많이 개발하는 방식으로 JSP, PHP와 같은 HTML을 동적으로 변경해서 사용자에게 보여주는 방식이다.
타임리프를 템플릿 엔진을 사용하여 테스트 해보자.
package hello.hellospring;
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-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
@RequestParam
은 URL 요청 파라미터에 대한 정보를 받아온다.@RequestParam
을 사용하면http://localhost:8080/hello-mvc?name=spring
다음과 같이 쿼리스트링에 해당 파라미터명이 있어야만한다. 만약 없을 수도 있는 경우@RequestParam(value = "name", required = false) String name
를 사용하자.Model
은 forward 방식처럼 데이터를 담아서 화면단에 보내는 방식이다. 즉name
이라는 키로name
값을 담아서 다음 화면에 전달한다.
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
- 타임리프를 통해 컨트롤러에게 전달받은 데이터를 화면에 보여주자.
API
JSON과 같은 데이터 포맷을 전달하는 방식이다. 클라이언트에게 데이터만 전달해서 뷰는 클라이언트측(뷰, 리액트 등)에서 만들 거나 서버 간 통신을 할 때 사용한다.
@ResponseBody 문자 반환
package hello.hellospring;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}
@ResponseBody
를 사용하면 뷰 리졸버를 사용하지 않고HTTP Body
에 문자 내용을 직접 반환한다. 즉, 뷰를 반환하는 것이 아닌 데이터를 반환한다고 생각하면 된다.
package hello.hellospring;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.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;
}
}
}
@ResponseBody
를 사용하고, 객체를 반환하면 객체가 JSON으로 자동 변환된다.
- 객체를 반환하면 자동으로 JSON 형식으로 변환된 것을 확인해볼 수 있다.
@ResponseBody
를 사용하면 스프링 컨테이너가 뷰리졸버를 통해 뷰를 반환하는 것이 아닌HttpMessageConverter
를 통해 데이터를 자동으로 반환해서 전달해준다. JSON으로 변환되는 과정은MappingJackson2HttpMessageConverter
를 통해 변환된다. 이 외에도 여러 데이터들이 기본으로 등록되어 있다.
본 포스팅은 인프런 - 김영한님의 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술" 편을 보고 정리하였습니다.
반응형