ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DB 작업시 @Transactional는 항상 써야할까?
    개발 일지 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. 결과적으로 이러한 맥락으로 여러 작업 흐름을 안정적으로 처리하기 위해 쓰는 것이 트랜잭션이다.
Designed by Tistory.