IT이론 2018. 3. 8. 15:30

서비스 추상화란?


서비스 추상화란 Spring framework는 물론 객체지향 프로그래밍에서 아주 중요한 개념이다. 간단히 이야기하면 개발환경, 혹은 어떠한 비즈니스 로직을 위한 로우레벨의 기술에 구애 받지 않게 하기위해서, 그리고 책임을 분리 시키기 위한 추상화 개념이다. 예를 들어서 PlatformTransactionManager 같은 경우가 서비스 추상화의 대표적인 예이다. 트랜잭션을 관리한다는 것은 크게 보면 디비의 트랜잭션을 관리한다는 말이다. 그렇다면? 과연 디비라는 것은 종류가 하나인 것인가? 아니다. JDBC,하이버네이트 등등 아주 많은 디비의 종류가 있다. 그렇다면 각자의 디비의 트랜잭션을 관리하기 위해 각각다른 트랜잭션 코드가 필요하다면? 만약 디비가 바뀌게 된다면 그에 따라 트랜잭션 관리 코드 또한 바뀌어야 할것이다. 여기서 중요한 개념이 서비스 추상화 개념이다. 트랜잭션을 관리하기 위한 최상위 인터페이스인 PlatformTransactionManager를 선언하고 각 디비에 대한 transactionManager 클래스를 DI해주면? 트랜잭션 관련 코드는 통일되는 동시에 디비가 바뀐다면 DI설정 XML파일만 교체해주면 된다. 디비가 바뀌게 되더라도 트랜잭션 관련코드의 변경은 하나도 없는것이다. 이것이 서비스 추상화의 장점인 것이다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class UserDAOTest {
    @Autowired
    UserService userService;
    @Autowired
    PlatformTransactionManager transactionManager;
    
    //트랜잭션 경계설정 코드
    @Test(expected=DataAccessException.class)
    public void insertUserTest() {
        //트랜잭션의 시작을 알린다.(트랜잭션을 얻어오는 시점이 시작)
        TransactionStatus status=this.transactionManager.getTransaction(new DefaultTransactionDefinition());
        UserDTO user1=new UserDTO();
        UserDTO user2=new UserDTO();
        UserDTO user3=new UserDTO();
        try {
            user1.setId("test@test.com");
            user1.setPw("1111");
            user1.setNickName("tester");
            user2.setId("test1@test.com");
            user2.setPw("1111");
            user2.setNickName("tester1");
            user3.setId("test@test.com");
            user3.setPw("1111");
            user3.setNickName("tester2");
        
            userService.insertUser(user1);
            userService.insertUser(user2);
            userService.insertUser(user3);
            this.transactionManager.commit(status);
        }catch (RuntimeException e) {
            // TODO: handle exception
            this.transactionManager.rollback(status);
            throw e;
        }
        //UserDTO user4=userService.getUser(user1);
        //assertThat(user2.getId(),is(user1.getId()));
        //userService.deleteUser(user);
    }
cs

1
2
3
4
<!-- Transaction Manager -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
cs

위의 코드를 예로보면 디비가 바뀌게 된다면? 단순히 밑의 XML 설정에서 각 디비에 대한 트랜잭션매니저클래스로 설정만 바꿔주면 별도의 코드변경없이 트랜잭션 기능을 유지해 나갈수 있다.




posted by 여성게
: