MVC Pattern

twkwon0417·2023년 11월 1일
0

Back-End

목록 보기
2/2

0. 목차

  1. MVC의 정의
  2. Model
  3. View
  4. Controller
  5. MVC 패턴의 장점
  6. MVC 패턴의 단점

1. MVC의 정의

Model, View, Controller로 어플리케이션을 분리한 디자인 패턴
Model과 View는 서로 몰라야 하고 Model과 View의 소통은 Controller을 매개로 해야 한다.

2. Model

애플리케션이 데이터 관리 및 어떤 일을 하는지(비지니스 로직)를 담당한다.
서비스 로직과 DB연동으로 세분화 할수 있는데 이에 따라 model에서도 역할이 나뉜다.

  • Repository : DB에 접근 제어
  • Domain : View에 보여줄 객체의 정보를 담음.
  • Service : 비지니스 로직 (한 Domain안에서 해결할수 없는 로직만 Service를 만든다. 그러지 않는다면 Domain은 데이터만 딸랑 들어있는 Anemic Domain Model이 될 것이다.)
	// domain
	public class Racing {
    private static final int MAX_MOVE_POINT = 9;
    private static final int MIN_MOVE_INT = 0;

    public Racing(String[] userName) {
        this.participant = Arrays.stream(userName)
                .map(String::trim)
                .map(Car::new)
                .toList();
    }
    
    private final List<Car> participant;

    public void drive(Car car) {
        car.go(createMovePoint());
    }

    private int createMovePoint() {
        return Randoms.pickNumberInRange(MIN_MOVE_INT, MAX_MOVE_POINT);
    }

    public CurrentRacingStatusDto play() {
        for (Car car : participant) {
            this.drive(car);
        }
        return new CurrentRacingStatusDto(this);
    }

    public List<String> computeResult() {
        return participant.stream()
                .collect(Collectors.groupingBy(Car::getDistance, TreeMap::new, Collectors.toList()))
                .lastEntry()
                .getValue()
                .stream()
                .map(Car::getName)
                .toList();
    }

3. View

비지니스 로직 처리 결과를 통해 사용자에게 보여지는 UI 역할
Model 데이터를 렌더링한다.

public class OutputView {
    private static final String SKID = "-";

    public void printInit() {
        System.out.println("실행 결과");
    }

    public void printCurrentStatus(CurrentRacingStatusDto currentRacingStatusDto) {
        for (CarDto car : currentRacingStatusDto.cars()) {
            System.out.println(car.name() + " : " + "-".repeat(car.distance()));
        }
    }

    public void printResult(List<String> result) {
        System.out.println("최종 우승자 : " + String.join(", ", result));
    }
}

4. Controller

Model과 View사이에 있어 서로를 연결해주는 역할

View에서 입력이 들어오면 Controller가 Model에게 전달하고, Model은 입력값에 대한 데이터를 Controller에게 보낸다. 그러면 Controller은 데이터를 View한테 넘기고 View는 데이터를 바탕으로 사용자에게 보여줄 UI를 그린다.

public class Application {
    public static void main(String[] args) {
        OutputView outputView = new OutputView();
        InputView inputView = new InputView();

        Racing racing = new Racing(inputView.inputName());
        int repeat = inputView.inputTries();

        for (int i = 0; i < repeat; i++) {
            outputView.printCurrentStatus(racing.play());
        }
        outputView.printResult(racing.computeResult());
    }
}

5. MVC 패턴의 장점

각 컴포넌트가 특정한 책임을 가지고 있기 떄문에 관심사에 대한 뚜렸한 구분이 생긴다.
-> 코드 분석, 테스트, 재사용을 쉽게 해준다.

6. MVC 패턴의 단점

3가지 컴포넌트를 만들고 관리 해야 하니 많은 파일들이 생긴다.
-> 코드의 복잡성, 오버헤드를 증가 시킬수 있다.

profile
맨 땅에 헤딩

0개의 댓글