[Spring] 2. 웹 개발 기초
⌜스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술⌟(김영한, 인프런)
(강의 자료를 요약 및 발췌하였고, 김영한 강사님께 양해를 구한 후 작성했습니다.)
웹 개발 방식
정적 콘텐츠
- 서버에서 동작 없이 파일을 그대로 내려주는 것
- 웰컴 페이지
MVC와 템플릿 엔진
- jsp, php 에서 html 을 동적으로 내려주는 것
- model, template(view), controller -> MVC
- 서버에서 html 변형해서 내려주는 것
API
- 안드로이드, 아이폰 클라이언트와 JSON 이라는 데이터 포맷으로 소통
- Vue, React 로 데이터만 내려주면 클라이언트가 알아서 그린다.
- 서버끼리 통신할 때와 같이 html 이 아닌 데이터만 필요할 때 적용한다.
정적 콘텐츠
controller
java/hello/hellospring/controller/HelloController.java
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello"; // resources/templates/"hello" 찾아서 렌더링
}
}
resources/static
- 하위에 있는 html 파일 그대로 응답
resources/static/hello-static.html
<!DOCTYPE HTML>
<html>
<head>
<title>Hello</title>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
<a href="/hello">hello</a>
</body>
</html>
동작
1. 검색창에서 http://localhost:8080/hello-static.html
2. 내장 톰캣 서버가 요청을 받아 스프링에 넘긴다.
3. controller 에서 hello-static 과 맵핑되는 것 있는지 확인
4. 없으면, resouces/static 에서 확인하여 그대로 반환
MVC 와 템플릿 엔진
MVC
- Model: 애플리케이션의 정보(데이터)를 나타내며
- View: 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소
- Controller: 데이터와 비즈니스 로직 사이의 상호동작을 관리
- 참고) wiki - 모델-뷰-컨트롤러
Controller
java/hello/hellospring/controller/HelloController.java
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello"; // resources/templates/"hello" 찾아서 렌더링
}
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam(value = "name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
// 단축키: 커맨드 + P -> 파라미터 정보 볼 수 있다.
// required true 이면 기본으로 값을 넘겨야 한다.
// http://localhost:8080/hello-mvc?name=spring!!!!!! -> hello spring!!!!!! 출력
}
html
resources/templates/hello-template.html
<html xmlns:th="http://www.thymeleaf.org">
<body>
<!-- $ 는 Model 에서 값을 꺼낸다. -->
<p th:text="'hello ' + ${name}">hello! empty</p>
<!-- absolute path 로 검색창에 복사해서 치면 -> html 을 서버 없이 그대로 봐도 결과물을 볼 수 있다. -->
<!-- 서버가 동작하면 값으로 치환된다. -->
</body>
</html>
동작
1. 검색창에서 http://localhost:8080/hello-mvc?name=spring
2. 내장 톰캣 서버가 요청을 받아 스프링에 넘긴다.
3. controller 에서 hello-mvc 와 매핑되는 것을 찾고 "hello-template" 반환
4. viewResolver(view 찾고 템플릿 엔진 연결시켜줌) 에서 templates/hello-template.html (Thymeleaf 템플릿 엔진 처리)
5. 렌더링 된 html 을 클라이언트에 전달한다.
API
Controller
java/hello/hellospring/controller/HelloController.java
@Controller
public class HelloController {
@GetMapping("hello-api")
@ResponseBody // 객체 반환하고 응답으로 지정하면 기본이 JSON 형식으로 반환 지정, xml 로 바꾸는 것도 가능하지만 비추
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello;
// JSON 으로 반환 {"name":"spring!!!"}
}
static class Hello {
private String name;
// 자바 bean 규약
// command + N > Getter and Setter 로 자동 생성
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
동작
1. 검색창에서 http://localhost:8080/hello-api
2. 내장 톰캣 서버가 요청을 받아 스프링에 넘긴다.
3. controller 에서 @ResponseBody 확인하여 http 응답에 그대로 넘겨야 한다는 것을 인지한다.
4. HttpMessageCoverter 가 동작한다. (앞의 viewResolver 대신)
5. http response 에 값을 넣어 반환한다.
HttpMessageConverter
- 기본 문자라면, StringCoverter(StringHttpMessageCoverter) 동작한다.
- 기본 객체라면, JsonCoverter(MappingJackson2HttpMessageConverter) 동작한다.
- byte 등 여러 포맷에 대한 처리 HttpMessageConverter 기본 등록되어 있다.
참고
- 객체 to JSON 라이브러리 종류
- Jackson: Spring default
- GSON
- 클라이언트 http 요청할 때 Accept 헤더에서 받고 싶은 포맷(xml, json 등) 지정하는 경우, 해당 포맷 converter 가 동작한다.
소스 코드
Author And Source
이 문제에 관하여([Spring] 2. 웹 개발 기초), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@developer-shkim/작성중-Spring-4.-웹-개발-기초
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Author And Source
이 문제에 관하여([Spring] 2. 웹 개발 기초), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@developer-shkim/작성중-Spring-4.-웹-개발-기초저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)