[SpringBoot-스프링 입문] 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술: 2. 스프링 웹 개발 기초
[지금 무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 - 인프런
스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세
www.inflearn.com
해당 강의는 "Inflearn"에 등록된 김영한님의 Springboot 강의입니다.
0. 웹 개발 방식에는 크게 3가지 방식이 있다.
- 정적 콘텐츠 방식
- MVC와 템플릿 엔진 방식(SSR -> 저번 글에 포스팅 했습니다.)
- API 방식(문자 반환 방식, JSON 데이터 반환 방식)
현재 가장 인기 있는 방식은 바로 API 방식이다. 특히 JSON
데이터를 반환하는 RESTful API
가 대세를 이루고 있다. 서버는 데이터를 JSON 형태
로 반환하고, 클라이언트는 이 API를 호출
해 필요한 데이터를 받아서 사용하는 식이다. 이 방식의 가장 큰 장점은 클라이언트와 서버의 역할이 명확히 분리되어 있어서 각각 독립적으로 발전시킬 수 있다는 거디. 현재 웹 개발에서는 서버가 주로 데이터를 제공하는 역할을 담당하고, 클라이언트는 이 데이터를 사용자에게 효율적으로 보여주는 역할을 하게 된다. 그리고 이 모든 과정에서 RESTful API
가 큰 역할을 하고 있다. 특히 스프링 부트를 이용한 REST API 개발은 그 효율성과 강력한 기능 덕분에 많은 개발자들 사이에서 인기를 끌고 있다.
(스프링부트의 Rest API
및 API 개발
은 Spring Boot JPA 활용편2
에 기재하겠습니다.)
1. 정적 컨텐츠
resources/static/hello-static.html
<!--static/index.html 을 올려두면 Welcome page 기능을 제공한다.-->
<!DOCTYPE HTML>
<html>
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적콘텐츠 입니다.
</body>
</html>
결과
동작 과정
정적 콘텐츠는 resources/static
디렉토리에 그냥 html 파일 하나 만들고, 해당 파일명으로 접속하면
스프링부트의 내장서버(톰캣) MVC 없이 단순히 html파일만 띄운다.
2. MVC와 템플릿 엔진
- mvc: model-view-controller
Controller
및 Model
public class HelloController {
//2.MVC와 템플릿엔진
//내장 tomcat 서버가 콘트롤러에 hello-mvc로 넣어줌. ★템플릿엔진이 viewResolver에게 던짐★
@GetMapping("hello-mvc")
//@RequestParam는"name"이란 키값으로 parameter 받아서 name이란 이름으로 모델에 넘기기
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template"; //view resolver가 이 값을 받아서 찾아서 html로 변환(tymeleaf엔진이 처리)
}
}
View
resources/templates/hello-template.html
<html xmlns:th="http://www.thymeleaf.org">
<body>
<!--우측의 "hello! empty"은 그냥 미리 보기 느낌. 실제 서버를 타서 오면'hello ' + ${name}이게 나옴 -->
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
실행
/hello-mvc
경로와 사용자가 요청하는 파라미터 ?파라미터명= 값
을 합치면 위 처럼 작동한다.
지난 시간 프로젝트 설정시 start.spring에서 dependecies(라이브러리)에 Thymeleaf를 추가했다.
Controller의 helloMvc메서드
는 /hello-mvc
경로를 받으면Get
에 대한 요청
을 응답한다. 이때 메서드는 Model객체
와 @RequestParam("파라미터") String 파라미터 명
annotation을 이용하여 사용자가 입력한 파라미터 값에 따라 model 객체
에 값을 추가했다. 이를 통해 동적으로 사용자가 원하는 값을 입력하면 해당 값을 받아서 사용하는 view
를 띄운다.
이때 view
는 view Resolver
가 view
를 찾고, Thymeleaf 템플릿 엔진
이 랜더링 작업
후에 웹 브라우저에 띄운다.
3. API
3.1 API의 문자반환 방식
@ResponseBody
annotation을 메서드에 설정하면 해당 메서드가 반환하는 값은 http의 body
에 값을 직접 넣게 된다.
//3.1 문자반환 방식
@GetMapping("hello-string")
@ResponseBody//★★★http의 body에 직접 넣는것★★★
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
결과
이 방식은 방금 전 MVC와 비슷하게 보이지만 작동은 완전 다르다. 전까지는 model에 키(파라미터): 값
을 넣은 후 그 model
을 view(html)
에 넘기고, 그 view
를 랜더링
해서 보여줬는데, 위 방식의http
라는 프로토콜의 Body
에 직접 데이터를 넣고 그 값
(hello {name:값}
) 을 반환하였다.
3.2 API의 Json 데이터 반환 방식
//3.2 ★★★Json데이터 반환 방식(Json: key,value 한쌍의 데이터)★★★제일 자주 쓰임.
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello; //{"name":"request parameter"}의 객체 반환
}
//한 클래스내에 또다른 클래스-> static class
static class Hello {
private String name;
//getter,setter 는 우클릭 Generate 클릭하면 생성가능
//이러한 getter,setter를 넣는 방식을 property방식이라고 한다.
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//1.(★★★Responsebody 형태로 그냥 넣음.(viewResolver가 안함)★★★)
//2.HttpMessageConverter가 동작->jsonConverter(json이면),StringConverter(String이면) 가 웹 브라우저에 띄움
결과
동작방식
위 사진을 보면 HTTP는 Header와 Body로 이루어져 있다.
(https는 http에 ssl을 추가하여 데이터를 암호화하여 송수신 하는 것이다. 추후 해당 내용에 대해서도 업로드 할 예정이다.)
Http의 Body
에는 Json,html
등의 데이터 형식
으로 저장해서 인터넷을 통해 전송을 한다.
Spring boot
에서의 API개발은 @ResponseBody
라는 것을 명시한 메서드를 개발하는 것 과 같다.
(추후엔 콘트롤러에 @RestController
로 명시하면 (콘트롤러 + 각 메서드&@ResponseBody라고 할 수 있다.)
위의 helloApi
메서드는 @ResponseBody
를 통해 http의 Body
에 객체
를 넣어 반환한다.
{"name":"request parameter"}의 객체 반환
해당 객체에 값을 setting
하고 객체를 반환하면 스프링 부트에는 자동으로 객체
를 Json데이터
로 처리하는 메서드들이 처리한다.
정리하면 API개발은 @ResponseBody를 메서드에 명시하고, 객체를 생성한 후에 객체에 원하는 값을 setting (setter혹은 생성자를 통해서) 하고, 그 객체를 반환만 하면 된다. api호출시 http의 메서드 mapping?파라미터 형태로 호출하면 된다.
4. 전체 코드( /src/main/java/hello/hellospring/controller/HelloController.java)
//1. 콘트롤러 설정 (MVC의 C)
@Controller
public class HelloController {
//1.정적컨텐츠
//★★★hello값이 입력되면 "hello"라는 뷰이름을 반환함. 추후, "hello.html"을 뷰 리졸버가 찾음★★★
@GetMapping("hello")
public String hello(Model model) {
//model은 data,hello로 구성되어 있다.
model.addAttribute("data", "changuk!!");
return "hello"; //ctrl+click은 해당 소스로 넘어감.
}
//2.MVC와 템플릿엔진
//내장 tomcat 서버가 콘트롤러에 hello-mvc로 넣어줌. ★템플릿엔진이 viewResolver에게 던짐★
@GetMapping("hello-mvc")
//"name"이란 키값으로 parameter 받아서 name이란 이름으로 모델에 넘기기
//@RequestParam는
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template"; //view resolver가 이 값을 받아서 찾아서 html로 변환(tymeleaf엔진이 처리)
}
//3.API 방식
//3.1 문자반환 방식
@GetMapping("hello-string")
@ResponseBody//★★★http의 body에 직접 넣는것★★★
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
//3.2 ★★★Json데이터 반환 방식(Json: key,value 한쌍의 데이터)★★★제일 자주 쓰임.
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello; //{"name":"request parameter"}의 객체 반환
}
//한 클래스내에 또다른 클래스-> static class
static class Hello {
private String name;
//getter,setter 는 우클릭 Generate 클릭하면 생성가능
//이러한 getter,setter를 넣는 방식을 property방식이라고 한다.
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//1.(★★★Responsebody 형태로 그냥 넣음.(viewResolver가 안함)★★★)
//2.HttpMessageConverter가 동작->jsonConverter(json이면),StringConverter(String이면) 가 웹 브라우저에 띄움
}