본문 바로가기

Spring Boot

@Repository, @Service, DTO는 MVC 중 뭐지?

@Repository, @Service, DTO는 MVC 중 어디에 속할까?
이를 살펴보기에 앞서 먼저 MVC에 대해 알아보자!

MVC

1. Model

Model은 비즈니스 로직을 처리한다.
Model은 데이터를 처리한다 -> 데이터에 접근하고 조작하는 방법을 제공한다. 

 

2. View

View는 사용자에게 화면을 렌더링해주는 역할을 담당한다.
Model의 데이터를 사용자에게 보기 쉽게 제공해준다.

 

3. Controller

Controller는 요청에 따라 View와 Model로 명령을 적절히 분배해준다.

Model을 통해 데이터를 조작하며, 렌더링할 View를 결정한다.

 

참고로 Controller는 View를 렌더링하지 않고, API로써 JSON이나 데이터를 반환할 수도 있다.
이런 경우, 반환값은 Model에 속한다.
이는 현대 앱 구조가 복잡해짐으로써 발생하는 현상이라고 생각한다.
예전에는 서버에서 View Rendering을 모두 처리했다.
하지만 현재는 React나 안드로이드 앱 등의 등장으로 View를 꼭 Server에서 처리하지 않을 수도 있다.
즉, Controller에서 View를 결정하지 않을 수도 있다.
이런 경우 Controller는 렌더링할 View를 결정하지 않고, View로 Model을 내려주는 동작을 할 수도 있는 것이다.

 

설명은 MDN Doc과 chat gpt를 참고했다.
위 설명이 신뢰가 가지 않는다면 MDN 문서와 chat gpt를 확인해보자!


@Repository, @Service, DTO는 MVC 중 뭐지?

명심해야 할 것은 MVC는 정의(명세 - specification)일 뿐이라는 것이다.

MVC는 단순히 정의이고 명세일 뿐이다.

내가 하고싶은 말은 어떤 것이든 Model의 역할을 하면 Model이라는 것이다.

View는 Thymeleaf, React, Flutter, Android Studio 등 여러 구현체들로 구현될 수 있다.
View라는 정의가 여러 방법을 통해 구현될 수 있다는 것이다.

 

JSP에서는 Model(Layer)로 조회한 데이터를 JSP로 내려주기 위해 request.setAttribute()를 사용한다.
request.setAttribute()와 request.getAttribute()는 여기서 Model 역할을 하는 것이다.

Thymeleaf에서는 Model(Layer)로 조회한 데이터를 View로 내려주기 위해 Model(class) 객체를 사용한다.
여기서는 Model(class)가 Model 역할을 하는 것이다.

 

그래서 결론은 data에 접근하고 조작하는 방법을 제공하는 @Repository는 Model이다.
각 계층 간의 data 전송을 담당하는 DTO는 Model이다.
business logic을 담당하는 @Service는 Model이다.

 

참고로 나는 다음과 같은 의문점이 있었다.
Controller에서 Model(Service나 Repository 등)로 정렬이나 필터링을 위해 param을 전달할 때,
DTO를 사용하지 않고, String이나 기본타입을 사용해도 Model일까?
DTO는 layer 간의 데이터를 교환하기 위해 사용된다.
비록 애플리케이션의 상태 data는 아닐지라도 data를 관리하는 이것 역시도 Model이다.
반면에 DTO를 사용하지 않은 단순 param은 Controller의 입력처리로 보는 시각이 더 강한 거 같다.
같은 역할을 해도 DTO에 담으면 Model, 안 담으면 그냥 Controller의 입력처리에서 발생하는 변수로
본다는 것이 혼란스러울 수 있다. 만약 그렇다면, 그냥 외우자.

'Spring Boot' 카테고리의 다른 글

log file 날짜별 rolling 설정  (0) 2022.09.28
API 예외처리 공통화 2  (0) 2022.04.05
API 예외처리 공통화 1  (0) 2022.04.03
Slack에서 error log 알림받기(console 변동 X)  (0) 2022.03.11
SQL parameter 값 확인하기  (0) 2022.01.20