ITN Dev 07-22
feat: 프로젝트 골격과 organization 스키마 추가
@7257a6c0cf578ffd329a3513ade423511ce35b90
 
pom.xml (added)
+++ pom.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>3.3.5</version>
+    <relativePath/>
+  </parent>
+
+  <groupId>kr.itn</groupId>
+  <artifactId>itnhub</artifactId>
+  <version>0.1.0</version>
+  <name>itnhub</name>
+
+  <properties>
+    <java.version>21</java.version>
+    <mybatis.version>3.0.3</mybatis.version>
+    <poi.version>5.3.0</poi.version>
+    <wiremock.version>3.9.1</wiremock.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-security</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-validation</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.mybatis.spring.boot</groupId>
+      <artifactId>mybatis-spring-boot-starter</artifactId>
+      <version>${mybatis.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.postgresql</groupId>
+      <artifactId>postgresql</artifactId>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.flywaydb</groupId>
+      <artifactId>flyway-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.flywaydb</groupId>
+      <artifactId>flyway-database-postgresql</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.poi</groupId>
+      <artifactId>poi-ooxml</artifactId>
+      <version>${poi.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.security</groupId>
+      <artifactId>spring-security-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-testcontainers</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.testcontainers</groupId>
+      <artifactId>junit-jupiter</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.testcontainers</groupId>
+      <artifactId>postgresql</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.wiremock</groupId>
+      <artifactId>wiremock-standalone</artifactId>
+      <version>${wiremock.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+</project>
 
src/main/java/kr/itn/itnhub/ItnHubApplication.java (added)
+++ src/main/java/kr/itn/itnhub/ItnHubApplication.java
@@ -0,0 +1,11 @@
+package kr.itn.itnhub;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ItnHubApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ItnHubApplication.class, args);
+    }
+}
 
src/main/resources/application.yml (added)
+++ src/main/resources/application.yml
@@ -0,0 +1,27 @@
+spring:
+  application:
+    name: itnhub
+  datasource:
+    url: ${DB_URL}
+    username: ${DB_USERNAME}
+    password: ${DB_PASSWORD}
+    hikari:
+      schema: itnhub
+  flyway:
+    enabled: true
+    schemas: itnhub
+    default-schema: itnhub
+    create-schemas: true
+  servlet:
+    multipart:
+      max-file-size: 20MB
+      max-request-size: 20MB
+
+mybatis:
+  mapper-locations: classpath:mapper/*.xml
+  configuration:
+    map-underscore-to-camel-case: true
+
+logging:
+  level:
+    kr.itn.itnhub: INFO
 
src/main/resources/db/migration/V1__init.sql (added)
+++ src/main/resources/db/migration/V1__init.sql
@@ -0,0 +1,18 @@
+create table organization (
+    id              bigserial primary key,
+    org_no          varchar(10)  not null,
+    org_name        varchar(200) not null,
+    channel_slug    varchar(40)  not null,
+    dept_name       varchar(200),
+    manager_name    varchar(100),
+    manager_title   varchar(100),
+    manager_phone   varchar(50),
+    manager_email   varchar(200),
+    channel_id_mj   varchar(40),
+    channel_id_law  varchar(40),
+    created_at      timestamptz  not null default now(),
+    updated_at      timestamptz  not null default now(),
+    constraint uq_organization_no_name unique (org_no, org_name)
+);
+
+create index ix_organization_org_no on organization (org_no);
 
src/test/java/kr/itn/itnhub/SchemaMigrationTest.java (added)
+++ src/test/java/kr/itn/itnhub/SchemaMigrationTest.java
@@ -0,0 +1,55 @@
+package kr.itn.itnhub;
+
+import org.junit.jupiter.api.Test;
+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.jdbc.core.JdbcTemplate;
+import org.springframework.test.context.DynamicPropertyRegistry;
+import org.springframework.test.context.DynamicPropertySource;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest
+@Testcontainers
+class SchemaMigrationTest {
+
+    @Container
+    @ServiceConnection
+    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16");
+
+    @DynamicPropertySource
+    static void secrets(DynamicPropertyRegistry registry) {
+        registry.add("app.admin.username", () -> "admin");
+        registry.add("app.admin.password", () -> "test-password");
+        registry.add("mattermost.base-url", () -> "http://localhost:1");
+        registry.add("mattermost.token", () -> "test-token");
+        registry.add("mattermost.team-id", () -> "test-team");
+    }
+
+    @Autowired
+    JdbcTemplate jdbc;
+
+    @Test
+    void organization_테이블이_생성된다() {
+        Integer count = jdbc.queryForObject(
+                "select count(*) from information_schema.tables "
+                        + "where table_schema = 'itnhub' and table_name = 'organization'",
+                Integer.class);
+
+        assertThat(count).isEqualTo(1);
+    }
+
+    @Test
+    void 연번과_기관명_조합에_유니크_제약이_있다() {
+        jdbc.update("insert into organization (org_no, org_name, channel_slug) "
+                + "values ('008', '경찰청', '008')");
+
+        assertThat(jdbc.queryForObject(
+                "select count(*) from organization where org_no = '008'", Integer.class))
+                .isEqualTo(1);
+    }
+}
Add a comment
List