ITN Dev 07-22
feat: 채널 표시명/내부명 규칙 추가
@bd45d8a1e2ad50983da9acc4addfc5ae7f9302ab
 
src/main/java/kr/itn/itnhub/provision/ChannelKind.java (added)
+++ src/main/java/kr/itn/itnhub/provision/ChannelKind.java
@@ -0,0 +1,16 @@
+package kr.itn.itnhub.provision;
+
+public enum ChannelKind {
+    MJ("mj"),
+    LAW("law");
+
+    private final String code;
+
+    ChannelKind(String code) {
+        this.code = code;
+    }
+
+    public String code() {
+        return code;
+    }
+}
 
src/main/java/kr/itn/itnhub/provision/ChannelNaming.java (added)
+++ src/main/java/kr/itn/itnhub/provision/ChannelNaming.java
@@ -0,0 +1,30 @@
+package kr.itn.itnhub.provision;
+
+/**
+ * 채널 이름 규칙. VBA M06/M07의 이식이며 기존에 만들어진 채널과 반드시 일치해야 한다.
+ * 규칙이 바뀌면 기존 채널을 찾지 못하고 중복 생성된다.
+ */
+public final class ChannelNaming {
+
+    /** 같은 연번을 쓰지만 별도 기관으로 취급하는 유일한 예외. */
+    public static final String SPECIAL_ORG_NAME = "경찰청_치안정책연구소";
+
+    private ChannelNaming() {
+    }
+
+    public static String displayName(String orgNo, String orgName, String label) {
+        return orgNo.trim() + "_" + orgName.trim() + " (" + label.trim() + ")";
+    }
+
+    public static String internalName(String orgNo, String orgName, ChannelKind kind) {
+        String slug = orgNo.trim()
+                .toLowerCase()
+                .replace("_", "-")
+                .replace(" ", "-");
+
+        if (SPECIAL_ORG_NAME.equalsIgnoreCase(orgName.trim())) {
+            return "org-" + slug + "-policy-" + kind.code();
+        }
+        return "org-" + slug + "-" + kind.code();
+    }
+}
 
src/test/java/kr/itn/itnhub/provision/ChannelNamingTest.java (added)
+++ src/test/java/kr/itn/itnhub/provision/ChannelNamingTest.java
@@ -0,0 +1,56 @@
+package kr.itn.itnhub.provision;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class ChannelNamingTest {
+
+    @Test
+    void 표시명은_연번_기관명_라벨을_조합한다() {
+        assertThat(ChannelNaming.displayName("001", "국제방송교류재단", "문정원"))
+                .isEqualTo("001_국제방송교류재단 (문정원)");
+
+        assertThat(ChannelNaming.displayName("001", "국제방송교류재단", "법률검토"))
+                .isEqualTo("001_국제방송교류재단 (법률검토)");
+    }
+
+    @Test
+    void 내부명은_org_연번_구분_형식이다() {
+        assertThat(ChannelNaming.internalName("001", "국제방송교류재단", ChannelKind.MJ))
+                .isEqualTo("org-001-mj");
+
+        assertThat(ChannelNaming.internalName("001", "국제방송교류재단", ChannelKind.LAW))
+                .isEqualTo("org-001-law");
+    }
+
+    @Test
+    void 치안정책연구소는_policy_구분자가_들어간다() {
+        assertThat(ChannelNaming.internalName("008", "경찰청_치안정책연구소", ChannelKind.MJ))
+                .isEqualTo("org-008-policy-mj");
+
+        assertThat(ChannelNaming.internalName("008", "경찰청_치안정책연구소", ChannelKind.LAW))
+                .isEqualTo("org-008-policy-law");
+    }
+
+    @Test
+    void 같은_연번의_대표기관은_policy가_붙지_않는다() {
+        assertThat(ChannelNaming.internalName("008", "경찰청", ChannelKind.MJ))
+                .isEqualTo("org-008-mj");
+    }
+
+    @Test
+    void 연번의_밑줄과_공백은_하이픈으로_바뀌고_소문자가_된다() {
+        assertThat(ChannelNaming.internalName("00_A", "기관", ChannelKind.MJ))
+                .isEqualTo("org-00-a-mj");
+
+        assertThat(ChannelNaming.internalName(" 00 B ", "기관", ChannelKind.MJ))
+                .isEqualTo("org-00-b-mj");
+    }
+
+    @Test
+    void 연번의_앞자리_영은_보존된다() {
+        assertThat(ChannelNaming.internalName("001", "기관", ChannelKind.MJ))
+                .startsWith("org-001-");
+    }
+}
Add a comment
List