MVC 패턴

임유진·2025년 7월 3일

Java

목록 보기
7/12

Model + View + Controller

사용자 요청을 컨트롤러가 받고, 모델이 처리하며, 뷰에 결과를 표시합니다.

📝 목적

  • 역할을 명확히 분리
  • 유지보수가 용이
  • 코드 재사용성 향상
  • 협업 효율성 증대

📝 장점

  • 역할 분리로 유지보수 용이
  • 협업 편리
  • 재사용성 뛰어남

📝 단점

  • 단순한 프로젝트에는 오히려 구조 복잡
  • 계층 이동이 많아 디버깅 어려움

🛠️ 각 구성요소의 역할

Model (모델)

  • 데이터비즈니스 로직 담당

  • 순수 Java 코드(*.java)

  • 데이터베이스 CRUD 수행

  • 예시:

    public class User {
        private String name;
        private int age;
    
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
    }

View (뷰)

  • 사용자에게 데이터를 표시

  • 화면 처리 언어: HTML, CSS, JavaScript

  • 서버 측 JSP(*.jsp) 활용

  • 예시:

    <h1>${user.name}님의 프로필</h1>

Controller (컨트롤러)

  • 사용자 요청을 받고 Model에 전달

  • 처리 결과를 View에 넘김

  • Servlet 또는 Spring Controller로 개발

  • 예시:

    @Controller
    public class UserController {
        @GetMapping("/user")
        public String getUser(Model model) {
            User user = userService.getUser();
            model.addAttribute("user", user);
            return "userView";
        }
    }

🔄 MVC 동작 흐름

  1. 사용자 요청

    • 웹에서 URL 입력
    • 컨트롤러가 요청 수신
  2. 컨트롤러 처리

    • 필요한 모델 판단
    • 데이터 요청
  3. 모델 동작

    • 데이터베이스/로직 처리
    • 결과 반환
  4. View로 데이터 전달

    • 컨트롤러가 View에 데이터 주입
  5. View 렌더링

    • 화면에 결과 표시
    • 사용자에게 응답

🛠️ 예제 프로젝트

계층클래스역할
ViewStartView, SuccessView, FailView사용자 요청, 결과 출력
ControllerController요청 처리, Model 호출, 결과 전달
ModelModel, Database데이터 관리 및 조회
DomainPerson데이터 자체 (id, pw)

🧩 View 계층

📝 StartView

  • 프로그램 진입점(main())에서 Controller에 데이터 요청

    StartView 코드 ```java package view;
        import controller.Controller;
    
        public class StartView {
    
            public static void main(String[] args) {
                Controller.getPersons();
            }
    
        }
        ```

📝 SuccessView

  • 정상 처리 시 메시지 출력

    SuccessView 코드 ```java package view;

    public class SuccessView {

      public static void print(String successMsg) {
          System.out.println(successMsg);
      }

    }

    </details>

📝 FailView

  • 오류 발생 시 메시지 출력

    FailView 코드 ```java package view;

    public class FailView {

      public static void print(String failMsg) {
          System.out.println(failMsg);
      }

    }

    </details>

🧩 Controller 계층

📝 Controller

  • View에서 요청을 받아 Model에 전달 후 결과를 View에 넘김

    controller 코드 ```java package controller;

    import model.Database;
    import model.Model;
    import model.domain.Person;
    import view.FailView;
    import view.SuccessView;

    public class Controller {

      private static final Model model = Model.getModel();
    
      public static void getPersons(){
          Person data = model.getPerson();
          if(data != null) {
              SuccessView.print("데이터가 존재합니다");
          } else {
              FailView.print("데이터가 미 존재합니다.");
          }        
      }

    }

    </details>

🧩 Model 계층

📝 Model

  • Singleton 패턴으로 인스턴스 1개만 생성

    model 코드 ```java package model;

    import model.domain.Person;

    public class Model {

      private Database db = new Database();
      private static Model model = new Model();
    
      private Model() {}
    
      public static Model getModel() {
          return model;
      }
    
      public Person getPerson() {
          return db.getPersons();
      }

    }

    </details>

📝 Database

  • static 블록으로 Person 객체 1개 생성

    database 코드 ```java package model;

    import model.domain.Person;

    public class Database {

      private static Person p;
    
      static {
          p = new Person("tester", 11);
      }
    
      Person getPersons(){
          return p;
      }

    }

    </details>

🧩 Domain 계층

📝 Person

  • 데이터 클래스(Lombok으로 간결화)

    Person 코드
    package model.domain;
    
    import lombok.AllArgsConstructor;
    import lombok.Getter;
    import lombok.NoArgsConstructor;
    import lombok.Setter;
    
    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    public class Person {
        private String id;
        private int pw;
    }

🔄 동작 흐름 요약

StartView.main()
        ↓
Controller.getPersons()
        ↓
Model.getPerson()
        ↓
Database.getPersons()
        ↓
Person 반환
        ↓
Controller에서 null 여부 판단
        ↓
SuccessView.print() or FailView.print()

🛠️ 핵심 설계 포인트

  • Singleton Model

    • private static Model model = new Model();
    • private 생성자로 중복 인스턴스 생성 방지
  • static 블록 데이터 초기화

    • 프로그램 시작 시 Person 1개 생성
  • 책임 분리

    • Controller: 요청 처리/분기
    • Model: 데이터 접근
    • View: 출력 전담
    • Domain: 데이터 보관

📚 참고자료

profile
말하는 고구마

0개의 댓글