본문 바로가기

개발지/Today I learn

[1212] 자바 스프링 - Spring MVC

#Spring MVC

- Srping MVC란?

  • Spring-webmvc 모듈. 
  • Spring-webmvc 모듈은 서블릿(Servlet) API를 기반으로 클라이언트의 요청을 처리하는 모듈이다.
  • Spring Web MVC를 줄여 Spring MVC, 혹은 웹 프레임워크의 종류임을 나타내는 Spring MVC 프레임워크라고 부름. 
더보기

- 서블릿 (Servlet Container)

: 클라이언트의 요청을 처리하기 위해 규약에 맞춰 JAVA 코드로 작성한 클래스 파일.

이를 웹 애플리케이션으로 실행 하는 서블릿 컨테이너(Servlet Container)로 아파치 톰캣(Apache Tomcat)이 있음.

 

- Model

  • Spring MVC에서 M에 해당됨.
  • Model은 웹 애플리케이션이 클라이언트의 요청을 처리한 결과 데이터.
  • Spring MVC 기반에 웹 애플리케이션이 클라이언트의 요청 사항을 처리한 작업의 처리 결과 데이터.
  • 클라이언트의 요청 사항을 구체적으로 처리하는 영역을 서비스 계층이라 하며,
    요청사항을 처리하기 위한 JAVA 코드를 비즈니스 로직이라고 한다.

 

- View

  • Spring MVC에서 V에 해당됨.
  • View는 Model 데이터를 이용해 웹브라우저와 같은 클라이언트 애플리케이션의 화면에 보이는 리소스를 제공.
  • Spring MVC에는 다양한 View 기술이 포함되어 있음. 그 기술들을 다음과 같다.

1) HTML 페이지 출력

: 클라이언트 애플리케이션 보이는 HTML 페이지를 직접 렌더링 하여 클라이언트 축에 전송하는 방식

  HTML 태그로 구성된 페이지에 Model 데이터를 채워넣어, 최종적인 HTML 페이지를 만들어 클라이언트 측에 전송해줌.

  Spring MVC에서 지원하는 HTML 페이지 출력 기술에는 Thymeleaf, FreeMarker, JSP + JSTL, Tiles 등이 있음.

 

2) PDF, Excel 등 문서 형태로 출력

: Model 데이터를 가공해 PDF, Excel 문서로 만들어 클라이언트 축에 전송하는 방식

  문서 내에 데이터의 동적 변경이 필요한 경우 사용한다.

 

3) XML, JSON 등 특정 형태의 포맷으로의 변환

: Model 데이터를 특정 프로토콜 형태로 변환하여 변환된 데이터를 클라이언트에 전송하는 방식

  특정 형식의 데이터만 전송하여, 프론트 엔드 측에서 받은 데이터를 기반으로 HTML 페이지를 만듦.

  이 방식은 프론트엔드와 백엔드의 영역이 구분되어 개발 및 유지보수가 상대적으로 용이하며,

  프론트엔드의 비동기 클라이언트 애플리케잇녀을 만드는 것이 가능해진다.

public class Player {
    private String Name;
    priavte String position;
    private int uniformNumber;
    
    public Player(String Name, String position, int uniformNumber) {
        this.Name = Name;
        this.position = position;
        this.uniformNumber = uniformNumber;
    }
    
    public class jsonExample {
        public static void main(String[] args) {
            Player player1 = new Player("홀란드", "FW", 9);
            Gson gson = new Gson();
            String jsonString = gson.toJson(player1);
            
            System.out.println(jsonString);
        }
    }
}

// {"Name":"홀란드","position":"FW","uniformNumber":9}
더보기

- JSON(JavaScript Object Notation)

: Spring MVC에서 클라이언트와 서버 애플리케이션이 주고받는 데이터 형식.

  기본 포맷은 {"속성":"값"}의 형태.

  Java의 객체를 JSON 포맷으로 변환 가능하다.

 

