이제 UserDao와 UserService는 각각 담당하는 분야가 아예 다르다.
그렇기에 서로 영향을 주지 않으며 독자적으로 확장이 가능하다.
그에 비해 트랜잭션의 추상화는 애플리케이션의 비즈니스 로직과 그 하위에서 동작하는 로우레벨의 트랜잭션 기술이라는 아예 다른 계층의 특성을 갖는 코드로 분리했다.
UserService | ⇢ | UserDao | 애플리케이션 계층 |
⇣ | ⇣ | ||
TransactionManager | ⇢ | DataSource | 서비스 추상화 계층 |
⇣ | ⇣ | ||
JDBC, JTA, ... | 기술 서비스 계층 |
UserService, UserDao는 애플리케이션의 로직을 담고 있는 애플리케이션 계층이다.
UserService가 UserDao를 사용하고 있으며, 인터페이스와 DI를 통해 연결되어 낮은 결합도를 가지고 있다.
또한 UserDao는 DataSource 인터페이스를 통해 추상화하여 DB를 연결하고 있기 때문에 DB 연결을 생성하는 것에 독립적이며, UserService도 PlatformTransactionManager 인터페이스를 통한 추상화 계층으로 트랜잭션 기술에 독립적이다.
이후에 변경이 되더라도 해당 기술을 사용하는 코드들은 변할 필요가 없다는 것이다.
이러한 장점이 단일 책임 원칙을 잘 지켰기에 오는 것이다.
단일 책임 원칙은 '하나의 모듈은 한 가지 책임을 가져야 한다'는 의미이다.
기존의 UserService에서는 트랜잭션을 직접 관리하고 있었다.
그리고 JDBC transaction, JTA transaction 이렇게 트랜잭션 기술을 변경 할 때마다 UserService를 수정해야 했다.
하지만 트랜잭션의 추상화를 도입하고, 트랜잭션의 이유로 UserService가 변경될 일은 없다.
지금은 현재 User와 관련된 코드만 작성이 되어 있어서, 어쩌면 이렇게 개발하는 것보다는 그냥 그때그때 바꾸는게 더 빠를 수도 있다.
하지만 언제까지나 이런 프로젝트만 존재하지는 않는다.
프로젝트가 커질수록 이런 부분을 바꾸는 것은 거의 불가능에 가까울 것이다.
나중에 확장을 대비해서 DI와 추상화를 사용하여 객체지향적으로 개발할 수 있도록 하자.
'Spring > 토비의 스프링' 카테고리의 다른 글
[토비의 스프링] 6.1 트랜잭션 코드의 분리 (1) | 2025.06.14 |
---|---|
[토비의 스프링] 5.4 메일 서비스 추상화 (0) | 2025.06.11 |
[토비의 스프링] 5.2 트랜잭션 서비스 추상화 (2) | 2025.06.09 |
[토비의 스프링] 5.1 사용자 레벨 관리 기능 추가 (0) | 2025.06.07 |
[토비의 스프링] 4.2 예외 전환 (1) | 2025.06.04 |