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

highjune님의 프로필 이미지
highjune

작성한 질문수

실전! Querydsl

조회 API 컨트롤러 개발

init 메서드에 @Transactional

해결된 질문

작성

·

353

0

init() 메서드에

@Transactional 을 넣어주는 이유는 무엇인가요?

 

감사합니다.

답변 2

1

안녕하세요. highjune님, 공식 서포터즈 David입니다.

init 메서드 내에서 발생하는 데이터베이스의 변경을 하나의 단위(트랜잭션)로 묶고 싶기 때문입니다.

예를 들어, 수십 개의 멤버를 저장하는 중간에 오류가 발생하게 된다면, 하나의 트랜잭션으로 묶여 있는 작업들은 롤백처리가 될 수 있습니다. 만약 트랜잭션으로 묶여 있지 않다면, 마지막으로 저장된 데이터까지는 저장이 되었을테고, 그 이후 데이터는 저장되지 않게 됩니다. 그러면, 어디까지 저장되었는지 데이터를 직접 확인 후 그 이후부터 다시 저장하는 과정을 진행하게 됩니다.

감사합니다.

0

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

init() 메서드에 @Transactional 어노테이션을 사용하는 이유는 주로 데이터베이스 초기화나 특정 작업의 동시성을 보장하기 위해서 입니다. @Transactional 어노테이션을 사용하면 해당 메서드에서 일어나는 데이터베이스 작업이 하나의 트랜잭션으로 묶여서 동시성 문제나 데이터 일관성을 관리할 수 있게 됩니다.

init() 메서드는 보통 어플리케이션이나 프레임워크가 로딩되거나 초기화될 때 자동으로 실행되는 메서드입니다. 이 메서드에 @Transactional 어노테이션을 추가하면, 해당 초기화 작업이 단일 트랜잭션 안에서 실행되어 예외가 발생하면 롤백될 수 있고, 데이터 일관성이 유지될 수 있습니다.

또한, init() 메서드에서 데이터베이스 트랜잭션을 사용하는 것은 애플리케이션의 성능을 최적화하는 데 도움이 될 수 있습니다. 여러 개의 데이터베이스 작업을 한 번에 묶어서 실행하므로, 각 작업마다 트랜잭션을 생성하고 커밋하는 오버헤드를 줄일 수 있습니다.

하지만, @Transactional 어노테이션을 init() 메서드에 사용할 때는 주의해야 합니다. init() 메서드는 주로 애플리케이션 로딩 시 한 번만 실행되므로, 해당 메서드에서 발생하는 예외를 처리하는 방법이 명확해야 합니다.

공식적으로는 스프링에서는 init() 메서드에 @Transactional 어노테이션을 사용하지 않는 것을 권장하고 있으며, 대신 트랜잭션 매니저를 이용해서 트랜잭션을 관리하는 방법을 추천하고 있습니다.

더 자세한 내용이 필요하시면, 스프링 프레임워크의 트랜잭션 관리에 대해 찾아보시는 것을 추천드립니다. 감사합니다.

highjune님의 프로필 이미지
highjune

작성한 질문수

질문하기