스프링 MVC 아키텍처MVC 아키텍처 정리스프링 DispatcherServlet스프링 컨트롤러스프링 모델

[Spring] MVC 아키텍처 정리 및 주요 구성 요소 설명

KUKJIN LEE
KUKJIN LEE
2024년 10월 29일
150

Spring MVC는 전통적인 MVC(Model-View-Controller) 디자인 패턴을 따르는 웹 애플리케이션 프레임워크로, 사용자 인터페이스와 데이터 간의 분리를 통해 코드 유지보수와 확장성을 높이는 데 도움을 줍니다.

 

요약

  • DispatcherServlet: 모든 요청을 가로채고 처리할 컨트롤러에 전달

  • Controller: 비즈니스 로직을 수행하고 데이터를 Model에 담아 뷰에 전달

  • Model: 컨트롤러와 뷰 간의 데이터 전달

  • ViewView Resolver: 뷰 템플릿을 결정하고 데이터 렌더링

 

주요 구성 요소

DispatcherServlet

  • 역할: Spring MVC 애플리케이션의 프론트 컨트롤러로, 모든 요청을 받아 해당 요청을 처리할 컨트롤러에 전달합니다.

  • 설정 예시: Spring Boot에서는 자동으로 설정되지만, XML 기반 설정도 가능합니다.

<!-- web.xml -->
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

 

Controller

  • 역할: 비즈니스 로직을 처리하고 필요한 데이터를 모델에 담아 뷰(View)에 전달합니다.

  • 예시 코드:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/greeting")
public class GreetingController {

    @GetMapping
    public String greetUser(Model model) {
        model.addAttribute("message", "Hello, Spring MVC!");
        return "greeting"; // View 이름 반환
    }
}

 

Model

  • 역할: 컨트롤러와 뷰 사이에서 데이터를 전달하는 역할을 합니다.

  • 사용 예시: Model 객체에 데이터를 추가하여 뷰에서 참조할 수 있습니다.

// Model에 데이터를 추가하는 예시
model.addAttribute("message", "Hello, Spring MVC!");

 

ViewView Resolver

  • 역할: 뷰는 데이터를 렌더링하여 사용자에게 보여주고, View Resolver는 Spring MVC가 HTML 또는 JSP 파일을 렌더링할 때 참조할 뷰를 결정합니다.

  • Thymeleaf 템플릿 엔진 사용 시

spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
  • JSP 뷰 리졸버 사용 시 (Java Config)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
public class WebConfig {
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

 

HandlerMapping

  • 역할: 요청 URL에 따라 실행할 컨트롤러와 메서드를 결정합니다.

  • 작동 방식: @RequestMapping 어노테이션에 정의된 URL과 매칭하여 해당 메서드를 호출합니다.

  • 예시 코드

@Controller
@RequestMapping("/user")
public class UserController {

    @GetMapping("/profile")
    public String userProfile(Model model) {
        model.addAttribute("username", "John Doe");
        return "profile";
    }

    @PostMapping("/register")
    public String registerUser(User user) {
        // 사용자 등록 로직 처리
        return "registrationSuccess";
    }
}

 

Spring MVC의 작동 흐름

  1. 요청 처리: 클라이언트가 URL에 HTTP 요청을 보내면 DispatcherServlet이 이를 가로챕니다.

  2. HandlerMapping: DispatcherServletHandlerMapping을 사용해 요청을 처리할 컨트롤러를 찾습니다.

  3. Controller 처리: 요청을 컨트롤러로 전달하여 비즈니스 로직을 수행하고 데이터를 Model에 저장합니다.

  4. View Resolver: 컨트롤러가 반환한 뷰 이름을 바탕으로 ViewResolver가 실제 뷰 객체를 찾습니다.

  5. 응답: DispatcherServlet은 모델 데이터를 뷰에 전달하고, 뷰는 최종 HTML을 렌더링하여 클라이언트에게 응답합니다.

관련 글

[SQL 입문] 필요한 데이터만 콕 집어 가져올 수 있는 WHERE 절

사용자는 테이블에 있는 모든 데이터를 다 보고 싶어 하지는 않습니다. 오히려 특정 항목에 대한 데이터만 가져오고 싶을 때가 훨씬 많습니다. 예를 들어, 어떤 사용자의 이메일이나 ID는 알고 있는데, 그 사람이 언제 우리 앱에 가입했는지 확인하고 싶다고 가정해 봅시다...

2026년 1월 27일10

SQL에서 SELECT란 무엇인가?

데이터베이스를 거대한 서류 보관함이라고 생각하면 됩니다. 보관함 안에는 수많은 데이터가 차곡차곡 쌓입니다. SELECT는 이 보관함에서 "내가 원하는 정보를 찾아줘!"라고 요청하는 명령어입니다. 이 과정을 전문 용어로 '쿼리(Query)'라고 부릅니다. &amp;nbs...

2026년 1월 26일10

[SQL 기초] "언제 하나씩 다 넣어?" 데이터 한 번에 넣기

개발을 하다 보면 데이터베이스(DB)에 샘플 데이터를 대량으로 넣어야 할 때가 있습니다. 메뉴 100개를 추가해야 하는데 INSERT 문을 100번 쓰고 있다면? 너무 비효율적이죠! 오늘은 SQL에서 여러 데이터를 한 번에 넣는 '다중 삽입(Multiple Inse...

2026년 1월 21일13

SQL 데이터 삽입하기

데이터가 없는 데이터베이스는 연료 없는 로켓과 같습니다. 이제 'Missions' 테이블에 새로운 행(row)을 추가하는 방법을 알아보겠습니다. "삽입(Inserting)"은 '데이터 추가'를 의미합니다. 기존 Missions 테이블 ...

2026년 1월 20일12