오류와의 싸움기 흙 흙 ㅠㅡㅠ

2023. 9. 20. 20:48
728x90

돌아가며  HTTP Status 500 오류가 났다. 

 

1) DataIntegrityViolationException

## Cause : java.sql.SQLSyntaxErrorException: ORA-00911: invalid character

2) DuplicateKeyException

## Cause : java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (HR.SYS_C007071) violated

3) DataIntegrityViolationException

## Cause : java.sql.SQLIntegrityConstraintViolationException: ORA-02291: integrity constraint (HR.SYS_C007073) violated - parent key not found

1) DataIntegrityViolationException
2) DuplicateKeyException
3)  DataIntegrityViolationException

 

 

하ㅏㅏㅏ... 어제 오후부터 오류가 났는데 

NCT 멤버 insert하는 삽입 SQL문을 넣고나서부터 였다.

일단 되는대로 모든 방법을 동원해서 넣었는데도 계속 오류가 났다. 이렇게도 바꾸고 저렇게도 바꾸고 했는데도 여전히..

그리고 오늘도... 하... 

지피티 친구에게도 물어봤는데 몰라서인지 뭔지 ...(?) 너도 모르는게 있니? 

무튼 계속 고쳐도 오류가 났다...

 

mapper.xml 파일에서의 SQL 쿼리문은 이렇다. 

>> 상황 판단 :

  • 한 엔시티 멤버는 > 여러 그룹에 소속되어 있다. 그래서 엔시티 그룹 테이블을 생성했다.
  • 엔시티 그룹 테이블은 groupId, groupName, memberRefId로 구성되어 있다. (memberRefId는 엔시티 멤버 테이블에서 외래키로 가져옴)
  • 엔시티 멤버 DTO는 엔시티 멤버테이블의 컬럼과 + 엔시티 그룹 테이블의 그룹이름으로 생성. 
  • 그러므로 INSERT문을 쓸 때에 두 개의 테이블에 인서트를 한다. 이 때 memberRefId가 중요한데, 전에 nctmembers 테이블에 넣은 값으로 가져오기 위해서 SEQ.CURRVAL을 가져옴
<!-- Insert member -->
<insert id="insertMember">
   INSERT INTO nctmembers (memberId, name, birthdate, nationality, position, mbti, image, regdate)
   VALUES (NCTMEMBERS_SEQ.NEXTVAL, #{name}, #{birthdate}, #{nationality}, #{position}, #{mbti}, #{image}, SYSDATE)
</insert>

<!-- Insert groups for member -->
<insert id="insertGroupsForMember">
   <foreach collection="groupList" item="group" index="index" separator=",">
       INSERT INTO nctgroups (groupId, groupName, memberRefId)
       VALUES (NCTGROUPS_SEQ.NEXTVAL, #{group}, NCTMEMBERS_SEQ.CURRVAL)
   </foreach>
</insert>

 

1차시도) nctgroups 테이블에 column  groupName이 UNIQUE로 제약조건이 걸려있었다. > 어 이상한데? 하고 

UNIQUE 제약조건 빼고 다시 생성.

CREATE TABLE nctgroups (
    groupId NUMBER PRIMARY KEY,
    groupName VARCHAR2(255) UNIQUE,
    memberRefId NUMBER,
    FOREIGN KEY (memberRefId) REFERENCES nctmembers(memberId)
);

>>
CREATE TABLE nctgroups (
    groupId NUMBER PRIMARY KEY,
    groupName VARCHAR2(255),
    memberRefId NUMBER,
    FOREIGN KEY (memberRefId) REFERENCES nctmembers(memberId)
);

 

2차시도) 시퀀스가 뭔가 문제가 있는건가?... 하다 찾아보니까 open = "INSERT ALL" close = "SELECT * FROM DUAL"구문을 추가하라고 하여 수정.

<!-- Insert member -->
<insert id="insertMember">
   INSERT INTO nctmembers (memberId, name, birthdate, nationality, position, mbti, image, regdate)
   VALUES (NCTMEMBERS_SEQ.NEXTVAL, #{name}, #{birthdate}, #{nationality}, #{position}, #{mbti}, #{image}, SYSDATE)
</insert>

<!-- Insert groups for member -->
<insert id="insertGroupsForMember">
   <foreach collection="groupList" item="group" open="INSERT ALL" close="SELECT * FROM DUAL">
       INTO nctgroups (groupId, groupName, memberRefId)
       VALUES (NCTGROUPS_SEQ.NEXTVAL, #{group}, NCTMEMBERS_SEQ.CURRVAL)
   </foreach>
</insert>

그래도 안된다.. 자꾸 이유는 똑같이 DB상에서 무결성 제약 조건에 걸린다는 것.....

 

미친듯이 구글링하다가  누군가의 문제점이 올라온 코드를 보았다

나랑 똑같은 오류다.. > 결국 무결성 제약조건에 걸리는 건 시퀀스가 들어갈 때! 문제 였다. 

감사하게도  요렇게 댓글을 달아두셔서 해결방법을 고대로 따라해보았다.  + 그래도 해결안되어서 처음 멤버 정보 입력 시에 useGeneratedKeys = "true" keyProperty = "id" keyColumn = "memberId" 구문을 추가해서 

아래의 인서트문에서는 id 네이밍을 활용했다.

<!-- Insert member -->
<insert id="insertMember" useGeneratedKeys="true" keyProperty="id" keyColumn="memberId">
   INSERT INTO nctmembers (memberId, name, birthdate, nationality, position, mbti, image, regdate)
   VALUES (NCTMEMBERS_SEQ.NEXTVAL, #{name}, #{birthdate}, #{nationality}, #{position}, #{mbti}, #{image}, SYSDATE)
</insert>

<!-- Insert groups for member -->
	<insert id = "insertGroupsForMember" parameterType = "java.util.List">
		INSERT INTO nctgroups (groupId, memberRefId, groupName) 
		SELECT NCTGROUPS_SEQ.NEXTVAL, #{id}, A.* FROM (
		<foreach collection = "groupList" item = "group" separator = "UNION ALL">
			SELECT #{group} FROM DUAL
			</foreach>) A
	</insert>

드디어 해결~~~~~~~~~~~~~~~~

foreach문은 결국 group에만 적용되도록 하고, union all로 한번에 insert가 되도록 한다...

 

나중에 트러블슈팅 필수

728x90

'Project > nct club project' 카테고리의 다른 글

[오류] 테이블 참조오류  (1) 2023.10.06
[오류] 서버 인코딩 오류  (0) 2023.10.03
[이미지 업로드 기능] 만들기  (0) 2023.09.19
3rd day of mini project  (0) 2023.09.15
2nd day of mini project  (0) 2023.09.14

BELATED ARTICLES

more