JPA

 

 

 

간단한 게시판 프로젝트에서 게시글 수정을 하는 메서드를 호출 하는데 위와 같은 에러가 발생했습니다.

* JPQL을 사용해서 update 쿼리문을 작성했습니다.

 

 

 

구글링을 한 결과 해당 메서드에 @Transactional 어노테이션을 달거나,

Repository에 작성한 JPQL문 위에 @Transactional 어노테이션을 다는 방식으로 해결이 가능했습니다.

 

해당 메서드 위 혹은 JPQL문 위에 트랜잭셔널 어노테이션 기입

 

여기서 왜 @Transactional 어노테이션 의문이 생겼습니다.

구글링을 했지만 해당 내용에대해 명쾌하게 정리되어 있는 글이 없었습니다.

 

그래서 update 쿼리문에서 Transaction 이 필요한 이유를 검색 했습니다.

그 결과 update 문은 해당 테이블의 컬럼의 모든 데이터를 변하게 할 수 있는 강력한 쿼리문이기 때문에,

실수로 작성을 하게되면 엄청난 문제를 초래한다는 내용을 찾게 되었습니다.

 

https://woogie-db.tistory.com/13

 

[MSSQL] 트랜잭션 설명 및 사용법

오늘은 MS-SQL의 UPDATE문을 전체적으로 설명드리겠습니다. UPDATE문 역시 주의해야하는 명령어이므로 꼭 트랜잭션 안에서 사용해야 합니다...... (SELECT문을 제외하고는 대부분 주의가 필요합니다....

woogie-db.tistory.com

 

위 글을 보면 update 발생하는 문제를 방지하기 위해 select문을 먼저 실행 후에 update 쿼리문을 사용하는 방식을 권합니다.

여기서 select 문과 update문을 트랜잭션으로 묶어서 해당 쿼리문을 실행하다 문제가 생기면 롤백하는 것입니다.

 

JPA에서도 이런 문제를 방지하기 위해 update문을 실행하기 전에 select문이 먼저 실행되는 것을 볼 수 있었습니다.

결국 JPA가 우리가 주의해야 할 점들을 알아서 처리해준다는 것을 알게 되었습니다.

 

위 에러를 겪고 고민하고 해결하면서 코딩을 하면서 내가 개선하고 해야할 것들에 대해 정리해봤습니다.

개선할점

  • 결국 JPA를 사용하기 전에 SQL에 대한 공부가 선행 되어야 한다는 것을 느꼈습니다.
  • JPA 사용 시 show-sql 설정을 활용해서 호출하는 쿼리문을 로그에서 확인
    • 호출되는 쿼리문을 보고 하이버네이트의 내부동작에 대해서 공부 필요

 

 

반응형

+ Recent posts