개발 일지

DB 작업시 @Transactional는 항상 써야할까?

apple-tree 2024. 6. 28. 03:35

 

Member, Staff 도메인을 개발하던 중 팀원분이 내 코드에 대한 피드백을 남겨주셨다

@Service
@RequiredArgsConstructor
public class MemberService {

	private final MemberRepository memberRepository;

	@Transactional
	public MemberEntity findOrCreateMember(String cookieValue) {

		return memberRepository.findById(cookieValue).orElseGet(() -> {
			MemberCreate memberCreate = MemberCreate.builder()
				.id(cookieValue)
				.role(RoleType.ANONYMOUS)
				.build();
			return memberRepository.save(memberCreate.toEntity());
		});
	}

}

요청으로 넘어온 쿠키값이 DB에 존재하는 경우 값을 가져오고 없다면 DB에 저장하는 로직이다.

 

저장하는 부분에서 데이터베이스의 상태를 변화시킨다고 판단하여 해당 메소드에 @Transactional을 붙혀줬지만, 다음과 같은 피드백을 주셨다.

 

 

그래서 @Transactional과 관련된 내용을 조금 더 찾아보기로 했다!

우선 트랜잭션에 대해서 좀 알아보자

Transaction?

데이터베이스 내에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 논리적인 작업 단위이다.

여러 개의 명령어의 집합이 정상적으로 처리되면 정상 종료되며 하나라도 잘못되면 전체 취소가 된다.

@Transactional

Spring Boot 에서 @Transactional은 하나의 메소드가 하나의 데이터베이스 트랜잭션 범위 안에서 실행되어야 한다

해당 애노테이션을 메소드에 적용하면 메소드가 실행되는 시점에 트랜잭션이 시작되고 성공적으로 종료가 되면 커밋, 실패하면 롤백을 수행한다.

왜 쓸까?

여러 작업의 흐름을 안정적으로 처리하기 위해서 쓴다. 다시 말해서 데이터의 일관성을 유지하기 위함이다.

자 대충 이유를 알았으니, 다시 피드백을 살펴보자.

 

트랜잭션은 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 논리적인 작업 단위라고 했다.

현재 내가 작성한 코드도 어떻게 보면 하나의 그룹이긴하다. 조회 후 삽입이니..

 

하지만 너무 단순한 로직이기 때문에 트랜잭션을 사용한다는 것은 리소스 낭비가 될 수 있다는 것이였다.

내가 작성한 용도보단 다음과 같은 예시가 조금 더 트랜잭션과 어울릴 것 같다.

  1. 예를 들어 유저 계좌를 조회하고 돈이 있는지 체크 후 다른 계좌에 입금하고 돈을 차감하는 로직이 있을 때
  2. 돈을 차감한다는 작업에서 오류가 발생하면 이전 작업이 롤백되어야 하니 이런 경우에 트랜잭션을 사용해야 한다.
  3. 결과적으로 이러한 맥락으로 여러 작업 흐름을 안정적으로 처리하기 위해 쓰는 것이 트랜잭션이다.

'개발 일지'의 다른글

  • 현재글 DB 작업시 @Transactional는 항상 써야할까?

관련글