[디자인패턴] MVC 패턴과 스프링부트 패키지 구조

hyelim·2023년 8월 10일
0
post-thumbnail

폴더 구조를 도메인 형, 계층형으로 할지 고민 하다가 계층형이 MVC 패턴을 반영한 설계 같아서 이에 대해 자세히 정리해보고자 한다

계층형 폴더 구조는 MVC (Model-View-Controller) 패턴을 반영한 소프트웨어 아키텍처의 설계 원칙을 따르는 방법 중 하나입니다. 이 패턴은 소프트웨어의 모듈화와 유지보수성을 높이기 위해 개발된 방법론으로, 각 계층이 명확하게 분리되어 서로의 역할과 책임이 구분되며, 변경사항이 한 계층에서 다른 계층으로 영향을 미치지 않도록 하는 데 중점을 둡니다.

MVC란

MVC 는 Model, View, Controller의 약자 이다. 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성요소를 세가지의 역할로 구분한 패턴이다

위의 그림처럼 사용자가 controller를 조작하면 controller는 model을 통해서 데이터를 가져오고 그 정보를 바탕으로 시각적인 표현을 담당하는 View를 제어해서 사용자에게 전달하게 된다.
저건 하나의 로직을 설명하기 위해 만든 그림이고 사실 MVC 패턴의 구조는 아래가 더 맞을 것이다

모델은 컨트롤러에 컨트롤러는 뷰에 뷰는 다시 유저 유저는 다시 컨트롤러를 향해서 간다

Model

사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
뷰나 컨트롤러에 대해서 어떤 정보도 알지 말아야 한다.
변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야만 한다.

View

모델이 가지고 있는 정보를 따로 저장해서는 안된다.
모델이나 컨트롤러와 같이 다른 구성요소들을 몰라야 된다
변경이 일어나면 변경통지에 대한 처리방법을 구현해야만 한다.

모델과 같이 변경이 일어났을 때 이른 누군가에게 변경을 알려줘야 하는 방법을 구현해야 합니다. 뷰에서는 화면에서 사용자가 화면에 표시된 내용을 변경하게 되면 이를 모델에게 전달해서 모델을 변경해야 할 것이다. 그 작업을 하기 위해 변경 통지를 구현합니다.
그리고 재사용가능하게끔 설계를 해야 하며 다른 정보들을 표현할 때 쉽게 설계를 해야 합니다.

Controller

모델이나 뷰에 대해서 알고 있어야 한다.
모델이나 뷰의 변경을 모니터링 해야 한다.

MVC 패턴을 사용하는 이유

사용자가 보는 페이지, 데이터처리, 그리고 이 2가지를 중간에서 제어하는 컨트롤, 이 3가지로 구성되는 하나의 애플리케이션을 만들면 각각 맡은바에만 집중을 할 수 있게 된다
이렇게 되면 유지보수성, 애플리케이션의 확장성, 그리고 유연성이 증가하고, 중복코딩이라는 문제점 또한 사라지게 되는 것이다.

계층형 폴더구조

계층형 구조는 각 계층을 대표하는 디렉터리를 기준으로 코드를 구성하는 것이다.

장점 : 프로젝트의 이해도가 낮아도 전체적인 구조 파악을 빠르게 할 수 있다.
단점 : 디렉터리 안에 클래스들이 너무 모인다.

도메인형 폴더구조

도메인 디렉터리를 기준으로 코드를 구성하는 것이다.

장점 : 도메인의 관련 코드를 응집할 수 있다.
단점 : 프로젝트의 이해도가 낮을 경우 전체적인 구조를 파악하기 어렵다.

결론

계층형 같은 경우 Controller, Service 등에 너무 많은 클래스들이 밀집하게 된다
도메인형은 관련된 코드들이 응집해있기 때문에 자연스럽게 기존 코드를 닮아갈 수 있다고 생각한다.
또한 최근 기술 동향만 봐도 도메인 주도 개발, ORM, 객체지향 프로그래밍 등 도메인형 구조가 더 적합하다고 생각해 도메인 형으로 프로젝트를 세팅 할 것이다

전체적인 구조는 도메인을 담당하는 디렉터리 domain, 전체적인 설정을 관리하는 global, 외부 인프라스트럭처를 관리하는 infra로 구성 할 예정이다

https://velog.io/@sunil1369/Spring-boot-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B5%AC%EC%A1%B0#dao
https://m.blog.naver.com/jhc9639/220967034588
https://cheese10yun.github.io/spring-guide-directory/

profile
기록용

0개의 댓글