Study/spring

[Spring] MVC 패턴 정의 및 Spring Boot MVC 구조 예제

 

MVC 패턴에 대한 설명과 Spring Boot에서 MVC 프로젝트를 생성하는 예제를 소개드리겠습니다.

 

MVC 패턴이란?

MVC 패턴이란 애플리케이션의 구성요소를 모델-뷰-컨트롤러로 나누어 개발하는 방식입니다.

MVC 정의 바로가기

 

  • Model
    • 데이터와 비즈니스 로직을 관리하는 역할입니다.
    • 데이터베이스와 통신하거나 데이터를 가공해 Controller나 View에 전달합니다.
  • View
    • 사용자 인터페이스(UI)를 담당합니다.
    • 사용자에게 데이터를 보여주거나 입력을 받을 수 있는 화면 요소로 구성되어있습니다.
  • Controller
    • Model과 View를 연결하는 중개자 역할입니다.
    • 사용자 요청을 받아 Model에서 데이터를 가져오고 View로 전달합니.

 

 

MVC 패턴의 장단점은?

장점

  • Model, View, Controller가 각각 고유한 역할을 담당하므로 코드가 구조화되고 모듈화됩니다.
  • View와 Model이 분리되어 있어 동일한 Model 데이터를 다양한 View에서 재사용 가능합니다.
  • 비즈니스 로직(Model)과 컨트롤러(Controller)가 분리되어 있어 각각 독립적으로 테스트할 수 있습니다.

 

단점

  • Controller가 요청을 중계하는 역할을 하다 보니, 모든 로직이 Controller에 집중되면 코드가 비대해지고 유지보수가 어려워질 수 있습니다.
  • 요청이 Controller → Service → Repository → Database로 이어지며 복잡한 데이터를 처리할 경우, 데이터의 흐름을 파악하기 어렵거나 디버깅이 힘들 수 있습니다.

 

스프링 부트 MVC 폴더, 패키지 구조 예제

프로젝트 MVC 구조 예제

기본적으로 다음과 같은 구조로 구성되는 경우가 많습니다.

src
 ├── main
 │   ├── java
 │   │   └── com.example.demo
 │   │       ├── controller
 │   │       ├── service
 │   │       ├── repository
 │   │       └── model
 │   ├── resources
 │   │   ├── static
 │   │   ├── templates
 │   │   └── application.properties
 └── test

 

각 패키지의 역할과 패키지 별 예제는 다음과 같습니다.

 

 

 

 

 

 

 

1. Controller

사용자의 요청을 처리하는 클래스가 위치합니다.

HTTP 요청을 받고, 서비스 레이어를 호출해 처리 후 데이터를 반환하거나 View에 전달하는 역할을 수행합니다.

@RestController
@RequestMapping("/api")
public class UserController {

    // ...
    // service 의존성 추가
    // ...

    @GetMapping("/users")
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }
}

 

 

2. Service

 

비즈니스 로직을 처리하는 클래스들이 위치합니다.

Controller에서 받은 요청을 처리하거나, Repository를 호출하여 데이터를 가공하는 역할을 수행합니다.

@Service
public class UserService {

    // ...
    // repository 의존성 추가
    // ...
    
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}

 

 

3. Repository

데이터베이스와의 상호작용을 담당합니다.

JPA나 MyBatis등이 활용됩니다.

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

 

 

4. Model

데이터를 표현하는 클래스들이 위치합니다.

엔티티 클래스나 DTO같은 전송 객체가 포함됩니다.

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;
}

 

 

5. Resources

정적 파일 및 템플릿 파일이 저장됩니다.

  • static: 정적 리소스(css, js, 이미지 등)
  • templates: Thymeleaf, JSP와 같은 서버 렌더링용 파일
  • application.properties: 애플리케이션 설정 파일(application.yml로도 사용 가능)