inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

@Transactional이 필요한곳과 필요없는곳

해결된 질문

336

lllilililll

작성한 질문수 3

0

안녕하세요 service 관련 코드를 공부하다가 질문이 생겨서 문의드립니다.

제가 지금까지 봤던 코드들은 @Transactional(readOnly = true) 는 Read할 때 사용을 하고 @Transactional은 Read를 제외한 CUD일 때 사용을 한다고 알고있는데, 인터넷을 찾아보니 "모든 CUD 관련 코드에 @Transactional을 무분별하게 사용하면 성능에 저하가 올 수 있다. 트랜잭션은 묶음의 처리입니다. 단건의 INSERT, DELETE, UPDATE 는 Transaction 이 필요하지 않습니다." 라고 블로그에서 보았습니다. 모든 CUD 관련 코드에다가 @Transactional을 붙이면 안되는건가요? 또한 @Transactional(readOnly = true) 는 Read 관련 코드에 붙이는게 필수는 아닌가요? 어떤 방식으로 코드를 짜는게 좋은 코드인지 궁금합니다.

java spring 웹앱 spring-boot jpa

답변 1

1

y2gcoder

안녕하세요. kdw0737님, 공식 서포터즈 y2gcoder입니다.

좀 더 경험에 의거해서 말씀드리자면 팀적인 혹은 개인적인 일관된 규칙에 따라 진행하고, 성능적인 부분에서 문제가 생기는 부분에 대해서 변경하는 것이 좋았습니다. 그리고 대부분의 서비스 메서드에서는 @Transactional을 붙여도 상관없는 서비스 로직이 많았고, 간혹 일부 로직은 @Transactional을 제거하는 것을 고려해봤던 것 같습니다!

예를 들어 서비스 단에서 소위 CUD 작업을 하는 부분에 대해서 생각을 해보면, 마냥 DB 관련 작업만 하지 않을 때가 있습니다! 예를 들어 파일 관련 서비스 중 파일을 업로드하는 로직이라고 가정해보겠습니다. 이 때는 내부에서 간단하게 생각해봐도 아래의 두 로직이 필요할 수 있습니다!

  1. 파일 저장소에 파일을 업로드

  2. 업로드한 파일 메타데이터를 DB에 저장

이 때 서비스단 메서드에 @Transactional 을 걸어버리면, 시간이 오래 걸릴 수 있는 IO 로직인 1번 로직 또한 트랜잭션 내에 들어가게 됩니다. 보통의 경우에는 문제가 발생하지 않을 수도 있으나 저장소에 파일 업로드하는 시간이 길어진다면, 그만큼 해당 로직은 DB 커넥션을 오래 붙잡고 있어야 합니다. DB 관련 요청이 지금 파일 업로드하고 있는 하나만 있다면 모르겠지만, 대부분의 경우에 그렇지 않을 거라 생각합니다 🙂 이러한 점에서는 DB 커넥션을 오래 점유하지 않고 DB 관련 작업에서만 사용할 수 있도록 @Transactional을 제거하는 것도 고려해볼 수 있을 것입니다.

 

감사합니다.

OrderServiceTest 상문주문 테스트 시 update 쿼리 문의

0

27

1

sdk 설정 오류

0

68

2

오탈자 - @Transactional

0

63

1

src/test/resources 테스트 경로 문제

0

60

1

상품 등록후 H2 db 출력 순서 바꿀 수 있나요?

0

70

1

MemberRepositoryTest 실행오류

0

90

1

boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)

1

197

2

강의 마지막 QueryDSL 사용 부분 질문있습니다

1

154

2

클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.

0

56

1

도메인 모델 패턴 vs 트랜잭션 스크립트 패턴

0

80

1

기본 생성자

0

67

1

h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.

0

107

1

멤버서비스테스트 부분에서 막힙니다.

0

174

4

실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?

0

124

1

초반에 h2 다운로드 과정 꼭 필요한가요?

0

129

2

자신 필드에도 get으로 접근하는 이유가 있을까요?

0

122

1

24분 27초 연관관계 편의 메서드 위치

0

118

1

단건 주문만 가능하게 한건 의도한 부분이신가요?

0

114

2

빌드 툴, Gradle

0

65

1

h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다

0

82

2

Repository에서 EntityManager 주입 방식 차이

0

97

1

롬복과 사용자 정의 setter 메서드

0

78

1

주문 목록 조회 fetch join 질문드립니다

0

91

1

dirty checking 질문드립니다.

0

87

1