충격 실화
시작은 카테고리 여러개 requestparam으로 받기...
defaultvalue 줄 때 "healing, culture, active" 이렇게 띄어쓰기 해놨더니 안 되는 거 같아서 띄어쓰기 없애고 테스트 해봤는데 조회가 여전히 안 되어서 같은 사용자 아이디로 미팅 포스트 더미 데이터를 더 추가해보려고 했다.
근데 java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'meeting_applier.UK_afmlyepcgg8bmobnq6l8gt7m' 예?
내 meeting_applier에 UK_afmlyepcgg8bmobnq6l8gt7m라는 키가 있다구요?
저... 제 meeting_applier는 userId랑 isNative같은 거 가지고 있는 아주 작고 순한 아인데요...
검색해보니 저게 유니크 키고, 그 유니크 키의 제약조건을 내가 어겼대...
1. 저게 뭐길래 난데없이 내 테이블에 나타나서 유니크 키래
2. 근데 그걸 심지어 내가 어겼대 뭘 건드렸는데
(참고: MySQL 기준)
테이블에 있는 유니크 키를 확인하려면
SELECT
DISTINCT CONSTRAINT_NAME,
TABLE_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
TABLE_SCHEMA = 'your_database_name' -- 데이터베이스 이름 지정
AND TABLE_NAME = 'your_table_name' -- 테이블 이름 지정
AND CONSTRAINT_NAME <> 'PRIMARY';
오...
행 여러개에 걸쳐 조회한 테이블에 있는 모든 constraint_name이 나왔다.

여전히 무슨 소린지 모르겠다.
이건 뭔가 암호화가 된거라기보다 MySQL에서 자동으로 생성한 거라는 어떤 선생님의 발언이 있었다.
고유한 제약 조건 이름을 지어준거래.
이게 무슨 키인지 알아내는 쿼리를 알아왔다.
SELECT
kcu.TABLE_NAME,
kcu.COLUMN_NAME,
tc.CONSTRAINT_TYPE
FROM
information_schema.KEY_COLUMN_USAGE AS kcu
JOIN
information_schema.TABLE_CONSTRAINTS AS tc
ON kcu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
AND kcu.TABLE_SCHEMA = tc.TABLE_SCHEMA
WHERE
kcu.CONSTRAINT_NAME = 'UK_afmlyepcgg8bmobnq6l8gt7m'
AND kcu.TABLE_SCHEMA = 'your_database_name'; -- 여기서 'your_database_name'을 실제 데이터베이스 이름으로 변경
저 복잡하고 긴 유니크 키는 user_id랑 매칭되는 애였다.
겨우 user_id 일 거면서 날 이렇게까지 서럽게 하다니
user_id에 대한 제약 조건을 삭제하면 user 당 여러개의 meeting applier를 생성하는 게(여러 meeting post에 참가하는 게) 가능하다.
그러나 한 meeting post에도 여러번 참가할 수 있게 된다.
그건 원하지 않아...
이걸 해결하려면 user_id와 meeting_post_id를 둘 다 포함하는 복합 유니크 키를 만들면 된다!
그거 만드는 방법
@Table(name = "중간엔티티이름", uniqueConstraints = { @UniqueConstraint(columnNames = {"부모엔티티1_id", "부모엔티티2_id"}) }) 이걸 추가해주면 된다.
@Entity
@Table(name = "중간엔티티이름", uniqueConstraints = {
@UniqueConstraint(columnNames = {"부모엔티티1_id", "부모엔티티2_id"})
})
@Getter
@Setter
public class 중간엔티티이름 {}
요렇게 적용!