java

[java] MVC 패턴이란? 좋은 MVC 패턴을 구현하려면?

윤밥밥 2023. 11. 24. 23:28

MVC란

model, view, controller를 의미하는 것

  • model(domain)이란 데이터베이스에서 정보를 가져오는 것, 더불어 oop에서는 model 내부에서 값을 가지고 값을 처리하는 기능까지 한다.
    *
  • controller는 model에서 받은 데이터를 가공해 view에게 전달하거나, view에서 받은 데이터를 가공해 model에 전달해준다.
  • view란 controller에서 받은 정보를 사용자에게 보여주는 것.

이와 더불어 service가 존재한다.

  • service
    • 서비스 layer란 어플리케이션의 비즈니스 로직을 말하며, 즉 도메인을 보호하는 레이어 이다.

좋은 MVC 패턴

  1. Model 내부에 Controller와 View에 의존하지 않아야 한다.
  2. View는 Model에만 의존해야 하고, Controller에는 의존하면 안된다.
  3. View가 Model로부터 데이터를 받을 떄는 사용자마다 다르게 보여주어야 하는 데이터에 대해서만 받아야 한다.
  4. Controller는 Model과 View에 의존해도 된다.
  5. View가 Model로부터 데이터를 받을 때, 반드시 Controller에서 받아야 한다.

참고

# 도메인은 서비스레이어에서 DTO로 변환되어 컨트롤러로 전달되어야 한다. (dto란 data transfer object로 mvc 각 단계에서 데이터를 전송할 때 객체로 한번 감싸 외부에서 보이지 않도록 하는 것)
# 여러 Model들이 의존성 주입을 통해 엮여서 하나의 동작 캡슐화를 할 수 있을 때 Service레이어에서 처리한다. 즉 다시 설명하면 여러 MODEL을 합쳐야만 데이터를 가공할 수 있을 때 service레이어에서 처리하며, 그 외의 model에서 처리할 수 있는 것은 model 내부의 메서드를 통해 처리하는 것이 좋다.

입력에 대해 형변환이나, 파싱,validate같은 경우는 view, controller, model중 어디에서 처리해야할까?

이에 대한 정답은 없지만, 개인적인 견해로는 모델에서 하는 것이 가장 깔끔하다고 생각한다.

첫번쨰 이유

내부에 validator 로직을 둠으로써, 클래스에 대한 identity가 생긴다. 예를 들어 payment라는 도메인의 경우, 값이 숫자이면서 음수이면 안되는 데, 이를 클래스 밖에서 validate를 할 경우에, 실수로 payment에 잘못된 값을 넣어 객체를 만들어도 이 오류를 잡아낼 수 없다.
하지만 생성자 혹은 정적 팩토리 메서드에 validate를 넣어준다면, 객체를 생성할 때 오류가 생기는 일이 없어진다.

두번째 이유

유지보수가 편해진다. 만약에 validator가 외부에 있을 경우 이를 찾으러 다니는 데 시간이 소모된다. 따라서 내부에 두는 것이 유지보수에 편하다.

세번째 이유

형변환이나, 파싱 같은 경우는 예를 들어 설명하자면.
payment 클래스 객체를 생성할 때는 금액이므로 숫자를 받아야 한다. 그럼 사용자 입력에서 스트링이 왔을 경우 이를 int로 변환하여 생성자에 넣어주고 객체를 생성할 수 있다. 다만 이러면 자칫 코드가 지저분해 질 수 있다.
내 개인적인 견해로는 이 때 이용할 수 있는 것이 생성자 오버로딩이라 생각한다. int, string, long등 다양한 입력에 대한 여러 생성자를 둔 다면, 외부 코드도 깔끔해지면서 유지보수에도 좋다고 생각한다.