Spring MVC

2024. 5. 18. 19:27Back-End/Spring

Spring MVC란?

Spring MVC(Model-View-Controller)는 Spring Framework의 모듈 중 하나로, 웹 애플리케이션을 쉽게 개발할 수 있도록 도와주는 웹 프레임워크이다. Spring MVC는 전통적인 웹 개발의 복잡성을 줄이고, 유연하고 확장 가능한 구조를 제공하여 효율적인 웹 애플리케이션 개발을 가능하게 한다.

Spring MVC 프레임워크에서 요청처리

Spring MVC의 주요 구성 요소

Spring MVC는 여러 구성 요소를 포함하며, 이들이 협력하여 웹 애플리케이션의 요청 처리와 응답 생성을 담당한다. 주요 구성 요소는 다음과 같다.

 

1. DispatcherServlet

Spring MVC의 진입점으로, 모든 HTTP 요청을 처리하는 프론트 컨트롤러 역할을 한다. DispatcherServlet은 요청을 적절한 컨트롤러에 라우팅하고, 컨트롤러에서 반환된 모델과 뷰를 결합하여 최종 응답을 생성한다.

 

2. Controller

컨트롤러는 사용자의 요청을 처리하고, 적절한 서비스 계층을 호출하여 비즈니스 로직을 수행한 후, 결과를 모델에 담아 뷰에 전달한다. Spring MVC에서는 @Controller 또는 @RestController 애노테이션을 사용하여 컨트롤러 클래스를 정의한다.

@Controller
public class UserController {
    
    @GetMapping("/users")
    public String getUsers(Model model) {
        // 비즈니스 로직 호출
        List<User> users = userService.findAllUsers();
        model.addAttribute("users", users);
        return "userList";
    }
}

 

3. Model

모델은 애플리케이션의 데이터 및 상태를 나타낸다. 컨트롤러는 모델 객체에 데이터를 담아 뷰로 전달한다. Spring MVC에서는 Model 인터페이스를 사용하여 모델에 데이터를 추가할 수 있다.

model.addAttribute("users", users);

 

4. View

뷰는 사용자에게 데이터를 표시하는 역할을 한다. Spring MVC에서는 JSP, Thymeleaf, FreeMarker 등 다양한 뷰 기술을 지원한다. 컨트롤러에서 반환된 뷰 이름을 기반으로 실제 뷰를 렌더링한다.

<!-- userList.jsp -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
    <h2>User List</h2>
    <ul>
        <c:forEach var="user" items="${users}">
            <li>${user.name}</li>
        </c:forEach>
    </ul>
</body>
</html>

 

5. Service

서비스 계층은 비즈니스 로직을 담당한다. 컨트롤러는 서비스 계층을 호출하여 필요한 작업을 수행한다. 서비스 클래스는 일반적으로 @Service 애노테이션을 사용하여 정의한다.

@Service
public class UserService {
    
    public List<User> findAllUsers() {
        // 비즈니스 로직
        return userRepository.findAll();
    }
}

 

6. Repository

리포지토리 계층은 데이터 접근 로직을 담당한다. Spring Data JPA와 같은 ORM 프레임워크를 사용하여 데이터베이스와 상호 작용할 수 있다. 리포지토리 클래스는 @Repository 애노테이션을 사용하여 정의한다.

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

 

Spring MVC의 동작 흐름

  1. 사용자 요청: 사용자가 웹 브라우저에서 특정 URL로 요청을 보낸다.
  2. DispatcherServlet: DispatcherServlet이 모든 요청을 받아 적절한 핸들러(컨트롤러)로 요청을 전달한다.
  3. Handler Mapping: DispatcherServlet은 HandlerMapping을 사용하여 어떤 컨트롤러가 요청을 처리할지 결정한다.
  4. Controller: 컨트롤러가 요청을 처리하고, 서비스 계층을 호출하여 비즈니스 로직을 수행한다.
  5. Model: 컨트롤러는 처리 결과를 모델에 담아 뷰로 전달한다.
  6. View Resolver: DispatcherServlet은 ViewResolver를 사용하여 뷰 이름에 해당하는 실제 뷰를 찾는다.
  7. View: 최종 뷰가 렌더링되고, 사용자에게 HTML 응답이 반환된다.

Spring MVC의 장점

  1. 유연한 구조: 다양한 뷰 기술과의 통합이 가능하며, 유연한 구조를 제공한다.
  2. 모듈화: 비즈니스 로직, 데이터 접근, 프레젠테이션 로직을 분리하여 모듈화된 코드를 작성할 수 있다.
  3. 확장성: 다양한 기능을 플러그인 형태로 추가할 수 있어 확장성이 뛰어나다.
  4. 테스트 용이성: 각 계층이 분리되어 있어 단위 테스트와 통합 테스트가 용이하다.

예제 코드

다음은 Spring MVC를 사용한 간단한 예제이다.

 

UserController.java

package org.example.controller;

import org.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/users")
    public String getUsers(Model model) {
        model.addAttribute("users", userService.findAllUsers());
        return "userList";
    }
}

 

UserService.java

package org.example.service;

import org.example.repository.UserRepository;
import org.example.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public List<User> findAllUsers() {
        return userRepository.findAll();
    }
}

 

UserRepository.java

package org.example.repository;

import org.example.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

 

userList.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
    <h2>User List</h2>
    <ul>
        <c:forEach var="user" items="${users}">
            <li>${user.name}</li>
        </c:forEach>
    </ul>
</body>
</html>

 

Spring MVC 이처럼 유연하고 확장 가능한 애플리케이션을 쉽게 개발할 있도록 도와준다. 다양한 기능과 모듈화를 통해 유지보수성이 뛰어난 코드를 작성할 있다.

'Back-End > Spring' 카테고리의 다른 글

@Valid(스프링 MVC에서의 입력 유효성 검증)  (0) 2024.05.22
Thymeleaf  (0) 2024.05.21
AOP (Aspect-Oriented Programming)  (0) 2024.05.18
ResultSetExtractor  (0) 2024.05.17
@Transactional과 TransactionTemplate  (0) 2024.05.17