해결된 질문
작성
·
90
·
수정됨
0
안녕하세요 service 관련 코드를 공부하다가 질문이 생겨서 문의드립니다.
제가 지금까지 봤던 코드들은 @Transactional(readOnly = true) 는 Read할 때 사용을 하고 @Transactional은 Read를 제외한 CUD일 때 사용을 한다고 알고있는데, 인터넷을 찾아보니 "모든 CUD 관련 코드에 @Transactional을 무분별하게 사용하면 성능에 저하가 올 수 있다. 트랜잭션은 묶음의 처리입니다. 단건의 INSERT, DELETE, UPDATE 는 Transaction 이 필요하지 않습니다." 라고 블로그에서 보았습니다. 모든 CUD 관련 코드에다가 @Transactional을 붙이면 안되는건가요? 또한 @Transactional(readOnly = true) 는 Read 관련 코드에 붙이는게 필수는 아닌가요? 어떤 방식으로 코드를 짜는게 좋은 코드인지 궁금합니다.
답변 1
1
안녕하세요. kdw0737님, 공식 서포터즈 y2gcoder입니다.
좀 더 경험에 의거해서 말씀드리자면 팀적인 혹은 개인적인 일관된 규칙에 따라 진행하고, 성능적인 부분에서 문제가 생기는 부분에 대해서 변경하는 것이 좋았습니다. 그리고 대부분의 서비스 메서드에서는 @Transactional을 붙여도 상관없는 서비스 로직이 많았고, 간혹 일부 로직은 @Transactional을 제거하는 것을 고려해봤던 것 같습니다!
예를 들어 서비스 단에서 소위 CUD 작업을 하는 부분에 대해서 생각을 해보면, 마냥 DB 관련 작업만 하지 않을 때가 있습니다! 예를 들어 파일 관련 서비스 중 파일을 업로드하는 로직이라고 가정해보겠습니다. 이 때는 내부에서 간단하게 생각해봐도 아래의 두 로직이 필요할 수 있습니다!
파일 저장소에 파일을 업로드
업로드한 파일 메타데이터를 DB에 저장
이 때 서비스단 메서드에 @Transactional 을 걸어버리면, 시간이 오래 걸릴 수 있는 IO 로직인 1번 로직 또한 트랜잭션 내에 들어가게 됩니다. 보통의 경우에는 문제가 발생하지 않을 수도 있으나 저장소에 파일 업로드하는 시간이 길어진다면, 그만큼 해당 로직은 DB 커넥션을 오래 붙잡고 있어야 합니다. DB 관련 요청이 지금 파일 업로드하고 있는 하나만 있다면 모르겠지만, 대부분의 경우에 그렇지 않을 거라 생각합니다 🙂 이러한 점에서는 DB 커넥션을 오래 점유하지 않고 DB 관련 작업에서만 사용할 수 있도록 @Transactional을 제거하는 것도 고려해볼 수 있을 것입니다.
감사합니다.