뜌릅

Audit Logging Column이 생성되지 않는 경우 (키중복 save) 본문

SPRING

Audit Logging Column이 생성되지 않는 경우 (키중복 save)

TwoCastle9 2023. 6. 21. 16:15
반응형

 

 

https://twocastle9.tistory.com/64 해당 문서를 먼저 보고 오시는걸 강력 추천합니다. 아니면 이해 못합니다.

해당 문서에서의 에러를 좀더 설명하자면,

총 9개에서 sql nullConstraint 위반으로 실패

위의 에러가 왜 실패하였는지 궁금할 것입니다. 

 

attributes: {timestamp=Fri Jun 16 14:45:49 KST 2023, status=500, 
error=Internal Server Error, 
message=could not execute statement; 
SQL [n/a]; constraint [null]; 
nested exception is org.hibernate.exception.ConstraintViolationException: 
could not execute statement, path=/receipt}


에러의 로그는 위와 같습니다.

어디서 저 에러가 발생한건지 좀더 명확한 에러로그를 찾아보니

com.microsoft.sqlserver.jdbc.SQLServerException: 테이블 'Almighty_99997.dbo.MDCL_INFO', 
열 'ENTR_USER_ID'에 NULL 값을 삽입할 수 없습니다.
열에는 NULL을 사용할 수 없습니다. UPDATE이(가) 실패했습니다.


가 나옵니다.


여기서 ENTR_USER_ID가 뭘까요?

@CreatedBy이 뭔지 아실거라 생각하겠습니다.

바로 AuditLogging을 통하여 스프링부트의 내부 라이브러리가 생성을 할때마다 만들어주는 컬럼입니다. DB에는 not Null이지만 null로 들어갔다는 것이죠.

com.microsoft.sqlserver.jdbc.SQLServerException: 테이블 'Almighty_99997.dbo.MDCL_INFO',
열 'ENTR_USER_ID'에 NULL 값을 삽입할 수 없습니다.
열에는 NULL을 사용할 수 없습니다. 
UPDATE이(가) 실패했습니다.

을 다시 살펴보면 뜬금없이 UPDATE가 나옵니다. UPDATE여서 당연히 @CreatedBy 어노테이션이 작동안하는건 당연하고, 근데 이미 DB값에 존재해야 했었는데, 왜 null로 들어갔을까?? 의문이 드실겁니다.

그 이유는 API로직을 살펴보면 해당 쿼리는 CREATE API인것에서 찾을 수 있었습니다. 근데, 첫번째 쿼리가 DB에 먼저 저장되어서 ORM은 UPDATE로 쿼리가 동작한것입니다. 그리고 @CreatedBy는 작동하지 않았고, null이 되어서 실패한것입니다.

이 에러들은 키 중복하여 쓰레드를 사용하여 동시다발적으로 SAVE하게 되는 경우에 생기는 에러라고 생각합니다.

반응형