Back-end/Spring

[Spring] Spring Boot Controller & Service & Repository 구조 이해하기 (MVC 패턴)

랑 이 2025. 8. 27. 16:15
반응형

Spring Boot로 API 서버를 개발할 때 주로 MVC 패턴(Model-View-Controller)을 기반으로 Controller,Service,Repository 계층을 나누어 개발하게 됩니다 MVC 패턴을 사용했을때의 장점과 어떤 방식으로 사용되는지에 대해 정리해보려고 합니다

 

먼저 Spring Boot의 동작 방식에 대해서 알아보려고 합니다

Spring Boot 동작 방식

스프링 부트는 spring-boot-starter-web 모듈을 사용하면 기본적인 톰캣(Tomcat)을 사용하는 Spring MVC 구조를 기반으로 동작하게 됩니다 

 

spring-boot-starter-web

Spring MVC + 내장 톰캣(Tomcat)을 기본으로 제공하는 모듈
REST API,웹 애플리케이션 개발을 위한 필수 구성 요소를 포함하고 있습니다 

Spring Boot 프로젝트를 생성할 때 Spring Web 라이브러리를 추가하면 자동으로 모듈이 설치됩니다

Spring MVC 패턴이란?

Model,View,Controller 세 가지 역할을 분리하여 유지보수성과 확장성을 높이는 아키텍처 패턴

 

Model

- 데이터와 비즈니스 로직을 담는 영역

- Entity,DTO,Service,Repositroy

 

View

- 사용자에게 보이는 화면 (UI)

- Spring에서 Thymeleaf,JSP 같은 템플릿 엔진을 통해 HTML 랜더링

- REST API 방식에서는 JSON 응답이 View 역할을 함

 

Controller

- 사용자의 요청을 받아 처리하고, 응답을 돌려주는 역할

- Model과 View를 연결하는 중간 다리 역할은 합니다

- Spring에서 @Controller,@RestController로 MVC 템플릿,REST API 방식으로 정의

 

Spring Boot MVC 패턴 디렉터리 구조

src
 └─ main
     └─ java
         └─ com.example.demo
             ├─ controller      # 요청/응답 처리 (API 엔드포인트)
             │    └─ UserController.java
             │
             ├─ service         # 비즈니스 로직
             │    └─ UserService.java
             │
             ├─ repository      # 데이터 접근 (DB 연동)
             │    └─ UserRepository.java
             │
             ├─ domain          # 엔티티(Entity) 클래스 (DB 테이블과 매핑)
             │    └─ User.java
             │
             ├─ dto             # 요청/응답 DTO 클래스
             │    └─ UserDto.java
             │
             └─ DemoApplication.java  # 메인 실행 클래스

 

Spring MVC 템플릿 엔진 동작과정

Spring Boot 애플리케이션 시작 

1. SpringApplication.run() → ApplicationContext 생성 (Bean 등록/DI)

2. DispatcherServlet 자동 등록 (Front Controller 역할)

3. HandlerMapping, HandlerAdapter, ViewResolver, HttpMessageConverter 등 웹 인프라 빈 자동 구성

4. 내장 Tomcat이 포트 리스닝 시작 (기본 포트는 8080)

 

요청이 들어왔을 때

1. tomcat이 HTTP 요청을 스레드에 배정 → DispatcherServlet으로 전달

2. DispatcherServlet 내부 로직

    - HandlerMapping으로 매핑 찾기 (@RequestMapping/@GetMapping 등 분석하여 핸들러 메서드 결정

    - HandlerAdapter로 컨트롤러 메서드 호출

    - 컨트롤러 반환값의 형태에 따라 다르게 반환 (@RestController,@Controller)

       - @Controller: ViewResolver로 템플릿 렌더링

       - @RestController: HttpMessageConverter로 JSON/String 변환

MVC 템플릿 / REST 응답의 차이

1. MVC 템플릿

MVC(Model-View-Controller) 패턴에서 View 역할을 수행하는 기술

 

서버에서 HTML 파일을 템플릿 엔진(Thymeleaf, JSP 등)으로 랜더링 하고 그 결과를 클라이언트(브라우저)에 응답하는 방식으로 서버 사이드 렌더링(SSR) 방식에 속합니다

 

컨트롤러에서 뷰 이름 또는 ModelAndView 반환하는 형태를 가집니다

@Controller
@RequestMapping("/hello-mvc")
class HelloMvcController {
    @GetMapping
    String view(Model model) {
        model.addAttribute("name", "hello");
        return "hello"; // ← 뷰 이름
    }
}

- ViewResolver가 "hello"라는 뷰 이름을 템플릿 파일로 해석

Thymeleaf 라이브러리를 사용할때 ThymeleafViewResolver가 src/main/resources/templates/hello.html을 찾아 랜더링
랜더링 된 HTML을 응답 바디로 전송

2. REST API

Controller가 Body를 직접 반환하는 방식

서버는 데이터(JSON)만 주고 브라우저는 프론트엔드 프레임워크 React,Vue,Angular 등을 사용하여 HTML을 만들어서 렌더링

 

과거에는 전자정부프레임워크와 같이 SSR 기반 아키텍처를 많이 사용했지만 요즘은 Spring Boot를 백엔드 API 서버로 두고 React/Vue 같은 SPA 프레임워크를 사용하여 CSR를 구현하는 추세인 것 같아요

@RestController
@RequestMapping("/hello-api")
class HelloApiController {
    record Hello(String message) {}
    @GetMapping
    Hello hello() { return new Hello("Hello, Spring!"); }
}

이 방식은 ViewResolver가 동작하지 않고, HttpMessageConverter가 작동하게 됩니다

객체는 JSON으로 변환,문자열은 text로 변환하여 바디가 그대로 응답하는 형태를 가지고 있습니다

 

반응형