보통 스프링부트로 개발하는 경우에 3-Layer 형태(Controller - Serivce - Repository)
로 분리하는 경우가 대부분일 것이다.
그런데 여기서 Service 레이어를 3가지 단위로 더 분리해볼 수 있다.
오늘은 이 3가지 분리 기준과 여기 필요한 개념인 CQRS라는 것에 대해 학습하여 정리해보았다.
우선 서비스 레이어를 유틸화하는 방식이다.
어떤 도메인(Domain)의 서비스 레이어에서 다른 도메인의 레포지토리 레이어와 서비스 레이어를 모두 필요로하는 경우
다른 클래스에 대한 의존성이 강해지는 상황을 줄이기 위해서 사용한다.
예를 들어, A
라는 도메인의 Service Layer에서 B
라는 도메인의 Service Layer와 Repository Layer가 모두 필요한 상황
이 발생한다.
그리고 이러한 도메인이 B
를 포함해서 7개 정도 된다고 가정하자.
그럼 자연스레 A 도메인의 Service Layer엔 14개의 의존성이 묶이게 된다.
이때 타 Domain의 Service Layer에 의존하지 않고 필요한 Service Layer의 메서드를 정적(static) 메서드로 만들어 사용
하면 의존성은 7개로 줄어들어 전보다 훨씬 가벼운 클래스로 변하게 될 것이다.
또한 의존성이 많으면 Test코드를 작성 시, 만들어야 하는 Mock 객체가 많이지기 때문에 불편함이 있으며, 의존성을 가진다는 것은 의존하고 있는 객체가 변경이 발생했을 때 그 객체를 이용하는 나 자신도 변경될 가능성이 있다는 것을 뜻한다.
때문에 의존성을 많이 가질 수록 변화에 유연하지 못한 구조를 가진 프로그램이라고 할 수 있다.
이러한 이유 때문에 타 서비스 레이어에서 호출하는 서비스 레이어의 특정 메서드들을
정적(static)
으로 만들어유틸화(Utilization)
하면 의존성을 이전보다 2배 줄일 수 있다.
DB에서WeekAndDay
객체와 일치하는 날짜/시간을 가진 Article
객체를 찾아 return 하는 메서드이다.
이를 유틸화 하기 위해 Repository 객체를 매개 변수
로 받아 이를 통해 정적 서비스 메서드 내에서 관련 로직을 처리한다.
이러한 방식으로 Repository 단에만 의존할 수 있게 되는 것이다.
이렇게 구현하면 이를 사용하는
서비스 계층
은ArticleService
를 의존하지 않아도 되기 때문에 의존성이 많이 줄어들게 된다.
이제 2가지의 분리를 더 적용시킬 것이다.
이때 CQRS라는 개념을 이해하고 넘어간다면, 왜 이렇게 분리하는지 더 쏙쏙 들어올 것이다.
CQRS는 Command and Query Responsibility Segregation
의 약자로,
Command
와 Query
의 책임을 분리하라는 디자인 패턴이다.
Command
는 객체를 변경하는 쓰기!
Query
는 데이터 조회 기능만을 가진 함수!
이렇게 서비스를 분리하면 각각의 서비스가 하나의 책임만을 가지게 되어 코드의 유지보수성이 향상되며, 성능 최적화와 확장성 측면에서도 이점이 있다.
어떻게 성능 최적화를 할지는 아래 분리 과정에서 설명한다.
select
구문과 같이 DB 통신을 통해 데이터를 조회하는 요청들을 관리하는 서비스 계층
- 읽기 전용 트랜잭션 사용
- 해당 Service Layer의 메서드는 오직 데이터가 어떤 값인지 확인하기 위한 조회하는 용도임
- 때문에 더티체킹이 필요없어
readOnly Transaction
을 사용함- 성능 향상
- 트랜잭션을 읽기 전용 모드로 사용되기 때문에 영속성 컨텍스트가 관리하지만
플러시
를 하지 않는다.플러시
를 하지 않기 때문에스냅샷 비교(더티 체킹)
와 같은 무거운 작업을 수행하지 않으므로 성능이 향상된다.
읽기 전용 트랜잭션을 사용하는
Query 메서드
와는 다르게 트랜잭션이 필요한 Update 또는 Delete, Insert등의 데이터 변경 로직을 관리하기 위해@Transactional
어노테이션에 추가 옵션을 붙이지 않은 체로 사용함
이렇게 분리하여 관리하니, 처음에는 굉장히 불편하고 복잡했지만 적응되면서 유지보수에서 크게 이점을 느꼈다.
하지만 처음 적용할 때는 기준이 잘 잡히지 않아 정말 헬파티를 경험할 수 있을 것이다…
그래도 노력해서 공부해볼만한 내용이기에 이렇게 공유한다!
읽어주셔서 감사합니다🔥
잘 보고 갑니다 !