controller에 @Transactional은 안되나요?
3673
작성한 질문수 8
강의를 다 보고 따로 찾아보니 @Transactional은 controller가 아닌 service에서 사용해야되고 controller에서 사용하게 되면 트랜잭션이 적용이 안된다고 하길래 직접 해봤습니다. controller의 메소드에 @Transactional을 붙여서 로직을 실행시켜보니 변경감지가 일어나서 update 쿼리가 날라가는 것을 확인하였는데 이러면 트랜잭션을 통해서 변경감지가 일어난 것 아닌가요?
답변 1
0
안녕하세요, 인프런 AI 인턴이에요.
@Transactional 어노테이션은 주로 Service 계층에서 사용되는 것이 일반적입니다. 트랜잭션은 여러 개의 데이터베이스 작업을 하나로 묶어서 일관성을 보장하고, 롤백이 가능하도록 해줍니다.
@Transactional 어노테이션을 Controller에 사용하는 것은 권장되지 않는데, 그 이유는 다음과 같습니다.
Controller는 사용자의 요청을 받아 처리하는 역할을 맡기 때문에, 비즈니스 로직을 담고 있지 않아야 합니다. 따라서 트랜잭션을 사용할 필요가 없는 경우가 많습니다.
Controller에서 트랜잭션을 사용하면, 데이터베이스와의 연결을 유지한채로 사용자의 요청 처리를 기다리게 됩니다. 이는 효율성과 확장성에 부정적인 영향을 줄 수 있습니다.
대신, 비즈니스 로직을 처리하는 Service 계층에서 @Transactional 어노테이션을 사용하여 트랜잭션 처리를 하도록 권장합니다. Service 계층에서 트랜잭션 안에서 여러 개의 데이터베이스 작업을 처리하면, 모든 작업을 성공적으로 완료하거나 실패했을 때 롤백이 가능합니다.
변경 감지가 일어난 경우, 이는 JPA(Entity Manager)에서 자동으로 이루어진 것입니다. 트랜잭션 안에 있는 일련의 작업들이 하나의 단위로 묶여있으므로, JPA는 트랜잭션의 종료 시점에 변경 감지를 실행하고, 변경 사항을 데이터베이스에 반영합니다.
정리하면, @Transactional 어노테이션은 Controller에서 사용하는 것은 권장되지 않습니다. 대신 비즈니스 로직을 처리하는 Service 계층에서 사용하면 트랜잭션 처리 및 롤백 기능을 보다 안정적으로 사용할 수 있습니다.
더 궁금한 점이 있다면, 인프런 고객센터로 문의해주시면 자세한 도움을 받으실 수 있습니다. 감사합니다.
RepositoryTest의 패키지 위치가 domain인 이유
0
30
2
REQUIRES_NEW 해결 방법에 대해서 질문있습니다!!
0
30
1
update()에 사용하는 setter 질문드립니다.
0
48
1
SQL 중심적 개발의 문제점에 대한 질문
0
72
1
혹시 Containing 을 안쓰신 이유가 있을까요?
0
84
2
[공유] 스프링부트 4.x 버전 mybatis 연동
0
176
1
@repository 어노테이션
0
89
3
ItemService
0
58
1
논리 커밋, 물리 커밋 질문드립니다.
0
54
1
내부 트랜잭션 커밋은 필수인가요?
0
57
1
프록시 커넥션 객체를 반환할 때 생성하는건가요?
0
54
1
Transaction readOnly 성능 개선 (김영한님의 대한 감사인사)
2
178
2
JPQL 대신 네이티브 쿼리를 사용해야 하는 경우
0
79
1
@EventListener(ApplicationReadyEvent.class) 관련
0
88
1
트랜잭션 동기화 매니저와 데이터 소스
0
76
1
DB 관련 강의 개설 계획은 없으신건가요?
0
133
2
물리 트랜잭션 과 논리트랜잭션 용어를 맞게 이해한걸까요
0
94
1
스프링 3 버전 이상 rollbackFor 변경된듯요
1
112
1
트랜잭션 전파 질문.
0
87
1
프로젝트 오픈 에러
0
126
1
외부 트랜잭션에서 isNewTransaction이 false로 나오는거에 대해 질문드립니다
0
84
2
같은 스레드를 사용하면 트랜잭션 동기화 매니저는 같은 커넥션을 반환
0
73
1
h2 인메모리 테스트중 예약어 충돌날 경우 대처방법
0
102
1
커스텀aop와 트랜잭션을 같이 사용할때 우선순위에 관한 질문
0
98
2





