🐢 꼬부기 LV.1 | 개념•기초/💧물대포(핵심개념)

트랜잭션 이해하기

서화 2026. 2. 2. 12:48

📌트랜잭션이란 하나의 작업단위를 말한다

공통로직이기때문에 AOP라고도 할수 있고 @Transactional을 사용하여 적용할수있다

어노테이션을 사용하기 전에 먼저 트랜잭션의 구조를 먼저 살펴보자

✔️트랜잭션의 구조를 이해하기 위한  xml 설정

스프링 부트없이 트랜잭션을 사용하기 위해서는 xml에 트랜잭션 스키마 설정을 먼저 해주어야한다

스키마를 추가 했다면 트랜잭션을 처리할 트랜잭션 매니져가 필요한데 트랜잭션매니져는 객체이므로 <bean>클래스를 통해 만들어줘야한다

이때 세터 주입을 사용하여 데이터 소스를 받아오는데 이 데이터 소스는

 <bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource" destroy-method="close">
         <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
         <property name="url" value="jdbc:mysql://localhost:3306/데이터베스명" />
         <property name="username" value="계정명" />
         <property name="password" value="비번" />
   </bean>

DB를 연결한 데이터 소스이다 

트랜잭션을 사용하기 위해서는 

  1. 포인트컷(핵심관심) 설정
  2. 어드바이스(횡단관심) 설정
  3. 애스팩트 설정(핵심관심과 횡단관심을 어떻게 엮을지)

위의 세가지를 모두 설정해야한다 

포인트컷 설정 

기존의 포인컷 설정과 같다

  <aop:pointcut expression="execution(* com.example.biz..*(..))" id="txPointcut"/>

어드바이스 설정

  <tx:advice id="txAdvice" transaction-manager="txManager">
         <tx:attributes>
            <tx:method name="get*" read-only="true" />
            <tx:method name="*" />
         </tx:attributes>
   </tx:advice>

여기서<tx:attributes>에서 메서드에따른 실행을 정할수있는데  get으로 시작하는 메서드는 읽기전용으로 설정하고 나머지 기능들은 실행해달라는 설정을 해두었다

애스팩트 설정

여기서 어드바이저란 스프링에서 지원하는 애스팩트의 이름이 어드바이저인것으로 애스팩트와 동일한 뜻이다

   <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />

📌정리

트랜잭션을 사용하기 위해서는 스키마와 데이터소스가 필요하고 포인트컷 설정과 어드바이스 설정 애스팩트 설정이 필요하다

✔️스프링 부트에서 @Transactional 사용하기

실습을 위해 멤버인서트에 @Transactional을 사용해보았다  트랜잭션은 사용하려는 메서드 위에 선언할수 있으며

설정 충돌을 방지하기 위해 xml에 있는 트랜잭션 사용설정을 모두 주석처리해준다

@Override
	@Transactional // 트랜잭션 == 하나의 작업단위 ★
	public boolean insertMember(MemberDTO dto) {
		memberDAO.insertMember(dto);
		return true;
	}

인서트멤버에 인서트가 하나만 잇을때는 문제없이 작동한다

@Override
	@Transactional // 트랜잭션 == 하나의 작업단위 ★
	public boolean insertMember(MemberDTO dto) {
		memberDAO.insertMember(dto);
		memberDAO.insertMember(dto);
		return true;
	}

이렇게 인서트를 두개넣어서 실행시키고자 한다면 한개는 DB에 저장되어 있어야 하는것이 정상이다 왜냐하면 앞에서 정상작동한것을 확인했기때문이다 

하지만 DB를 확인하면 인서트가 실행되지 않은것을 볼수 있고 진행되지 않은 이유로는 동일한 pk로 인한 중복때문이다

트랜잭션이란 이렇게 해야할 일이 한개라도 에러가 생기게 되면 그 행동 자체를 실행하지 않는데 이것을 롤백이라고 한다

또한 트랜잭션이 정상적으로 실행된것을 커밋이라고 한다 

이렇게 @Transactional을 선언한 메서드를 하나의 작업단위라고 표시하며 트랜잭션을 사용하고 싶은 메서드마다 사용해야한다

트랜잭션의  사용범위는 컨트롤러,DAO,서비스에 무리없이 사용되지만 서비스에 사용하는것이 하나의 작업단위를 만들기 좋고 또 서비스에  사용하는것으로 추천을 해준다