서비스 계층이 특정 기술에 종속되지 않기 때문에 비즈니스 로직을 유지보수하기도 쉽고, 테스트하기에도 용이하기 때문에 종속적이 않게 가는 방향으로 가야한다.
현재까지 작성한 MemberServiceV1 의 경우 문제
트랜잭션을 적용한 MemberServiceV2 추가
public class MemberServiceV2 {
private final DataSource dataSource;
private final MemberRepositoryV2 memberRepository;
public void accountTransfer(String fromId, String toId, int money) throws SQLException {
Connection con = dataSource.getConnection();
try{
//트랜잭션 시작을 위해서 자동커밋 끄기.
con.setAutoCommit(false);
bizLogic(con,fromId, toId, money);
con.commit();
}catch (Exception e){
con.rollback();
throw new IllegalStateException(e);
}finally {
release(con);
}
}
private void bizLogic(Connection con, String fromId, String toId, int money) throws SQLException {
Member fromMember = memberRepository.findById(con,fromId);
Member toMember = memberRepository.findById(con,toId);
memberRepository.update(con,fromId, fromMember.getMoney() - money);
validation(toMember);
memberRepository.update(con,toId, toMember.getMoney() + money);
}
private void validation(Member toMember) {
if (toMember.getMemberId().equals("ex")) {
throw new IllegalStateException("이체중 예외 발생");
}
}
private void release(Connection con){
if(con != null){
try{
con.setAutoCommit(true);
con.close();
}catch (Exception e){
log.info("error",e);
}
}
}
}
이 문제들을 해결하기 위해서 트랜잭션 추상화를 사용한다.