Loading...
태그
    dependency-injectionMVCspringframework

SpringFramework와 MVC

최종수정일
2026년 03월 14일
4분걸림
작성자: Techy J
Table of Content (목차)

웹 애플리케이션이 커질수록 코드의 구조를 어떻게 나누느냐는 매우 중요해진다. 구조가 잘 설계되지 않은 애플리케이션은 기능이 늘어날수록 코드가 서로 강하게 얽히게 되고, 작은 수정에도 여러 부분을 함께 수정해야 하는 문제가 발생한다. 이 문제를 해결하기 위해 널리 사용되는 구조가 MVC(Model–View–Controller) 패턴이다. 그리고 Spring Framework는 이 MVC 구조를 쉽게 구현할 수 있도록 다양한 기능을 제공한다. 이 글에서는 MVC 구조의 기본 개념과 함께 Spring이 MVC 구현을 어떻게 지원하는지 정리해본다.

MVC 구조

애플리케이션이 복잡해질 때 적절한 모듈화가 이루어지지 않으면 모듈 간 결합도가 높아진다. 결합도가 높으면 하나의 기능을 수정할 때 여러 모듈의 코드를 함께 수정해야 하므로 개발과 유지보수가 어려워진다. MVC 구조는 애플리케이션을 다음 세 가지 역할로 분리한다.

  • Model : 데이터와 비즈니스 로직 처리
  • View : 사용자에게 보여지는 화면
  • Controller : 사용자 요청을 받아 처리 흐름을 제어

이처럼 역할을 분리하면 각 영역의 책임이 명확해지고, 코드의 재사용성과 유지보수성이 크게 향상된다.

Controller

Controller는 사용자의 요청을 처음으로 처리하는 계층이다. 웹 애플리케이션에서 사용자가 URL을 통해 요청을 보내면 해당 요청은 먼저 Controller로 전달된다. Controller는 요청 URL, parameter, path 정보 등을 확인하여 어떤 기능을 수행해야 하는지 판단하고, 그에 대응하는 메서드를 실행한다. Controller의 주요 역할은 다음과 같다.

  • 클라이언트 요청을 수신
  • 필요한 비즈니스 로직을 Service 계층에 전달
  • 처리 결과를 View에 전달하거나 API 응답으로 반환

즉, Controller는 애플리케이션의 전체 요청 흐름을 조정하는 역할을 한다.

View

View는 사용자에게 보여지는 화면을 담당하는 영역이다. Spring MVC에서는 보통 Thymeleaf 같은 템플릿 엔진을 사용하여 HTML을 생성한다. Controller가 처리한 결과 데이터를 View에 전달하면 템플릿 엔진이 해당 데이터를 이용해 동적인 HTML 페이지를 생성한다. 최근에는 프론트엔드와 백엔드를 분리하는 구조도 많이 사용된다. 예를 들어 React나 Next.js 같은 프론트엔드 프레임워크를 사용하면 화면 렌더링은 프론트엔드가 담당하고, Spring은 API 서버 역할을 수행한다. 이 경우 프론트엔드는 fetch나 axios 같은 HTTP 라이브러리를 이용해 Spring Controller에 API 요청을 보내고, 서버는 JSON 형식으로 데이터를 응답한다.

Model

Model은 데이터 처리와 비즈니스 로직을 담당하는 영역이다. Spring 애플리케이션에서는 Model 영역을 보통 다음과 같은 계층으로 나누어 구현한다.

  • Service : 비즈니스 로직을 수행하는 계층
  • Repository : 데이터베이스에 접근하는 계층

예를 들어 회원 가입 기능이 있다면

  • Controller는 요청을 받고
  • Service는 회원 가입 로직을 수행하며
  • Repository는 실제로 데이터베이스에 회원 정보를 저장한다.

이처럼 역할을 분리하면 각 계층의 책임이 명확해지고 테스트와 유지보수가 쉬워진다.

Spring MVC 구조

Spring은 MVC 패턴을 구현하기 위해 Spring MVC라는 웹 프레임워크를 제공한다. Spring MVC의 핵심 구조는 Front Controller 패턴을 기반으로 동작하고 DispatcherServlet이라는 서블릿이 모든 요청을 가장 먼저 받는다. 요청 처리 흐름은 다음과 같다.

  1. 클라이언트가 HTTP 요청을 보낸다.
  2. DispatcherServlet이 요청을 먼저 받는다.
  3. DispatcherServlet이 요청 URL에 맞는 Controller를 찾는다.
  4. Controller가 비즈니스 로직을 처리하기 위해 Service를 호출한다.
  5. Service는 필요하면 Repository를 통해 데이터를 조회하거나 저장한다.
  6. 처리 결과를 Controller로 반환한다.
  7. Controller는 결과 데이터를 View에 전달하거나 JSON 형태로 응답한다.

이 구조 덕분에 모든 요청 처리가 하나의 진입점에서 관리되며, 확장성과 유지보수성이 좋아진다.

