Dazzling 개발 노트

[Spring] 서비스를 통한 데이터 접근 vs 레포지토리 직접 접근 본문

Develop/Spring

[Spring] 서비스를 통한 데이터 접근 vs 레포지토리 직접 접근

dj._.dazzling 2024. 1. 26. 06:08

프로젝트를 진행하다가 데이터베이스의 다른 테이블에 접근하는 일이 필요할 때,

 

관련 서비스를 통해서 레포지토리를 통해 접근,

혹은 사용중인 서비스에서 레포지토리를 바로 호출해서 접근.

 

이 두 가지 접근에 대해 의견이 나눠졌다.

 

그래서 각각의 방법이 가진 특성과 그로 인한 장단점을 조사해봤다.

 

 

A 서비스가 B 서비스를 거쳐 B 레포지토리에 접근하는 방식

이 방법은 서비스 계층의 캡슐화와 추상화를 잘 유지하면서 다른 도메인의 로직에 손쉽게 접근할 수 있도록 해준다.

B 서비스는 B 테이블의 비즈니스 로직을 담당하며, A 서비스는 B 서비스가 제공하는 인터페이스를 통해 필요한 로직을 재사용할 수 있다.

 

장점:

1) 코드 재사용성의 증가

B 테이블과 관련된 비즈니스 로직이 B 서비스에 집중되어 있어, 다른 서비스에서도 필요할 때 쉽게 재사용할 수 있다.

 

2) 결합도의 감소

A 서비스는 B 레포지토리의 내부 구현을 몰라도 되므로, B의 변경사항이 A에 미치는 영향을 최소화할 수 있다.

 

3) 단일 책임 원칙의 준수

각 서비스가 자신의 도메인에만 초점을 맞추어 코드의 유지보수성과 가독성을 높일 수 있다.

 

단점:

간접 호출로 인한 오버헤드 발생 가능성: 간혹 서비스 계층을 통하는 것이 직접 레포지토리에 접근하는 것보다 복잡하거나 미세한 성능 저하를 초래할 수 있다.

 

A 서비스가 B 레포지토리에 직접 접근하는 방식

이 방법에서는 A 서비스가 B 레포지토리의 메소드를 직접 호출하여 데이터를 조회하거나 변경한다. 빠른 개발이 필요하거나 로직이 매우 간단한 경우에 유리할 수 있다.

 

장점:

간단한 로직의 신속한 처리

아주 간단한 CRUD 작업 같은 경우, 서비스 계층을 건너뛰고 바로 레포지토리에 접근하는 것이 코드를 더 단순하게 만들 수 있다.

 

단점:

1) 코드 중복의 위험

B 테이블과 관련된 비즈니스 로직이 여러 서비스에 걸쳐 중복되어, 유지보수가 어려워질 수 있다.

 

2) 결합도의 증가

A 서비스가 B 레포지토리의 내부 구현에 의존하게 되어, B에서의 변경사항이 A에 큰 영향을 미칠 수 있다.

 

3) 비즈니스 로직의 분산

비즈니스 로직이 서비스 계층과 레포지토리 계층에 걸쳐퍼져 있어, 전체 시스템의 구조를 파악하기 어려워질 수 있다.

 

마무리와 결론

결론적으로, 다른 도메인의 데이터나 로직에 접근할 때는 대체로 서비스 계층을 통하는 것이 좋다고 할 수 있다.

이 방식은 시스템의 유지보수성을 높이고, 코드의 재사용성을 증가시키며,

각 계층의 역할을 분명히 해줌으로써 많은 이점을 제공한다.

 

물론 상황에 따라 직접 레포지토리에 접근하는 방식을 선택할 수도 있겠지만,

그럴 경우에도 각 방식의 장단점을 충분히 고려하는 것이 중요하다.