본문 바로가기
코드 스테이츠

Spring MVC 아키텍쳐

by 한휘용 2023. 6. 12.
728x90

Spring MVC 

Spring 모듈 중에는 웹 계층을 담당하는 몇 가지 모듈이 있다.

특히 서블릿(Servlet) API를 기반으로 클라이언트의 요청을 처리하는 모듈이 있는데, 이 모듈 이름이 바로 spring-webmvc이다.

서블릿(Servlet)이란?

서블릿은 클라이언트의 요청을 처리하도록 특정 규약에 맞추어서 Java 코드로 작성하는 클래스 파일이다.
그리고 아파치 톰캣(Apache Tomcat)은 이러한 서블릿들이 웹 애플리케이션으로 실행이 되도록 해주는 서블릿 컨테이너(Servlet Container) 중 하나다.
 Spring MVC 내부에서는 서블릿을 기반으로 웹 애플리케이션이 동작한다는 사실을 기억을 하고 있으면 좋다.

개발자들 사이에서는 Spring Web MVC를 줄여서 Spring MVC라고 부르는데, Spring MVC웹 프레임워크의 한 종류이기 때문에 Spring MVC 프레임워크라고도 부른다.

 

Spring MVC가 구체적으로 무엇인지 잘 모르겠다면, 우선 2가지만 기억하면 된다.

 

  1. Spring MVC는 클라이언트의 요청을 편리하게 처리해 주는 프레임워크이다.
  2. 우리가 만들게 될 샘플 애플리케이션은 Spring MVC가 제공해 주는 기능을 이용해서 만든다.

 

이제 Spring MVC에서 MVC는 무엇을 의미하는지 알아보자

 

Model

Model은 Spring MVC에서 M에 해당된다.

 

모델을 생각하면 가장 떠오르는 것이 무엇인지 생각해보자.

아마 대부분의 사람들은 TV나 패션쇼 무대에서 디자이너가 만든 옷을 입고 워킹을 하는 패션 모델들을 생각했을 것이다.

 

즉, 일상 세계에서 의미하는 패션모델은 디자이너가 만든 작업의 결과물을 관객들에게 보여주기 위한 역할을한다.

 

Spring MVC에서의 Model의 역할도 마찬가지다.

Spring MVC 기반의 웹 애플리케이션의 클라이언트의 요청을 전달받으면 요청 사항을 처리하기 위한 작업을 한다.

 

이렇게 처리한 작업의 결과 데이터를 클라이언트에게 응답으로 돌려줘야 하는데, 이때 클라이언트에게 응답으로 돌려주는 작업의 처리 결과 데이터를 Model이라고 한다.

클라이언트의 요청 사항을 구체적으로 처리하는 영역을 서비스계층(Service Layer)이라고 하며, 실제로 요청 사항을 처리하기 위해 Java 코드로 구현한 것을 비즈니스 로직(Business Logic)이라고 합니다.

 

View

View는 Spring MVC에서 V에 해당된다.

 

View는 앞에서 설명한 Model 데이터를 이용해서 웹브라우저 같은 클라이언트 애플리케이션의 화면에 보이는 리소스(Resource)를 제공하는 역할을 한다.

 

Spring MVC에는 다양한 View 기술이 포함되어 있는데 View의 형태는 아래와 같이 나눌 수 있다.

 

  • HTML 페이지의 출력
    • 클라이언트 애플리케이션에 보이는 HTML 페이지를 직접 렌더링 해서 클라이언트 측에 전송하는 방식이다.
    • 기본적인 HTML 태그로 구성된 페이지에 Model 데이터를 채워 넣은 후, 최종적인 HTML 페이지를 만들어서 클라이언트 측에 전송해준다.
    • Spring MVC에서 지원하는 HTML 페이지 출력 기술에는 Thymeleaf, FreeMarker, JSP + JSTL, Tiles 등이 있다.
  • PDF, Excel 등의 문서 형태로 출력
    • Model 데이터를 가공해서 PDF 문서나 Excel 문서를 만들어서 클라이언트 측에 전송하는 방식이다.
    • 문서 내에서 데이터가 동적으로 변경되어야 하는 경우 사용할 수 있는 방식이다.
  • XML, JSON 등 특정 형식의 포맷으로의 변환
    • Model 데이터를 특정 프로토콜 형태로 변환해서 변환된 데이터를 클라이언트 측에 전송하는 방식이다.
    • 이 방식의 경우 특정 형식의 데이터만 전송하고, 프론트엔드 측에서 이 데이터를 기반으로 HTML 페이지를 만드는 방식이다.
    • 프론트엔드 영역과 백엔드 영역이 명확하게 구분되므로 개발 및 유지보수가 상대적으로 용이하다는게 장점이다.

 