데이터 바인딩과 요청 처리 단순화

기존 서블릿 기반 웹 애플리케이션에서는 요청 데이터를 직접 파싱해야 했다. 예를 들어 HttpServletRequest 객체에서 parameter를 하나씩 꺼내 처리해야 했다. 하지만 Spring MVC에서는 데이터 바인딩 기능을 제공한다. Controller 메서드의 파라미터에 객체를 선언하면 Spring이 클라이언트가 전달한 parameter나 JSON 데이터를 자동으로 해당 객체에 매핑해 준다. 예를 들어 다음과 같은 Controller 메서드가 있을 때

@PostMapping("/users")
public String createUser(UserRequest request) {
    userService.createUser(request);
    return "result";
}

클라이언트가 보낸 JSON 데이터는 자동으로 UserRequest 객체로 변환되며, 이 기능 덕분에 요청 처리 코드가 훨씬 간결해진다.

Annotation 기반 프로그래밍과 POJO

Spring MVC는 Annotation 기반 프로그래밍 모델을 제공한다. 개발자는 다음과 같은 annotation을 사용하여 웹 요청을 간단하게 매핑할 수 있다.

  • @Controller
  • @RestController
  • @GetMapping
  • @PostMapping

이 방식은 기존 서블릿 방식보다 훨씬 직관적이며 코드의 가독성을 높여준다. 또한 Spring에서는 Service와 Repository를 POJO(Plain Old Java Object) 형태로 작성할 수 있다. POJO는 특정 프레임워크에 강하게 의존하지 않는 순수 자바 객체이기 때문에 테스트 작성이 쉽고 코드 재사용성이 높다.

DI를 통한 의존성 관리

Spring의 핵심 기능 중 하나는 DI(Dependency Injection)이다. DI는 객체가 직접 의존 객체를 생성하는 대신, 외부에서 객체를 주입받는 방식이다. 예를 들어 Controller가 Service를 필요로 할 때 직접 객체를 생성하지 않고 Spring이 자동으로 주입한다.

@RequiredArgsConstructor
@RestController
public class UserController {
    private final UserService userService;
}

여기서 중요한 것은, Controller 는 UserService 객체를 new UserServie() 등으로 직접생성하지 않고, Spring이 자동으로 객체를 생성하고 주입한다. 이 구조는 객체 간 결합도를 낮추고 코드 변경에 유연하게 대응할 수 있도록 도와준다.

IoC와 Spring 컨테이너

Spring에서는 IoC(Inversion of Control) 개념을 통해 객체의 생성과 생명주기를 관리한다. 애플리케이션이 시작되면 Spring은 IoC 컨테이너를 생성하고 다음과 같은 annotation이 붙은 클래스들을 자동으로 탐색한다.

  • @Controller
  • @Service
  • @Repository
  • @Component

이 클래스들은 Spring Bean으로 생성되어 컨테이너에 등록된다. 이후 애플리케이션에서 객체가 필요하면 Spring 컨테이너가 해당 Bean을 제공한다. 즉, 객체의 생성과 관리 책임이 개발자가 아니라 프레임워크에 의해 제어되는 구조가 된다. 이것이 제어의 역전(IoC)이다.

Spring Boot

Spring Framework는 강력한 기능을 제공하지만 설정이 많고 초기 구성이 복잡할 수 있다. Spring Boot는 이러한 문제를 해결하기 위해 만들어진 도구로, 자동 설정(Auto Configuration)과 내장 웹 서버를 제공하므로 개발자는 복잡한 설정 대신 비즈니스 로직 구현에 더 집중할 수 있다.

MVC 패턴은 웹 애플리케이션 구조를 명확하게 분리하여 유지보수성과 확장성을 높여주는 중요한 설계 방식이다. Spring Framework는 DispatcherServlet 기반의 요청 처리 구조, DI, IoC, 그리고 Annotation 기반 프로그래밍을 통해 MVC 구조를 쉽게 구현할 수 있도록 지원한다. 때문에 많은 Java 기반 웹 애플리케이션에서 표준적인 프레임워크로 사용되고 있다.

(끝)

이 글은 ' 출처: 변호사 전정숙 '과 ' 원본링크: https://www.korean-lawer.com/articles/spring-framework/spring-mvc-architecture'를 명시하는 조건으로 인용가능 합니다.
무단 복제, AI 학습 목적으로의 사용과 Google, Naver의 Indexing 외 크롤링 금지합니다
About
전정숙 변호사
법무법인 정맥 파트너 변호사부산파산법원 파산관재인전) 부산변호사회 부회장전) 전국여성변호사회 부회장전) 부산 가정법원 조정위원
Contact

(82) 051-916-8582 , 051-916-8583

부산광역시 연제구 법원로 12 (거제동)

로윈타워빌딩 2층 법무법인정맥

변호사 전정숙

© 2005-2026 전정숙 변호사.

All Rights Reserved.