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

박호정님의 프로필 이미지

작성한 질문수

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

주문 서비스 개발

@Transcational 적용 계층 질문(Controller 계층에서 Repository 계층 직접 접근시)

해결된 질문

작성

·

145

·

수정됨

1

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
어플리케이션 아키텍쳐 강의 내용 설명해주시면서, 영한님께서는 필요에 따라서 Controller 계층에서 Repository 계층에 직접 접근(Service계층을 거치지 않고)하는 것도 유연하게 허용하신다고 하셨는데요.

이런 경우에는 @Transcational 어디 계층에 적용하시는지와 이유가 궁금합니다.


제가 생각해보기로는 Controller 계층은 비즈니스 로직을 처리하는 계층의 개념은 아니니, Repository에 @Transactional을 다는게 적절해보이는데요.

이러면 Controller 계층에서 직접 접근하는 Repository 클래스들만 @Transactional 어노테이션이 붙어있고 Service 계층을 통해서 사용하는 대부분의 Repository들은 @Transactional 이 안 붙어있게되어(Service 계층에 @Transactional을 붙이니) 일관성이 조금 적어지지 않을까 하는 생각도 들기는 하네요.

답변 1

2

안녕하세요. 박호정님, 공식 서포터즈 OMG입니다.

다음 링크(클릭) 의 영한님 답변을 참고해주세요 😀

감사합니다.

박호정님의 프로필 이미지
박호정
질문자

답변 감사합니다~! 공유해주신 영한님 답변 확인했습니다!

 

저는 실용적인 관점에서 컨트롤러에서 단순한 엔티티를 조회할 때 리포지토리를 직접 참조하기도 합니다.
이 경우 궁금해하시는 TX는 크게 2가지 방법으로 해결합니다.

1. 리포지토리 조회 기능에 명시적으로 읽기 트랜잭션을 적용한다.(@Tx(readOnly))

2. 리포지토리 조회 기능에 트랜잭션을 명시하지 않는다.

1번의 경우 리포지토리에서 데이터베이스 커넥션을 획득하고, DB와 트랜잭션을 시작합니다. 이것을 읽기 전용 트랜잭션 사용이라 합니다. (스프링 데이터 JPA는 이 방식을 사용합니다.)

2번의 경우는 트랜잭션을 시작하지 않고, 단순히 커넥션을 획득해서 데이터베이스에 바로 쿼리로 조회를 요청합니다. 이것을 트랜잭션 밖에서 읽기라 합니다. JPA에서 데이터를 변경할 때는 트랜잭션이 필수지만 읽기만 할 때는 트랜잭션이 없어도 동작합니다.

관련해서 자바 ORM 표준 JPA 프로그래밍 책 15.4.2 읽기 전용 쿼리의 성능 최적화 부분을 참고하시면 더 깊이 있는 내용을 이해할 수 있습니다^^