• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

init 메서드에 @Transactional

23.08.04 01:29 작성 조회수 274

0

init() 메서드에

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

 

감사합니다.

답변 2

·

답변을 작성해보세요.

1

David님의 프로필

David

2023.08.09

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

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

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

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.08.06

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

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

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

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

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

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

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