반응형

전자정부프레임워크에서 트랜잭션(Transaction)을 처리하는 방법을 학습합니다. 트랜잭션은 데이터베이스의 상태를 일관되게 유지하기 위해 반드시 필요한 개념으로, 여러 작업을 하나의 작업 단위로 묶어 처리하는 역할을 합니다.


1. 트랜잭션이란?

**트랜잭션(Transaction)**은 데이터베이스에서 논리적 작업 단위를 의미하며, 다음 네 가지 속성을 가집니다(ACID):

  1. Atomicity(원자성): 트랜잭션 내 모든 작업이 성공하거나 모두 실패해야 합니다.
  2. Consistency(일관성): 트랜잭션 완료 후 데이터는 항상 일관성 있는 상태여야 합니다.
  3. Isolation(고립성): 트랜잭션 수행 중 다른 트랜잭션의 영향을 받지 않아야 합니다.
  4. Durability(영속성): 트랜잭션 완료 후 변경된 데이터는 영구적으로 저장됩니다.

2. 전자정부프레임워크에서 트랜잭션 처리 방식

전자정부프레임워크는 Spring 프레임워크의 트랜잭션 관리 기능을 기본적으로 제공합니다. 이를 통해 XML 기반 설정어노테이션 방식을 사용하여 트랜잭션을 쉽게 관리할 수 있습니다.


3. XML 기반 트랜잭션 설정

3-1. 트랜잭션 설정 추가

src/main/resources/egovframework/spring/context-transaction.xml:

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

3-2. application-config.xml에 트랜잭션 설정 추가

application-config.xml 파일에서 위에서 작성한 트랜잭션 설정 파일을 참조합니다.

<import resource="classpath:/egovframework/spring/context-transaction.xml" />

4. 어노테이션 기반 트랜잭션 처리

4-1. Service 클래스에 트랜잭션 어노테이션 추가

트랜잭션 처리는 주로 Service 계층에서 수행됩니다.

@Service("userService")
public class UserServiceImpl implements UserService {
    @Resource(name = "userDAO")
    private UserDAO userDAO;

    @Override
    @Transactional
    public void createUser(UserVO user) throws Exception {
        userDAO.insertUser(user);
        userDAO.updateUserRole(user.getUserId(), "ADMIN");
    }
}

4-2. 주요 어노테이션

  • @Transactional: 트랜잭션 처리를 명시하며, 메서드 단위 또는 클래스 단위에 적용 가능합니다.
  • rollbackFor: 특정 예외 발생 시 롤백할 예외 타입을 지정합니다.
  • readOnly: 읽기 전용 트랜잭션임을 명시하여 성능 최적화를 지원합니다.

5. 트랜잭션 테스트

5-1. Controller 코드

트랜잭션 적용 여부를 확인하기 위해 간단한 Controller를 작성합니다.

@Controller
public class UserController {
    @Resource(name = "userService")
    private UserService userService;

    @RequestMapping("/createUser.do")
    public String createUser(@RequestParam("id") String userId, @RequestParam("name") String userName) throws Exception {
        UserVO user = new UserVO();
        user.setUserId(userId);
        user.setUserName(userName);
        userService.createUser(user);

        return "redirect:/userList.do";
    }
}

5-2. 테스트 시나리오

  1. createUser.do 요청을 보냅니다.
  2. 트랜잭션 내부에서 insertUser와 updateUserRole 작업이 모두 성공하면 데이터가 반영됩니다.
  3. 하나의 작업에서 예외가 발생하면 롤백되어 데이터베이스 상태가 이전과 동일하게 유지됩니다.

6. 트랜잭션 적용 시 주의사항

  1. Service 계층에서만 트랜잭션 처리: DAO나 Controller에서 트랜잭션을 처리하지 않습니다.
  2. Exception 처리: 트랜잭션이 롤백되도록 반드시 unchecked exception(RuntimeException)을 사용하거나 설정을 추가해야 합니다.
  3. Nesting(중첩 트랜잭션): 트랜잭션 내에서 추가 트랜잭션이 필요하면 적절한 전파 수준을 설정합니다.

7. 마무리

이번 시간에는 전자정부프레임워크에서 트랜잭션을 설정하고 어노테이션을 활용하는 방법을 학습했습니다. 트랜잭션은 데이터의 안정성을 보장하기 위해 필수적인 기능이므로, 올바른 설정과 구현이 필요합니다.

다음에서는 로그 기능 구현을 통해 전자정부프레임워크의 공통 기능을 살펴보겠습니다.

반응형

+ Recent posts