Study/Java

[Java] MVC 패턴 그리고 domain, service

dev_kong 2022. 11. 5. 01:23
728x90
728x90

0. 목차

1. 개요

2. MVC 패턴

3. domain과 service

1. 개요

우테코지원 해야겠다 마음먹고, 이전기수 프리코스 내용 검색해서 찾아본적이 있었다.
이전기수 분들의 블로그 글들에서 공통적으로 보이던 것들이
OOP(객체지향), TDD(테스트 주도 개발), MVC 였다.


그때부터 조금씩 저 세가지 내용에 대해 틈틈히 블로그 글들을 읽으면서,
내가 프리코스를 할 때는 저 세가지 항목을 꼭 지키면서 해야지 라는 마음을 가졌었다.

 

.. 물론 잘 못하고 있는 중이다.

더 잘하기 위해서 공부했던 내용 한번 정리 들어간다.

2. MVC 패턴

솔직히 한번도 안들어 본 사람은 없을거다.

처음 들어봤으면 이것만 치라곸ㅋ

나도 뭔지는 몰라도 들어본적은 있었으니까.

MVC 패턴은 MODEL VIEW CONTROLL의 약자로 하나의 애플리케이션을 3가지의 역할로 기준을 나누어 구분한 패턴이다.

이거 왜함??

이걸 하는 이유는 단순하다.


이렇게 나눠 놓으므로 인해, 관리 즉, 유지보수가 쉬워진다.
또한, 이러한 패턴을 하나의 규약처럼 정해놓고 사용한다면,
이 코드를 처음 읽는 사람일지라도 코드를 이해하는데 필요한 시간이 줄어들 것이다.

 

왜 사용하는 지는 알겠으니까
이제 각각 어떤 역할을 하는지 알아보자.

2-1. Model

애플리케이션이 어떤 일 을 하는지에 대해 작성된다.
비즈니스 로직을 담당한다.

 

DB와 연동하여 사용자가 입력한데이터를 입력하거나, 사용자에게 출력할 데이터를 관리한다.

역할 뿐만 아니라 Model이 꼭 지켜야 하는 규칙 같은게 있는데,

 

뷰나 컨트롤러에 대해 어떤 정보도 알지 말아야 한다.

 

즉 모델은 모델의 역할말 해야되고, 뷰나 컨트롤러에 속하는 역할을 해서도 안되고, 갖고있어서도 안된다.

2-2. View

View는 말그대로 사용자에게 보여지는 UI적인 부분이다.
마찬가지로 규칙이 있는데

 

모델의 정보를 저장하고 있으면 안된다.

 

뷰는 컨트롤을 통해 모델에서 정보를 받아 출력 만 해주는 출력 셔틀의 역할이다.
모델의 정보를 저장하고있으면 당연히 셔틀의 역할이 아니다.

2-3. Controller

컨트롤러의 역할을 중재자의 역할이다.
모델과 뷰는 사이가 안좋아서 서로 뭐하는 앤지 관심도 없고, 알지도 못한다.

근데 애플리케이션이 돌아가려면 저 두녀석이 조화롭게 지내야 되는데
중간에서 말을 전달 해주는게 컨트롤러다.

컨트롤러야 고생이 많다..

그러니 당연히,

모델과 뷰에 대해 알고 있어야한다.

글로 대충 느낌을 잡았다면, 아래그림을 보면 좀더 느낌이 온다.

이정도면 mvc가 뭔지 알것같다.

3. domain 과 service

음.
사실 이 글을 작성한 가장 큰이유다.

이부분은 아직 나도 확실하게 아는 게 아니라 추후 수정을 할 예정이긴하다..;
맨처음 말했듯, 이전기수분들의 블로그를 염탐했다고 했는데

그중 몇몇 블로그는 과제 깃헙 리포 올려 놓은것도 있더라.
그거 어케 안보고 넘어감.


근데 controller와 view는 있는데 model은 안보이고 왠 domain 과 service 만 있더라.

domain..? service...? 누구세요..?

그래서 그때부터 폭풍 검색을 통해 얘네가 뭐하는 앤지 알게됐다.

 

위에서 model은 서비스 로직과 DB연동을 담당한다고 했다.
이게 말이 쉽지 사실 굉장히 방대한 양이고,
애플리케이션의 핵심역할 이라고도 할수 있다.


이걸 하나의 구조로 때려박으면 어떻게 될까?

 

그래서 model에서도 역할을 나눠서 수행한다.

  • repository
    : DB에 접근 하는 역할인듯하다. (사실 잘모르겠음..)
  • domain
    : 객체의 정보를 담는 역할
  • service
    : 비즈니스 로직

이렇게 인것 같다. 사실 아직도 잘 모르겠다.
사실 이게 명확히 어떻게 구분을 해야할지 감이 좀 안잡힌다.

예를 들어,
User class 가 있을때,

public class User {
    private String name;
    private Integer yearOfBirth;

    User(String name, Integer yearOfBirth) {
        this.name = name;
        this.yearOfBirth = yearOfBirth;
    }
}

만약에 유저의 나이를 구하는 코드는 이 클래스에 작성되어야 하는 것일까.(domain)
아니면 yearOfBirthgetter를 만들어서 service 작성을 해야되는 걸까....

 

객체지향 생활체조 getter/setter/property를 쓰지 않는다 라는 원칙을 생각해보면
User class 안에 있는게 맞는 것 같기도 하고..

 

이부분은 확실해지면 추후 수정을 하겠다..

.. 잘못된 정보를 정확한것처럼 전달하는 것보단 낫다고 생각함..

728x90
728x90