[Spring] 계층구조에 대하여 알아보자(3Layers Architecture)

728x90

안녕하세요🖐 

 

오늘은 제가 토이프로젝트 시작에 앞서, 어떻게 패키지를 구성하고, 파일을 관리할지 고민을 하던 중에

스프링 계층 구조에 대해서 알게되어서 공부하게 되었습니다. 그 내용을 포스팅 해보겠습니다.

 

저는 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 라는 책을 보며, 스프링 계층구조에 대하여 자세히 알게되었습니다.

위 사진이 대표적인 스프링의 계층 구조라고 합니다.

 

각각의 계층은 계층마다 독립적으로 분리하여 구현하는 것이 가능해야하고, 각 계층에서 담당해야 할 기능들이 있다.

 

Web Layer(= Presentation Layer)

우리가 흔히 사용하는 Controller와 View 영역입니다.

스프링을 사용하면서 MVC패턴을 들어보셨을 것이라고 생각합니다. 그 중에서 View와 Controller를 직접적으로 다루는    영역이 Web Layer 입니다.

추가적으로 클라이언트 요청에 대한 응답을 해주는 대표적인 영역이라고 생각하면 될 것 같습니다. 

 

다른 말로는 Presentation Layer 라고도 부릅니다.

 

Service Layer

@Service 에 사용되는 서비스 영역이다.

보통 Controller와 Dao의 중간 영역에서 사용된다.

 

복잡한 코드를 모듈화 할 수 있다

=> 아래서 설명

 

@Transactional 이 사용되는 영역 이다.

서비스에서는 트랜잭션과 도메인 간의 순서만 보장한다. 

 

복잡한 코드를 모듈화할 수 있다.

이게 무슨 말일까요❓❓❓

ex) A 컨트롤러에서 기능을 수행하기 위해, C라는 레포지토리에서 a,b,c메서드를 가져와서 사용한다.

그리고 B 컨트롤러도 C 레포지토리에서 a,b,c메서드를 사용한다. 즉 A,B 컨트롤러는 동일한 기능을 수행해야 한다면, 위에서는 같은 것을 호출하기 때문에 중복된 코드를 가지게 된다. 

위 경우 C 레포지토리의 a,b,c 메소드를 호출하는 기능을 서비스로 만들고 컨트롤러에서 이 서비스를 호출하여 사용할 수 있다. 즉 서비스를 사용하여 모듈화를 할 수 있다.

 

또한 엔티티 객체를 DTO 객체로 변환할 수 있다.

=> 위 내용은 나중에 다시 포스팅 하겠습니다.

 

Repository Layer

DB에 직접적으로 접근하는 영역이다.

Dao(Data access Object) 영역이라고 생각하면 이해가 편함

 

여기까지가 대표적인 3계층 입니다.

그렇다면 위 사진에 오른쪽 사이드에 있는 단어들은 무엇일까요?

 

DTOs

- 계층 간에 데이터 교환을 위한 객체를 의미한다. 

- 예를들어 View 영역에서 서버사이드렌더링 될 객체나, Repository Layer에서 결과로 넘겨준 객체등을 의미한다.

 

Domain Model

비즈니스 로직을 처리하는 영역

@Entity 영역 또한 도메인 모델

즉, Repository 영역과 Service 영역에서 비즈니스 로직을 다 한다고 생각하며 됨.

 

 

그렇다면 여기서 질문📢

 

왜 비즈니스 로직을 도메인 계층에만 작성을 해야 할까요??

 

컨트롤러는DTOs 영역이므로 비즈니스 로직은 작성하지 않는다. 그러면 도메인 계층에서도 Service와 Repository  영역이 나누어져있다. Service는 다양한 도메인을 읽어 기능을 제공한다. 복잡한 서비스는 더 많은 Model을 읽어 서비스를 제공하기 때문에 Service 로직의 복잡도가 매우 높아진다.  

위 이유 때문에 복잡도를 낮추기 위해 최대한 비즈니스 로직을 Model(Domain) 쪽으로 이동시킨다. 즉 Service에서도 비즈니스 로직을 작성하기는 하지만, Repositoy영역에서 비즈니스 로직을 작성하는 것을 추천한다.

 

복잡도른 낮춤으로써 유지보수와 테스트하기 쉬운코드가 생기고, 유연한 s/w를 만들 수 있습니다.

 

이상 포스팅 마치겠습니다.

728x90