data.sql 중복 insert 에러 해결

ssongyi·4일 전
0

🐛 트러블슈팅

  • 문제: 애플리케이션 실행 시 users.neighborhood_id 컬럼에 unique constraint violation 에러 발생
    • 원인: 기존 DB 데이터와 data.sql 내 INSERT 데이터가 중복됨 (초기화 쿼리 누락)
  • 해결:
    • data.sql 상단에 DELETE FROM 구문 추가하여 기존 데이터 초기화 후 INSERT 진행
    • FK 관계를 고려하여 삭제 순서: comments → posts → groups → users → neighborhoods

에러 로그:

ERROR: duplicate key value violates unique constraint "users_neighborhood_id_key"
Detail: Key (neighborhood_id)=(1) already exists.

—> users 테이블에 (neighborhood_id) 컬럼에 unique 제약조건이 걸려있는데 → 중복 값이 들어갔다

원인:

👉 현재 data.sql 에 DELETE FROM 이 없음 → 기존 데이터가 남아 있음 → 새로 insert 시도 → 중복 에러 발생

왜 중복으로 들어갔을까..?

경우 1️⃣ — 처음부터 data.sql 에 DELETE FROM 없이 INSERT 만 있었음

→ 이전에 DB 에 직접 테스트 insert 하거나 다른 버전의 data.sql 이 실행되었고

→ 그 상태에서 다시 Spring Boot 실행하면서 동일한 neighborhood_id=1 insert 시도

→ → 중복 발생

경우 2️⃣ — Spring Boot 재실행 시 data.sql 중복 실행

→ Spring Boot 는 기본 설정에서 application run 시마다 data.sql 을 실행함

→ 근데 DELETE FROM 이 없으면 → 기존 데이터 남아있고 → INSERT 가 또 실행됨 → 중복 발생

발생 이유:

1️⃣ 첫 번째 Neighborhood insert → id = 1 생성됨:

INSERT INTO neighborhoods (...) VALUES (...), (...);

→ 첫 번째 row → id = 1 → Yeoksam-dong

2️⃣ User insert 에서 Alice → neighborhood_id = 1 사용:

('Alice', 'alice@example.com', ..., 'USER', 1),

3️⃣ 하지만 에러 로그에 따르면 → 이미 이 neighborhood_id = 1 로 users row 가 하나 있었던 것 같음 (중복 insert 됨)

어떻게 수정 ?

👉 data.sql 맨 위에 "초기화 (DELETE FROM)" 구문 추가하면 해결됨 —> build/resources/main/data.sql

👉순서가 중요 — Foreign Key 제약조건 고려해서 수정

정리된 data.sql

-- 🚩 0. 초기화 순서 (FK 고려 순서 중요!)
DELETE FROM comments;
DELETE FROM posts;
DELETE FROM groups;
DELETE FROM users;
DELETE FROM neighborhoods;

-- 1. Neighborhood 데이터
INSERT INTO neighborhoods (city_name, district_name, ward_name, lat, lng, is_verified)
VALUES
    ('Seoul', 'Gangnam-gu', 'Yeoksam-dong', 37.501274, 127.039585, true),
    ('Busan', 'Haeundae-gu', 'U-dong', 35.1631, 129.1635, true);

-- 2. User 데이터
INSERT INTO users (name, email, password, birth_date, gender, address, phone, image_url, provider, provider_id, role, neighborhood_id)
VALUES
    ('Alice', 'alice@example.com', 'Password123@', '1995-05-10', 'F', 'Seoul, Gangnam-gu', '010-1234-5678', NULL, 'LOCAL', NULL, 'USER', 1),
    ('Bob', 'bob@example.com', 'securepw', '1990-10-22', 'M', 'Busan, Haeundae-gu', '010-8765-4321', NULL, 'LOCAL', NULL, 'USER', NULL);

-- 3. Group 데이터
INSERT INTO groups (
    name, description, access, type, interest, is_neighborhood_auth_required, leader_id, neighborhood_id)
VALUES
    ('Hiking Club', 'Group for weekend hikes', 'PUBLIC', 'ONLINE', 'STUDY', true, 1, 1),
    ('Book Lovers', 'Discussing books monthly', 'PRIVATE', 'OFFLINE', 'EXERCISE', false, 2, NULL);

-- 4. Post 데이터
INSERT INTO posts (
    group_id, user_id, content, reserve_at, is_notice)
VALUES
    (1, 1, '내용 1번', null, false),
    (1, 2, '내용 2번', null, false);

-- 5. Comments 데이터
INSERT INTO comments (
    post_id, user_id, content, parent_id
) VALUES
    (1, 1, '첫 번째 댓글입니다.', NULL),
    (1, 2, '첫 번째 댓글에 대한 대댓글입니다.', 1),
    (2, 1, '두 번째 게시글의 댓글입니다.', NULL),
    (2, 2, '두 번째 게시글 댓글에 대한 대댓글입니다.', 3);

단독으로 넣으면 FK 에러날 수 있음위쪽 테이블들부터 순서대로 초기화

so, 전체 순서로 DELETE FROM 진행

  • users → groups → posts → commentsForeign Key 관계로 연결되어 있음
    • 예: posts.user_id → users.id
    • comments.post_id → posts.id

그래서 반드시 상위 → 하위 순서로 삭제해야 에러 안 남!

0개의 댓글