안녕하세요! 르탄즈 2기의 팀 300의 김민우입니다.
1차 미션이 끝난 후에 우수활동자로 선정되어 Spring 심화반 강의를 듣게 되었습니다.
제 원하는 직종이 백엔드 개발자라서,
Spring에 대해 자세히 알고 복습 차원에서 강의를 신청하게 되었습니다.
강의에서 JPA와 JWT 구현, 전반적인 MVC에 대해 알려주는 커리큘럼을 가지고 있어,
백엔드 개발을 희망하는 분들에게는 꼭 필요한 개념을 가진 강의입니다.
1주차 강의에서 중요 개념인 MVC 패턴에 대해 정리해보았습니다.
스프링 MVC 이해
- 스프링 MVC?
- MVC (Model - View - Controller) 디자인 패턴
- Server 에서 HTML 을 내려 주는 경우
- 정적 (static) 웹 페이지
- 동적 (dynamic) 웹 페이지
1. 정적 웹 페이지
- Controller
- 1. Client 의 요청을 Model 로 받아 처리
- 2. Client 에게 View (정적 웹 페이지, HTML) 를 내려줌
2. 동적 웹 페이지
- Controller
- Client 의 요청을 Model 로 받아 처리
- Template engine 에게 View, Model 전달
- View: 동적 HTML 파일
- Model: View 에 적용할 정보들
- Template engine
- View 에 Model 을 적용 → 동적 웹페이지 생성
- 예) 로그인 성공 시, "로그인된 사용자의 id" 를 페이지에 추가
- Template engine 종류: 타임리프 (Thymeleaf), Groovy, FreeMarker, Jade 등
- View 에 Model 을 적용 → 동적 웹페이지 생성
- Client 에게 View (동적 웹 페이지, HTML)를 내려줌
Controller 와 HTTP Response 메시지
@ResponseBody 유무에 따라, 컨트롤러에서 Return 값이 달라지게 된다.
@ResponseBody가 없는 경우 -> Return 타입이 String이면, view 이름이 전달된다.
@ResponseBody가 있는 경우 -> Return 타입이 String이면 text로 전달, java 객체인 경우 json으로 전달
예시)
@GetMapping("/html/templates")
public String htmlTemplates() {
return "hello";
}
view인 resources/static/hello.html을 반환한다.
(1) 정적 웹페이지
static 폴더
http://localhost:8080/hello.html
resources/static/hello.html
@GetMapping("/html/templates")
public String htmlTemplates() {
return "hello";
}
Redirect
http://localhost:8080/hello/response/html/redirect
@Controller
@RequestMapping("/hello/response")
public class HelloResponseController {
@GetMapping("/html/redirect")
public String htmlFile() {
return "redirect:/hello.html";
}
}
Redirect 주소는 Response Headers의 Location 부분에 나타나게 된다.
@ResponseBody : View 를 사용하지 않고, HTTP Body 에 들어갈 String 을 직접 입력
@GetMapping("/body/html")
@ResponseBody
public String helloStringHTML() {
return "hello";
}
-> hello를 반환
[동적 웹페이지]
@GetMapping("/html/dynamic")
public String helloHtmlFile(Model model) {
visitCount++;
model.addAttribute("visits", visitCount);
return "hello-visit";
}
View, Model 정보 → 타임리프에게 전달
- 타임리프 처리방식
- View 정보
- "hello-visit" → resources**/templates/hello-visit.html**
- <div> (방문자 수: <span th:text="${visits}"></span>) </div>
- Model 정보
- visits: 방문 횟수 (visitCount)
- 예) 방문 횟수: 1,000,000 번
- div> (방문자 수: <span>1000000</span>) </div>
- View 정보
[JSON 데이터]
반환값: String
@GetMapping("/json/string")
@ResponseBody
public String helloStringJson() {
return "{\"name\":\"BTS\",\"age\":28}";
}
이런식으로 전달하면 json 데이터로 전달되지 않고, html형태로 전달되기 때문에 json 형태가 아님.
반환값: String 외 자바 클래스
@GetMapping("/json/class")
@ResponseBody
public Star helloJson() {
return new Star("BTS", 28);
}
"자바 객체 → JSON 으로 변환" 은 스프링이 해 줌
[Response 트랜드의 변화]
현재는 SPA(싱글 페이지 애플리케이션) 형태로 Response를 전달하고 있다.
SPA는 서버로부터 완전한 새로운 페이지를 불러오지 않고 현재의 페이지를 동적으로 다시 작성함으로써
사용자와 소통하는 웹 애플리케이션이다.
클라이언트가 AJAX(비동기식 자바스크립트와 xml)를 통해 서버에 요청하면, 서버는 JSON 형태 데이터로 Response를 전달한다.
비동기 방식이란?
비동기 방식은 웹페이지를 리로드하지 않고 데이터를 불러오는 방식이며 Ajax를 통해서 서버에 요청을 한 후 멈추어 있는 것이 아니라 그 프로그램은 계속 돌아간다는 의미를 내포하고 있다.
비동기 방식은 반대로 요청을 보냈을 때 응답 상태와 상관없이 다음 동작을 수행 할 수 있다.
동기 방식이란?
동기 방식은 서버에서 요청을 보냈을 때 응답이 돌아와야 다음 동작을 수행할 수 있다.
참고: https://velog.io/@surim014/AJAX%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
@RestController
@Controller + @ResponseBody
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
@RestController
@RequestMapping("/hello/rest")
public class HelloRestController {
@GetMapping("/json/string")
public String helloHtmlString() {
return "<html><body>Hello @ResponseBody</body></html>";
}
@GetMapping("/json/list")
public List<String> helloJson() {
List<String> words = Arrays.asList("Hello", "Controller", "And", "JSON");
return words;
이런식으로 컨트롤러 위에 @RequestMapping("")을 통해서 공통 path를 적용할 수 있다.
@RestController를 통해 각각 컨트롤러 위에 @ResponseBody를 생략 가능하며,
Json 형태의 Response를 반환할 것을 명시한다.
[MVC Request/Response 과정]
- Client → DispatcherServlet
- 가장 앞 단에서 요청을 받아 FrontController 라고도 불림
- DispatcherServlet → Controller
- API 를 처리해 줄 Controller 를 찾아 요청을 전달
- Handler mapping 에는 API path 와 Controller 함수가 매칭되어 있음
- Controller 에서 요청하는 Request 의 정보 ('Model') 전달
- Controller → DispathcerServlet
- Controller 에서 요청하는 Request 의 정보 ('Model') 전달
- 'Model' 정보와 'View' 정보를 DispatcherServlet 으로 전달
- DispatcherServlet → Client
- ViewResolver 통해 View 에 Model 을 적용
- View 를 Client 에게 응답으로 전달
'💻 프로젝트 > 스파르타코딩클럽 르탄즈 2기' 카테고리의 다른 글
[스파르타코딩클럽] IT 전공자의 덕담 공유 코딩 패키지 리얼 후기 (0) | 2022.01.29 |
---|---|
[스파르타코딩클럽] 프론트엔드 지식 1도 없는 학부생의 웹 사이트 만들어보기! (0) | 2022.01.28 |
TIL 1주차 개발일지 - (2) (0) | 2022.01.28 |
TIL - 2주차 개발일지 (0) | 2022.01.28 |
TIL - 1주차 개발일지 (0) | 2022.01.28 |