결론부터 말씀드리면 “네, signup에만 붙여도 기능적으로는 전혀 문제없습니다.” 읽기 로직(signin)에는 @Transactional이 없어도 데이터를 가져오는 데는 아무런 지장이 없습니다.

하지만, 김영한 님을 포함해 **대부분의 고수들이 “읽기 전용 트랜잭션(readOnly=true)을 클래스 전체에 거는 방식”을 선호하는 확실한 이유(성능)**가 있습니다.

딱 2가지 핵심 이유로 정리해 드릴게요.


1. 왜 읽을 때도 Transaction을 걸어야 해요? (성능 & 최적화)

“데이터를 바꾸지도 않는데 왜 트랜잭션을 걸지? 낭비 아닌가?”라고 생각하기 쉽습니다. 하지만 @Transactional(readOnly = true)를 붙이면 스프링과 JPA가 “읽기 모드”로 최적화를 해서 더 빨라집니다.

① 스냅샷을 안 만듭니다 (메모리 절약) ⚡️

  • 원래 JPA는: 데이터를 조회할 때, 나중에 수정될지 모르니까 **“원본 복사본(스냅샷)“**을 하나 몰래 만들어 둡니다. 나중에 비교(Dirty Checking)해야 하거든요.

  • readOnly를 켜면: “아, 이거 어차피 안 고치겠구나?” 하고 복사본을 안 만듭니다. 메모리를 덜 쓰고 과정이 단순해집니다.

② 변경 감지를 안 합니다 (CPU 절약) ⚡️

  • 원래 JPA는: 트랜잭션이 끝날 때 “뭐 바뀐 거 없나?” 하고 데이터를 일일이 비교합니다.

  • readOnly를 켜면: 이 비교 과정을 아예 생략합니다. 당연히 속도가 빨라지겠죠?

👉 결론: 읽기 전용 트랜잭션을 안 붙여도 돌아는 가지만, 붙이면 공짜로 성능이 좋아집니다. 그래서 붙이는 겁니다.