Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

@Transactional vs save() 둘 중 어느 것을 사용해야 할까? #2

Open
Yiseull opened this issue Nov 10, 2023 · 2 comments
Open
Assignees

Comments

@Yiseull
Copy link
Owner

Yiseull commented Nov 10, 2023

단건 업데이트를 할 경우 @transactional과 save() 둘 중 어느 것을 사용해야 할까?

업데이트를 해야할 사항이 하나인 경우에 대해서

public void modifyNickname(final Long memberId, final String nickname) {
	final Member member = memberRepository.findById(memberId)
                .orElseThrow(() -> new EntityNotFound(ErrorCode.MEMBER_NOT_FOUND));

	member.changeNickname(nickname);
}

1. @transactional 사용

JPA의 변경 감지를 활용한다. 메서드가 끝난 후에 update 쿼리를 날리기 위해서 메서드에@Transactional을 붙여준다.

@Transactional
public void modifyNickname(final Long memberId, final String nickname) {
	final Member member = memberRepository.findById(memberId)
                .orElseThrow(() -> new EntityNotFound(ErrorCode.MEMBER_NOT_FOUND));

	member.changeNickname(nickname);
}

2. save() 사용

위의 메서드는 여러 update가 수행되지도 않고 하나의 update만 일어나기 때문에 트랜잭션의 범위를 최소화하기 위해서 save() 메서드를 호출한다. save() 메서드 내부에는 @Transactional이 붙어있다.

public void modifyNickname(final Long memberId, final String nickname) {
	final Member member = memberRepository.findById(memberId)
                .orElseThrow(() -> new EntityNotFound(ErrorCode.MEMBER_NOT_FOUND));

	member.changeNickname(nickname);
        memberRepository.save(member)
}
@Yiseull Yiseull added the Spring label Nov 10, 2023
@Yiseull Yiseull self-assigned this Nov 10, 2023
@Yiseull
Copy link
Owner Author

Yiseull commented Nov 16, 2023

@transactional을 써야 한다고 생각한다.

물론 member가 영속성 컨텍스트에서 관리되지 않는다면 save를 사용해야 하지만, 관리되는 경우에 대해서만 생각한다.

  1. save는 객체 관점에서 객체는 자신의 상태를 이미 변경했지만 디비까지도 반영해줘야 한다는 점에서 @transactional보다 객체지향적이지 못하다.
  2. 현재 우리 프로젝트는 단건 변경 로직이 크지 않다. 따라서 트랜잭션의 범위를 최소화 하기 위해 즉, 트랜잭션이 붙잡고 있는 DB 커넥션의 자원을 최소화 하기 위해서 save를 쓰는 것은 @transactional을 사용할 때보다 성능 개선이 없을 것으로 예상한다.
  3. save를 사용한다면 merge를 호출하고 이때 MergeEvent가 발생한다. MergeEvent 이벤트는 준영속 상태인 엔티티를 영속화 하기 위함인데 member는 이미 영속화 상태이기 때문에 불필요한 작업이 일어나는 것이다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant