카테고리 없음

controller , service, repository, db, domain

wooweee 2023. 1. 5. 20:35
728x90

출처: 김영한의 스프링 입문

너무 개념이 헷갈려서 일단 최대한 공부한 후 그간 잡힌 개념을 정리하려 한다.

spring을 이용한 전반적인 웹 개발 흐름이고 이 큰 틀 속에서 세세히 파고 들려고 한다.

이번 게시물에서 controller , service, repository, domain이 어떤 관계를 가지고 작동하는지 설명한다.

* db, repository, domain간의 관계는 설명하지 않는다.

 

 

 

 

우선 client가 서버에 요청을 하면 먼저 controller가 반응을 하고 FE쪽에서는 응답으로 html 파일을 전달한다.

이때 controller는 먼저 spring container 내의 html file을 찾고 html엔진을 돌린후 다시 client에게 파일을 넘기는데 html 엔진이라함은 jsp, php 정도로 생각하면 된다.

 

출처: 김영한의 스프링 입문

 

 

 

 

 

FE에서 어떤 흐름으로 가는지 알게 되었다. 그럼 여기서 controller가 역할을 한거 같은데 어떤 역할을 한것일까?

mvc라고 model, view, controller 삼위일체의 역할을 한다.

 

출처: xeschool

 

client가 id를 친다는지 pw를 쳐서 요청을 하면

이 data를 받는 곳이 model 이고

이걸 가지고 작업을 할 수 있는 다른 파일로 이동시켜주는 네비게이션 역할이 controller(client응답을 받는 것 또한 controller 이다),

마지막으로 다시 client한테 응답해주는 화면을 보내는게 view이다.

 

 

 

이제 남은 건 service, repository, domain이다.

 

자 다시, id,pw data가 들어왔다. 그럼 controller에서 먼저 이 데이터를 domain에 넘긴다.

domain 안에는 id,pw를 저장하는 Map 형식의 object가 있다.

*domain과 db의 관계 역할도 있는데 조금더 공부하고 추가하겠다.

그리고 나서 domain의 객체를 통채로 service로 보낸다.

 

여기까지 보면 domain은 무엇인가 정보를 저장하는거 같다. 여지 저기 찾아본 결과 domain은 개발하려는 대상, 개발 범위를 의미한다.

무슨 말이냐면 개발자의 입장에서 회원 로그인하는 code를 구현해야되는데 그때 필요한 data가 id,pw이고 로그인 개발이라고 할 수 있지만 id,pw를 위한 개발이라고 할 수 있다.

다른 예로 택시 어플을 만든다고 쳤을 때 회원가입 페이지 택시등록 페이지가 있는데 개발 대상의 택시인지 회원인지에따라서 개발의 방향성과 범위가 달라지는 것이다.

 

 

 

이제 domain obj를 service로 넘겼다.

그럼 서비스에서는 뭘할까?

* 위에서는 id,pw로 예를 들었는데 아직 공부량도 부족하고 많은 것을 다루어 보지 않아서 공부했던 회원가입페이지로 설명하겠다

서비스에서는 회원가입이나 중복 회원이 있는지, 회원들 목록을 찾는다던지 정말 서비스적인 (많이 주관적이다) 부분들에 대해서 코드를 짠다. 그리고 서비스에서 어느정도 쳐낼 data는 쳐내준다(중복 회원이면 repository까지 안가고 돌려보냄)

 

그런데 서비스의 코드를 살펴보면 method들이 되게 repository와 의존적으로 엮여있다.

그래서 repository를 확인해보면 서비스에 있는 method와 같은 역할을 하는 method로 구성되어있다.

 

그럼 왜 repository가 필요한가?

왜냐면 repository는 DB와 연결이 되어있어서(이 관계도 공부되는대로 포스팅하겠다) DB에 data를 저장해준다던가 client에 요청이 온 이런 id 찾아주세요하면 service가 이 id data를 가지고 와서 한번 거를건 거르고 repository에 있는 다른 id들과 비교한다. repository는 db와 연결되어있어서 다른 id들도 끄집어 올 수 있기 때문

 

이렇게 비슷하지만 하나로 합치게되면 되게 복잡하게 코드가 만들어지고 나중에 설명한다던 db, repository, domain간의 관계에서 interface를 이용한 다형성의 장점을 사용할 수 없게 된다.