Open sootudio opened 4 months ago
저는 트랜잭션을 시작하고 종료시킨다
는 것을 비지니스 로직이라고 볼 수 있기에 그렇게 말한 것이라고 생각했습니다.
일련의 작업들을 하나하나 다른 작업으로 취급하고 마지막 작업의 실패 여부가 이전 작업에 영향을 주지 않도록 할 것인지, 아니면 마지막 작업이 실패하면 이전의 모든 작업을 롤백하도록 할 것인지는
단순히 db에 접근해서 sql을 수행하는 책임을 가진 dao에서 판단할 일은 아니겠다고 이해했습니다. 이러한 맥락에서 UserService에서 트랜잭션을 관리하는 것이 단일 책임 원칙을 지킨다고 말할 수 있지 않을까 생각합니다.
이때 추가로 발생하는 문제가 UserService가 JDBC, JPA와 같은 구체적인 데이터 접근 기술에 종속된다는 점인데, 그래서 책에서는 이 문제를 서비스 추상화를 통해 해결하고 있는 것 같습니다.
제 생각에는 UserService 에서 트랜 잭션 관련 코드를 스프링 트랜잭션 추상화 인 PlateformTransactionManager 를 사용하고 스프링 빈으로 관리하여 UserService에 주입 시켜 주었기 때문에 UserService는 변화할 수 있는 트랜잭션에 영향을 받지 않고 오직 자신이 수행할 비지니스 로직만 신경 쓸 수 있기에 단일책임을 지키고 있다고 생각합니다. 그래서 기존 PlateformTransactionManager 와 주입으로 트랜잭션을 관리 하지 않았을시
다음장인 AOP로 넘어가면 완전히 분리되는 걸 볼 수있는데 그 전 단계인 이번 장에서는 데이터 접근 기술(JDBC, JPA 등)이 변경되어도 서비스 코드에서의 트랜잭션 코드가 영향을 받지 않는 다는 관점으로 생각할 수 있습니다.
5.2 장에서는 upgradeLevels()와 같이 여러 번 DB 업데이트를 해야하는 작업은 각각의 메소드 호출 마다 새로운 트랜잭션이 만들어지기 때문에, 해당 작업들을 하나의 트랜잭션으로 묶기 위해(UserService에서 DB커넥션을 다루기 위해) 트랜잭션의 경계설정 작업을 UserService 쪽으로 가져옵니다.
그런데 5.3 장에서 단일 책임 원칙에 대한 설명을 들으니, UserService가 단일 책임 원칙을 지키고 있는지 의문이 들었습니다.
해당 장에서 UserService는 사용자 관리 로직이 바뀌거나 추가 되지 않는 한 코드를 수정할 일이 없기 때문에 단일 책임 원칙을 충실하게 지키고 있다고 말하고 있습니다.
그런데, 제 생각에는 앞서 5.1 장에서 UserService는 비즈니스 로직이라고 하고, 5.2장에서 트랜젝션에 대한 코드를 추가했으므로 사용자 관리 책임과 DB를 관리하는 책임, 2 가지 책임이 생기기 때문에 단일 책임 원칙을 잘 지키고 있지 못하다고 생각했습니다.
다른 분들은 어떻게 생각하시는지 궁금해서 질문 올려봅니다!