-
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은 하나의 메소드가 하나의 데이터베이스 트랜잭션 범위 안에서 실행되어야 한다
해당 애노테이션을 메소드에 적용하면 메소드가 실행되는 시점에 트랜잭션이 시작되고 성공적으로 종료가 되면 커밋, 실패하면 롤백을 수행한다.
왜 쓸까?
여러 작업의 흐름을 안정적으로 처리하기 위해서 쓴다. 다시 말해서 데이터의 일관성을 유지하기 위함이다.
자 대충 이유를 알았으니, 다시 피드백을 살펴보자.
트랜잭션은 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 논리적인 작업 단위라고 했다.
현재 내가 작성한 코드도 어떻게 보면 하나의 그룹이긴하다. 조회 후 삽입이니..
하지만 너무 단순한 로직이기 때문에 트랜잭션을 사용한다는 것은 리소스 낭비가 될 수 있다는 것이였다.
내가 작성한 용도보단 다음과 같은 예시가 조금 더 트랜잭션과 어울릴 것 같다.
- 예를 들어 유저 계좌를 조회하고 돈이 있는지 체크 후 다른 계좌에 입금하고 돈을 차감하는 로직이 있을 때
- 돈을 차감한다는 작업에서 오류가 발생하면 이전 작업이 롤백되어야 하니 이런 경우에 트랜잭션을 사용해야 한다.
- 결과적으로 이러한 맥락으로 여러 작업 흐름을 안정적으로 처리하기 위해 쓰는 것이 트랜잭션이다.
'개발 일지' 카테고리의 다른 글
서버 도메인 없이 EC2 서버에 https 적용하기 (0) 2024.09.07 메소드 오버라이딩시 super 키워드 조심하기 (0) 2024.08.16 @Bean vs @Component (0) 2024.08.16 동일한 bean으로 등록되는 문제 (0) 2024.06.27 JpaSystemException (0) 2024.06.27