JSON(JavaScript Object Notation)

 

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

 

과거에는 XML 형식의 데이터가 많이 사용되었으나 현재는 XML보다 상대적으로 가볍고, 복잡하지 않은 JSON 형식을 대부분 사용하고 있는 추세다.

 

 

JSON의 기본 포맷

  • {”속성”:”값”} 형태로 구성된다.

 

예를 들어 Coffee 라는 클래스가 있다고 가정한다.

public class Coffee {
    private String korName;
    private String engName;
    private int price;

    public Coffee(String korName, String engName, int price) {
        this.korName = korName;
        this.engName = engName;
        this.price = price;
    }
}

 

위 예시 코드는 Coffee를 클래스로 표현한 코드이다.

고객이 아메리카노 한 잔을 주문하기 위해서 아메리카노의 정보를 요청한다면 서버 애플리케이션 쪽에서 아메리카노 정보를 JSON 형식으로 변환해서 전송해주어야 합니다.

 

이 경우 서버 애플리케이션 쪽에서 클라이언트 쪽으로 전송하는 아메리카노 정보는 JSON으로 어떻게 표현되는지 확인해 보자.

public class JsonExample {
        public static void main(String[] args) {
            Coffee coffee = new Coffee("아메리카노", "Americano", 3000);
            Gson gson = new Gson();
            String jsonString = gson.toJson(coffee);
    
            System.out.println(jsonString);
        }
    }

위 코드는 Gson이라는 라이브를 사용해서 Coffee 클래스의 객체를 JSON 포맷 형태로 출력하는 예시코드입니다.

 

이렇게 Gson을 사용하여 Java의 객체를 JSON 포맷으로 변환 할 수 있다.

public class Coffee {
    private String korName;
    private String engName;
    private int price;

    public Coffee(String korName, String engName, int price) {
        this.korName = korName;
        this.engName = engName;
        this.price = price;
    }
}

 

 

ex) 카페 음료 JSON
{
"korName":"아메리카노",
"engName":"Americano",
"price":3000
}

 

 

Controller

Controller는 Spring MVC에서 C에 해당된다.

 

Controller는 클라이언트 측의 요청을 직접적으로 전달받는 엔드포인트(Endpoint)로써 Model과 View의 중간에서 상호 작용을 해주는 역할을 한다.

 

즉, 클라이언트 측의 요청을 전달받아서 비즈니스 로직을 거친 후에 Model 데이터가 만들어지면, 이 Model 데이터를 View로 전달하는 역할을 한다.

 

@RestController
@RequestMapping(path = "/v1/coffee")
public class CoffeeController {                 
    private final CoffeeService coffeeService;

    CoffeeController(CoffeeService coffeeService) {
        this.coffeeService = coffeeService;
    }

    @GetMapping("/{coffee-id}")  // (1)
    public Coffee getCoffee(@PathVariable("coffee-id") long coffeeId) {
        return coffeeService.findCoffee(coffeeId); // (2)
    }
}

위 코드 예시는 Spring MVC에서 Controller에 해당되는 영역을 코드로 작성한 예시다. 동작의 흐름을 파악해보자

  • (1)의 @GetMapping 애노테이션을 통해 클라이언트 측의 요청을 수신한다.
  • (2)에서 CoffeeService 클래스의 findCoffee() 메서드를 호출해서 비즈니스 로직을 처리한다.

(2)에서 비즈니스 로직을 처리한 다음 리턴 받는 Coffee가 여기서는 Model 데이터가 된다.

 

그리고 getCoffee()에서 이 Model 데이터를 리턴하는데, 리턴되는 이 Model 데이터는 우리가 코드 상에서는 확인할 수 없지만 내부적으로 Spring의 View가 전달받아서 JSON 포맷으로 변경한 후에 클라이언트 측에 전달한다.

 

[Spring MVC의 동작 방식] Model, View, Controller 간의 처리 흐름은 최종적으로 아래와 같다.

 

Client가 요청 데이터 전송

→ Controller가 요청 데이터 수신 → 비즈니스 로직 처리 → Model 데이터 생성
→ Controller에게 Model 데이터 전달 → Controller가 View에게 Model 데이터 전달
→ View가 응답 데이터 생성

 

 

 
 

 

728x90

'코드 스테이츠' 카테고리의 다른 글

JDBC  (0) 2023.06.16
Spring - Controller  (0) 2023.06.13
Section2 회고  (0) 2023.06.08
Spring Boot  (0) 2023.05.31
Spring Framework의 특징  (0) 2023.05.31