본문 바로가기
Portpolio/webdev_tip

토비의 스프링 3.1 1권 05. 서비스 추상화

by Peter Choi 2024. 2. 17.
반응형

5.1 사용자 레벨 관리 기능 추가

기본적으로 만든 UserDao에는 CRUD 기능만 포함 => 비즈니스 로직을 추가해야 함

기본적인 회원의 등급, 수정의 범위, 레벨 관리 등의 기능을 추가해야 함

 

5.2 트랜잭션 서비스 추상화

트랜잭션의 원자성: 완전히 변경이 되던가 아니면 변경을 안하던가 

이 원자성이 보장되지 않는 경우 큰 문제가 발생함

하나의 SQL 명령을 처리하는 경우는 DB가 트랜잭션을 보장한다는 것을 전제로 하지만 여러 SQL 명령을 하나의 트랜잭션으로 취급하려면 경계설정이 필수적임

 

여기서 경계를 설정하는 부분이 .setAutoCommit(false)이나 .commit(), .rollback() 등으로 지정됨

 

롤백은 문제가 생길 시 다시 원상태로 돌리는 작업을 의미하며 게임에서의 세이브 기능과 유사함

 

순서는 트랜잭션 시작 => 트랜잭션 커밋 => 예외 시 트랜잭션 롤백 => 트랜잭션 종료 

 

그러나 이러한 방법은 데이터 접근에 있어서

1. 처음 목표했던 독립성이 위반되거나

2. 멀티스레드 환경에서 덮어써지거나

3. 비즈니스 로직에 connection parameter가 추가되면서 코드가 복잡해진다는 것이다.

 

이러한 문제를 해결하기 위해 트랜잭션 동기화라는 방법을 사용할 수 있다. 이는 커넥션 오브젝트를 특수한 저장소에 보관하고 dao에서는 이 저장된 커넥션을 필요할 때마다 사용하도록 한다는 것이다. 

 

TransactionSynchronizationManager.initSynchronization() 과 같은 메소드를 이용하여 트랜잭션 동기화를 사용할 수 있다.

 

자바에서는 이러한 트랜잭션을 도와주는 API인 JTA가 제공되고 있다.

 

5.3 서비스 추상화와 단일 책임 원칙

출처: 토비의 스프링 3.1 1권

UserDao는 DB 연결 방법에 대해 매우 독립적이다. 

 

위와 같은 방법으로 서비스를 추상화하게 될때 서비스의 각 계층은 단일 책임을 진다고 할 수 있다. 

 

5.4 메일 서비스 추상화 

SMTP 프로토콜을 지원하는 메일 전송 서버가 필요함

 

테스트 환경을 만들어주기 위해, 테스트 대상이 되는 오브젝트의 기능에만 충실하게 테스트를 실행할 수 있게 해주는 것을 테스트 대역이라고 하며 대표적으로 테스트 스텁이 존재함

 

 

 

 

반응형

댓글