ITN Dev 07-22
fix: 유니크 제약 테스트를 실제로 제약을 검증하도록 보강
연번+기관명 유니크 테스트가 단일 삽입 후 건수만 확인해 uq_organization_no_name
제약이 삭제돼도 통과하는 문제를 수정. 동일 조합 중복 삽입 시 예외 발생과,
동일 연번(008 경찰청/경찰청_치안정책연구소)의 다른 기관명은 정상 저장되는
두 경우를 모두 검증하도록 변경. application.yml의 hikari.schema 설정에는
Flyway 스키마 지정과 별개로 필요한 이유를 주석으로 명시.
@312293c6ae63faa89f979b2035d0d634ea0c0ddd
src/main/resources/application.yml
--- src/main/resources/application.yml
+++ src/main/resources/application.yml
@@ -6,6 +6,9 @@
     username: ${DB_USERNAME}
     password: ${DB_PASSWORD}
     hikari:
+      # flyway.schemas는 Flyway 전용 커넥션에만 적용되므로, 애플리케이션이 실제 사용하는
+      # HikariCP 커넥션 풀의 search_path는 이 설정으로 별도 지정해야 한다.
+      # 없으면 커넥션이 public 스키마를 기본으로 조회해 "relation organization does not exist" 오류가 난다.
       schema: itnhub
   flyway:
     enabled: true
src/test/java/kr/itn/itnhub/SchemaMigrationTest.java
--- src/test/java/kr/itn/itnhub/SchemaMigrationTest.java
+++ src/test/java/kr/itn/itnhub/SchemaMigrationTest.java
@@ -4,6 +4,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
+import org.springframework.dao.DataIntegrityViolationException;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.test.context.DynamicPropertyRegistry;
 import org.springframework.test.context.DynamicPropertySource;
@@ -12,6 +13,7 @@
 import org.testcontainers.junit.jupiter.Testcontainers;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 @SpringBootTest
 @Testcontainers
@@ -48,8 +50,18 @@
         jdbc.update("insert into organization (org_no, org_name, channel_slug) "
                 + "values ('008', '경찰청', '008')");
 
+        // 같은 (org_no, org_name) 조합의 중복 삽입은 제약 위반으로 실패해야 한다.
+        assertThatThrownBy(() -> jdbc.update(
+                "insert into organization (org_no, org_name, channel_slug) "
+                        + "values ('008', '경찰청', '008-dup')"))
+                .isInstanceOf(DataIntegrityViolationException.class);
+
+        // org_no는 같지만 org_name이 다르면(경찰청_치안정책연구소) 정상적으로 저장되어야 한다.
+        jdbc.update("insert into organization (org_no, org_name, channel_slug) "
+                + "values ('008', '경찰청_치안정책연구소', '008-2')");
+
         assertThat(jdbc.queryForObject(
                 "select count(*) from organization where org_no = '008'", Integer.class))
-                .isEqualTo(1);
+                .isEqualTo(2);
     }
 }
Add a comment
List