다음과 같이 Parent, Child 두개의 테이블이 존재하고 Parent와 Child가 1:N의 관계를 형성한다고 할때, Parent 테이블의 PK가 Child 테이블에서 FK로 사용되어진다. 아래 그림을 좀 더 자세히 보면 Parent는 0개 이상의 Child와 관계할 수 있고, Child는 반드시 1개의 Parent와 관계해야 하는 제약을 지니는데 이는 즉, parent_seq가 null이 될 수 없음을 의미한다.


 

위 내용은 관계형 데이터베이스 논리 모델링에서 나오는 아주 기초적인 내용이다.


그런데 실제 프로젝트를 진행하다보면 위와 같은 제약조건들을 제대로 지키지 않아 데이터 무결성이 훼손된 경우를 많이 보게 된다. 물론 시스템 퍼포먼스를 위해 의도적으로 비정규화를 수행하는 경우도 많지만, 심지어 모든 테이블에 PK만 존재하고 FK가 전혀 존재하지 않는 경우도 봐왔다. (물론 논리 모델에서는 FK가 존재하지만, 실제 물리 모델에는 FK를 전혀 반영하지 않은 경우이다) 필자는 아직 경험이 일천해 모든 관계형 데이터베이스 전문 서적에서 FK 제약조건에 대해 지켜야 한다고 나와있지만 , 실제 현업에서는 이런식의 데이터베이스 설계가 존재하는지 정확한 이유는 모른다. 아마도 제약조건에 따른 데이터 관리의 까다로움과 퍼포먼스 저하에 대한 우려 때문에 그런것이 아닌가 하고 추측만할 뿐이다.


어찌되었든 제약조건이 정상적으로 걸어져 있다면 Child 테이블에 parent_seq가 0을 가지는 row는 절대 insert될수가 없다. 

그러나 많은 데이터베이스 설계들이 이런 제약조건을 제대로 지키지 않고 있기 때문에 parent_seq가 0인 row가 insert되고 해당 Child의 row로부터 seq가 0인 row를 Parent 테이블에서 select 할 수 있는 가능성의 여지를 남겨두게 된다.


자 그럼 본론으로 들어가서 Hibernate를 통해 Child와 Parent Entity를 @ManyToOne 관계로 매핑하고 FetchType을 EAGER로 설정해 join 연산을 수행하게 되면 아래와 비슷한 오류 메세지를 만나게 된다.


org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.orderme.admin.entity.legacy.shop.ShopInfo#0] 


위와 같은 문제를 해결하기 위해 @NotFound 어노테이션을 사용할 수 있다.


 @NotFound(action=NotFoundAction.IGNORE)


식별자 값이 유효하지 않더라도 org.hibernate.ObjectNotFoundException 를 발생시키지 않고 무시한다. 


하지만 이게 과연 좋은 방법인가에 대해서는 고민을 해봐야한다. 위와 같은 조치를 통해 예외를 무시할 경우 데이터 무결성을 훼손시키는 데이터가 어딘가에 존재하고 있는데 그것을 인지할 수 있는 수단을 무시하는 것과 같기 때문이다.


커뮤니티에서도 이와 같은 문제를 지적하는 글을 찾을 수 있었다. 

https://forum.hibernate.org/viewtopic.php?f=1&t=1007085


현재 사용중인 Hibernate 버전은 3.6.10.Final 인데 아직 NotFoundAction의 옵션으로 IGNORE, EXCEPTION 2개만 제공하고 있는 것으로 보이며, 아직까지 해당 이슈에 대한 어떠한 조치는 없는 것 같다.

'프로그래밍 > 오픈소스' 카테고리의 다른 글

spring-data에서 redis 사용하기  (0) 2012.12.06
Hibernate @NotFound 어노테이션  (0) 2012.12.05
이클립스에 GlassFish 설치하기  (0) 2011.02.17
SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
Posted by devop

댓글을 달아 주세요