인프런 커뮤니티 질문&답변

새벽형개발자님의 프로필 이미지

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

트랜잭션 적용 위치

controller에 @Transactional은 안되나요?

23.09.10 02:47 작성

·

2.2K

0

강의를 다 보고 따로 찾아보니 @Transactional은 controller가 아닌 service에서 사용해야되고 controller에서 사용하게 되면 트랜잭션이 적용이 안된다고 하길래 직접 해봤습니다. controller의 메소드에 @Transactional을 붙여서 로직을 실행시켜보니 변경감지가 일어나서 update 쿼리가 날라가는 것을 확인하였는데 이러면 트랜잭션을 통해서 변경감지가 일어난 것 아닌가요?

답변 1

0

인프런 AI 인턴님의 프로필 이미지

2023. 09. 12. 02:51

안녕하세요, 인프런 AI 인턴이에요.

@Transactional 어노테이션은 주로 Service 계층에서 사용되는 것이 일반적입니다. 트랜잭션은 여러 개의 데이터베이스 작업을 하나로 묶어서 일관성을 보장하고, 롤백이 가능하도록 해줍니다.

@Transactional 어노테이션을 Controller에 사용하는 것은 권장되지 않는데, 그 이유는 다음과 같습니다.

  1. Controller는 사용자의 요청을 받아 처리하는 역할을 맡기 때문에, 비즈니스 로직을 담고 있지 않아야 합니다. 따라서 트랜잭션을 사용할 필요가 없는 경우가 많습니다.

  2. Controller에서 트랜잭션을 사용하면, 데이터베이스와의 연결을 유지한채로 사용자의 요청 처리를 기다리게 됩니다. 이는 효율성과 확장성에 부정적인 영향을 줄 수 있습니다.

대신, 비즈니스 로직을 처리하는 Service 계층에서 @Transactional 어노테이션을 사용하여 트랜잭션 처리를 하도록 권장합니다. Service 계층에서 트랜잭션 안에서 여러 개의 데이터베이스 작업을 처리하면, 모든 작업을 성공적으로 완료하거나 실패했을 때 롤백이 가능합니다.

변경 감지가 일어난 경우, 이는 JPA(Entity Manager)에서 자동으로 이루어진 것입니다. 트랜잭션 안에 있는 일련의 작업들이 하나의 단위로 묶여있으므로, JPA는 트랜잭션의 종료 시점에 변경 감지를 실행하고, 변경 사항을 데이터베이스에 반영합니다.

정리하면, @Transactional 어노테이션은 Controller에서 사용하는 것은 권장되지 않습니다. 대신 비즈니스 로직을 처리하는 Service 계층에서 사용하면 트랜잭션 처리 및 롤백 기능을 보다 안정적으로 사용할 수 있습니다.

더 궁금한 점이 있다면, 인프런 고객센터로 문의해주시면 자세한 도움을 받으실 수 있습니다. 감사합니다.