관리 메뉴

민우의 코딩노트

[르탄즈 2기] Spring 심화반 1주차 개발일지 본문

External/스파르타코딩클럽 르탄즈 2기

[르탄즈 2기] Spring 심화반 1주차 개발일지

미미누 2022. 2. 5. 15:33

안녕하세요! 르탄즈 2기의 팀 300의 김민우입니다.

1차 미션이 끝난 후에 우수활동자로 선정되어 Spring 심화반 강의를 듣게 되었습니다.

 

제 원하는 직종이 백엔드 개발자라서,

Spring에 대해 자세히 알고 복습 차원에서 강의를 신청하게 되었습니다.

 

강의에서 JPA와 JWT 구현, 전반적인 MVC에 대해 알려주는 커리큘럼을 가지고 있어,

백엔드 개발을 희망하는 분들에게는 꼭 필요한 개념을 가진 강의입니다. 

1주차 강의에서 중요 개념인 MVC 패턴에 대해 정리해보았습니다.


스프링 MVC 이해

  • 스프링 MVC?
    • MVC (Model - View - Controller) 디자인 패턴
    • Server 에서 HTML 을 내려 주는 경우
      1. 정적 (static) 웹 페이지
      2. 동적 (dynamic) 웹 페이지 

1.  정적 웹 페이지

  • Controller
  • 1. Client 의 요청을 Model 로 받아 처리
  • 2. Client 에게 View (정적 웹 페이지, HTML) 를 내려줌

 

2. 동적 웹 페이지

 

  • Controller
    1. Client 의 요청을 Model 로 받아 처리
    2. Template engine 에게 View, Model 전달
      1. View: 동적 HTML 파일
      2. Model: View 에 적용할 정보들
    3. Template engine
      1. ViewModel 을 적용 → 동적 웹페이지 생성
        1. 예) 로그인 성공 시, "로그인된 사용자의 id" 를 페이지에 추가
        2. Template engine 종류: 타임리프 (Thymeleaf), Groovy, FreeMarker, Jade 등
    4. 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>

 

[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

 

AJAX란 무엇인가?

AJAX (Asynchronous Javascript And XML) AJAX란, JavaScript의 라이브러리중 하나이며 Asynchronous Javascript And Xml(비동기식 자바스크립트와 xml)의 약자이다. 브라우저가 가지고있는 XMLHttpRequ

velog.io


@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 과정]

  1. Client → DispatcherServlet
    1. 가장 앞 단에서 요청을 받아 FrontController 라고도 불림
  2. DispatcherServlet → Controller
    • API 를 처리해 줄 Controller 를 찾아 요청을 전달
    • Handler mapping 에는 API path 와 Controller 함수가 매칭되어 있음
    • Controller 에서 요청하는 Request 의 정보 ('Model') 전달
    [Sample] GET /hello/html/dynamic → HomeController 의 helloHtmlFile() 함수

 

  1. Controller → DispathcerServlet
    • Controller 에서 요청하는 Request 의 정보 ('Model') 전달
    • 'Model' 정보와 'View' 정보를 DispatcherServlet 으로 전달

 

  1. DispatcherServlet → Client
    1. ViewResolver 통해 View 에 Model 을 적용
    2. View 를 Client 에게 응답으로 전달