- Controller

  • Spring MVC에서 C에 해당됨.
  • Controller는 클라이언트 측의 요청을 직접적으로 전달받는 엔드포인트. Model과 View의 중간에서 상호 작용.
  • 클라이언트 측의 요청을 전달받아 나온 Model데이터를 View로 전달해준다.
@RestController
@RequestMapping(path = "/v1/manchestercity")
public class PlayerController {                 
    private final PlayerService playerService;

    PlayerController(PlayerService playerService) {
        this.playerService = playerService;
    }

    @GetMapping("/{player-id}")  // (1)
    public Manchestercity getPlayer(@PathVariable("player-id") long playerId) {
        return playerService.findPlayer(playerId); // (2)
    }
}

위 코드의 흐름을 살펴보면 

(1) @Getmappling 애노테이션으로 클라이언트의 요청을 수신한다.

(2) playerService 클래스의 findPlayer() 메서드를 호출하여 비즈니스 로직을 처리한다.

(3) 이후 받은 데이터는 Model 데이터이며, Spring View가 전달 받아 JSON 포맷으로 변경하여 클라이언트 측에 전달함.

 

- Spring MVC의 처리 흐름

  1. 클라이언트의 요청 데이터 전송
  2. Controller가 요청 데이터 수신 & 처리
  3. Model 데이터 생성하여 Controller → View 순으로 데이터 전달.
  4. View가 응답 데이터 생성.

 

- Spring MVC의 동작 방식과 구성 요소.

Spring MVC의 동작 방식

  1. 클라이언트의 요청이 DispatcherServlet에게 전송된다.
  2. DispatcherServlet이 클라이언트의 요청을 처리할 Controller의 검색을 HandlerMapping 인터페이스에게 요청한다.
  3. Handlermapping은 클라이언트 요청과 매핑되는 핸들러 객체를 다시 DispatcherServlet에게 리턴한다.
  4. DispatcherServlet는 HandleerAdapter에게 클라이언트 요청을 처리할 Handler메서드 호출을 요청한다.
  5. HandlerAdapter는 전달받은 Controller정보를 기반으로 해당 Controller의 Handler메서드를 호출한다.
  6. Controller의 Handler 메서드는 비즈니스 로직 처리 후 리턴 받은 Model 데이터를 HandlerAdapter에게 전달한다.
  7. HandlerAdapter는 전달받은 Model데이터와 View 정보를 다시 DisaptcherServlet에게 전달한다.
  8. DispatcherServlet은 전닯다은 VIew 정보를 다시 ViewResolver에게 전달하여 Viewe 검색을 요청한다.
  9. VierResolever는 View 정보에 해당하는 View를 찾아서 View를 다시 리턴해준다.
  10. DispatcherServlet은 ViewResolver로부터 전달받은 View 객체를 통해 Model 데이터를 넘겨주면서 클라이언트에게 전달할 응답 데이터 생성을 요청한다.
  11. View는 응답 데이터를 생성하여 DispatcherServlet에게 전달한다.
  12. DispatcherServlet은 전달받은 응답 데이터를 클라이언트에게 전달한다.

▶ 위와 같이 DispatcherServlet이 배치되어 클라이언트의 요청을 처리하는 패턴을 Front Controller Pattern이라고 한다.

 

▶ Handler?

  • Spring MVC에서 요청 Handler는 Controller 클래스를 의미한다.
  • Cotrolloer 클래스 안 @GetMapping, @PostMappling 과 같은 애너테이션이 붙어 있는 메서드가 핸들러 메서드이다.
  • Handler의 매핑은 HTTP Request Method(GET, POST 등)과 Mapping URL을 기준으로 클라이언트의 요청과 매핑.

▶ Adapter?

: Spring MVC에서 HandlerAdater는 Spring MVC에서 지원하는 Handler 외에 다름 프레임 워크의 핸들러를 Spring MVC에 통합하기 위해 사용한다.

 

▶ ViewResolver?

: Spring MVC에서 ViewResolver는 DispatcherServlet에서 들어온 요청에 해당하는 View를 찾아 해석한 뒤 적절한 View 객체를 리턴해준다.