Compare commits
68 Commits
master
...
feature/ca
Author | SHA1 | Date |
---|---|---|
qkr7828 | 9ecf36ab85 | 7 months ago |
qkr7828 | 2b3c08b63e | 7 months ago |
지대한 | aa01582287 | 7 months ago |
qkr7828 | a2c53655a1 | 7 months ago |
qkr7828 | f017cc527b | 7 months ago |
qkr7828 | 3d2160b9e2 | 7 months ago |
qkr7828 | 547f2118e6 | 7 months ago |
qkr7828 | f971072102 | 7 months ago |
qkr7828 | c2df8e6f56 | 7 months ago |
qkr7828 | 629c133772 | 7 months ago |
qkr7828 | df2048da4a | 7 months ago |
박재우 | eb5d56b4ef | 7 months ago |
지대한 | 061663c8b5 | 7 months ago |
지대한 | ac6865a15e | 7 months ago |
지대한 | 395972cd3f | 7 months ago |
지대한 | 6c32044d93 | 7 months ago |
지대한 | 67ab2bba16 | 7 months ago |
lkd9125(이경도) | 1463649563 | 7 months ago |
lkd9125(이경도) | d69d14e15a | 8 months ago |
lkd9125(이경도) | b679f86a08 | 8 months ago |
lkd9125(이경도) | 1ccf1140a3 | 8 months ago |
지대한 | 5a974631e9 | 8 months ago |
지대한 | 90802890de | 8 months ago |
lkd9125(이경도) | e63d7a64db | 8 months ago |
qkr7828 | 6b714c0f46 | 8 months ago |
lkd9125(이경도) | 0fcad045a6 | 8 months ago |
lkd9125(이경도) | 17e1affce5 | 8 months ago |
lkd9125(이경도) | 487af94496 | 8 months ago |
lkd9125(이경도) | 562df6b0ce | 8 months ago |
qkr7828 | 536dff756b | 8 months ago |
지대한 | a085711156 | 8 months ago |
지대한 | 36d78d82c5 | 8 months ago |
lkd9125(이경도) | d584d8c0b7 | 8 months ago |
지대한 | c06fe45fe1 | 8 months ago |
지대한 | c9422c1a66 | 8 months ago |
지대한 | 1c27a48858 | 8 months ago |
lkd9125(이경도) | 1d5bed9ce7 | 8 months ago |
지대한 | 6fa8d61898 | 8 months ago |
지대한 | 1fc4f1c93d | 8 months ago |
지대한 | 1274960091 | 8 months ago |
lkd9125 | 27d26daa46 | 8 months ago |
lkd9125(이경도) | e5f77b3de6 | 8 months ago |
lkd9125(이경도) | 95562bf996 | 8 months ago |
지대한 | c736566683 | 8 months ago |
지대한 | 679e50bed0 | 8 months ago |
지대한 | 9806887ee8 | 8 months ago |
지대한 | 0970cba328 | 8 months ago |
박재우 | 59b6625881 | 8 months ago |
지대한 | 41aacc4c14 | 8 months ago |
지대한 | 0276f9b767 | 8 months ago |
지대한 | 7cc65313c4 | 8 months ago |
지대한 | 5b9398b44f | 8 months ago |
지대한 | 56bd7d5142 | 8 months ago |
지대한 | 069406969c | 8 months ago |
지대한 | 40c4e8dcb5 | 8 months ago |
박재우 | 708534570a | 8 months ago |
박재우 | cf07273d30 | 8 months ago |
지대한 | e986ad4848 | 8 months ago |
지대한 | c8c16724bc | 8 months ago |
lkd9125 | 7777f85203 | 8 months ago |
lkd9125(이경도) | 44214a819c | 8 months ago |
지대한 | 087d11efa1 | 8 months ago |
지대한 | 18d1e99b23 | 8 months ago |
지대한 | 4fd51aa4da | 8 months ago |
지대한 | f3edb2286e | 8 months ago |
지대한 | c36929b090 | 8 months ago |
지대한 | 0c0eb8ba30 | 8 months ago |
지대한 | d713a2cb8e | 9 months ago |
181 changed files with 15304 additions and 8 deletions
Binary file not shown.
@ -0,0 +1,68 @@
|
||||
# Spec |
||||
|
||||
## 환경 구성 |
||||
|
||||
### 기본 정보 |
||||
|
||||
- java 21 |
||||
- spring boot 3.2.1 |
||||
- jpa |
||||
- mysql |
||||
|
||||
|
||||
## 작업전 준비 |
||||
|
||||
### 1. mysql 설치 |
||||
|
||||
``` |
||||
docker-compose up -d database |
||||
``` |
||||
### 1-1. redis 설치 |
||||
|
||||
``` |
||||
docker-compose up -d redis |
||||
``` |
||||
|
||||
cmd -> docker exec -it kac_redis /bin/bash -> redis-cli 명령어로 접근 가능하다. |
||||
|
||||
### 2. application.yml 설정 변경 |
||||
|
||||
최초 실행시 table 생성하기 위한 작업 |
||||
`ddl-auto: create`로 변경 후 실행한 다음 Table이 생성되었는지 확인하고 원래 설정값으로 변경한다. |
||||
|
||||
```yaml |
||||
spring: |
||||
jpa: |
||||
hibernate: |
||||
ddl-auto: create |
||||
``` |
||||
|
||||
## 설정 정보 |
||||
|
||||
### log4jdbc.log4j2.properties 속성 |
||||
|
||||
| 속성 | 설명 | |
||||
|--------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| |
||||
| log4jdbc.spylogdelegator.name | 로그4jdbc에서 사용할 로그 델리게이트(Delegate)의 이름을 지정합니다. 이 구성을 통해 로그 델리게이트를 변경할 수 있습니다. 이 코드에서는 SLF4J를 사용하는 net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator가 지정되어 있습니다. | |
||||
| log4jdbc.dump.sql.maxlinelength | SQL문의 최대 길이를 지정합니다. 이 속성은 SQL문을 자동 줄 바꿈하는 데 사용됩니다. 이 코드에서는 0으로 설정되어 있으므로 SQL문의 길이에 제한이 없습니다. | |
||||
| log4jdbc.spylogdelegator.name | 로그4jdbc에서 사용할 로그 델리게이트(Delegate)의 이름을 지정합니다. 이 구성을 통해 로그 델리게이트를 변경할 수 있습니다. 이 코드에서는 SLF4J를 사용하는 net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator가 지정되어 있습니다. | |
||||
| log4jdbc.dump.sql.maxlinelength | SQL문의 최대 길이를 지정합니다. 이 속성은 SQL문을 자동 줄 바꿈하는 데 사용됩니다. 이 코드에서는 0으로 설정되어 있으므로 SQL문의 길이에 제한이 없습니다. | |
||||
| log4jdbc.auto.load.popular.drivers | 자주 사용되는 드라이버를 자동으로 로드할지 여부를 지정합니다. 이 코드에서는 true로 설정되어 있습니다. | |
||||
| log4jdbc.trim.sql.enabled | SQL 문의 앞뒤 공백을 자동으로 제거할지 여부를 지정합니다. 이 코드에서는 true로 설정되어 있습니다. | |
||||
| log4jdbc.trim.sql.extrablanklines | SQL 문의 공백 라인을 제거할지 여부를 지정합니다. 이 코드에서는 false로 설정되어 있습니다. | |
||||
| log4jdbc.suppress.generated.keys.exception | SQL 문에서 생성된 키 예외를 억제할지 여부를 지정합니다. 이 코드에서는 false로 설정되어 있습니다. |
||||
|
||||
|
||||
## spring rest doc |
||||
|
||||
### URL |
||||
|
||||
- uri : `/docs/index.html` |
||||
- local : http://localhost:8080/docs/index.html |
||||
|
||||
## spring swagger |
||||
|
||||
### URL |
||||
|
||||
- uri : `/swagger-ui/index.html` |
||||
- local : http://localhost:8080/swagger-ui/index.html |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,10 @@
|
||||
FROM openjdk:21 |
||||
|
||||
ENV TZ=Asia/Seoul |
||||
|
||||
EXPOSE 8080 |
||||
|
||||
WORKDIR /app |
||||
ADD ./build/libs/*.jar /app/app.jar |
||||
|
||||
ENTRYPOINT ["java","-jar","/app/app.jar"] |
@ -1,9 +1,110 @@
|
||||
plugins { |
||||
id "org.asciidoctor.jvm.convert" version "3.3.2" |
||||
} |
||||
|
||||
configurations { |
||||
compileOnly { |
||||
extendsFrom annotationProcessor |
||||
} |
||||
asciidoctorExt |
||||
} |
||||
|
||||
dependencies { |
||||
implementation "$boot:spring-boot-starter-web" |
||||
runtimeOnly 'com.mysql:mysql-connector-j' |
||||
// security |
||||
implementation "$boot:spring-boot-starter-security" |
||||
// implementation "com.auth0:java-jwt:4.4.0" |
||||
// db |
||||
runtimeOnly "com.mysql:mysql-connector-j" |
||||
implementation "org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4:1.16" |
||||
// jpa |
||||
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' |
||||
implementation "$boot:spring-boot-starter-data-jpa" |
||||
// querydsl |
||||
implementation "com.querydsl:querydsl-jpa:5.0.0:jakarta" |
||||
|
||||
//cache |
||||
implementation 'org.springframework.boot:spring-boot-starter-cache' |
||||
implementation 'org.ehcache:ehcache:3.10.8' |
||||
implementation 'org.hibernate:hibernate-jcache:6.0.2.Final' |
||||
implementation 'javax.cache:cache-api:1.1.1' |
||||
|
||||
//redis |
||||
implementation 'org.springframework.boot:spring-boot-starter-data-redis:3.2.2' |
||||
|
||||
// rest doc |
||||
asciidoctorExt 'org.springframework.restdocs:spring-restdocs-asciidoctor' |
||||
|
||||
// test |
||||
testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' |
||||
testImplementation 'org.springframework.boot:spring-boot-starter-test' |
||||
|
||||
|
||||
implementation project(":common-core") |
||||
implementation project(":common-util") |
||||
implementation project(":web-security") |
||||
implementation project(":web-api-common") |
||||
} |
||||
|
||||
ext { |
||||
snippetsDir = file('build/generated-snippets') |
||||
} |
||||
|
||||
tasks { |
||||
def isTest = gradle.startParameter.excludedTaskNames.contains('test') |
||||
|
||||
compileOnly project(":data-user") |
||||
if (!isTest) { |
||||
asciidoctor { |
||||
dependsOn test |
||||
inputs.dir snippetsDir |
||||
doFirst { |
||||
delete file('src/main/resources/static/docs') |
||||
} |
||||
} |
||||
} |
||||
|
||||
test { |
||||
outputs.dir snippetsDir |
||||
} |
||||
|
||||
|
||||
bootJar { |
||||
if (!isTest) { |
||||
dependsOn asciidoctor |
||||
from("${asciidoctor.outputDir}/html5") { |
||||
into 'static/docs' |
||||
} |
||||
} |
||||
} |
||||
|
||||
task copyDocument(type: Copy) { |
||||
if (!isTest) { |
||||
dependsOn asciidoctor |
||||
from file("build/docs/asciidoc") |
||||
into file("src/main/resources/static/docs") |
||||
} |
||||
} |
||||
|
||||
build { |
||||
if (!isTest) { |
||||
dependsOn copyDocument |
||||
} |
||||
} |
||||
|
||||
// querydsl |
||||
def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile |
||||
sourceSets { |
||||
main.java.srcDir(querydslDir) |
||||
} |
||||
|
||||
compileJava { |
||||
options.getGeneratedSourceOutputDirectory().set(file(querydslDir)) |
||||
} |
||||
|
||||
clean { |
||||
delete file(querydslDir) |
||||
} |
||||
} |
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,3 @@
|
||||
sh ../../gradlew clean && ../../gradlew bootJar |
||||
docker cp ./build/libs/app-kac-app-1.0.0.jar kac-app:/app/app.jar |
||||
docker restart kac-app |
Binary file not shown.
@ -0,0 +1,175 @@
|
||||
ifndef::snippets[] |
||||
:snippets: ./build/generated-snippets |
||||
endif::[] |
||||
|
||||
= KAC App Docs |
||||
API 문서 |
||||
:doctype: book |
||||
:icons: font |
||||
:source-highlighter: highlightjs |
||||
:toc: left |
||||
:toclevels: 2 |
||||
:sectlinks: |
||||
|
||||
[[Common-Code-API]] |
||||
== Common-Code API |
||||
|
||||
[[Code-All]] |
||||
=== [Code 전체코드 조회] |
||||
|
||||
==== [HTTP REQUEST INFO] |
||||
include::{snippets}/com/code/all/http-request.adoc[] |
||||
include::{snippets}/com/code/all/query-parameters.adoc[] |
||||
|
||||
==== [HTTP RESPONSE INFO] |
||||
include::{snippets}/com/code/all/http-response.adoc[] |
||||
|
||||
include::{snippets}/com/code/all/response-fields.adoc[] |
||||
|
||||
*** |
||||
|
||||
=== [Code 코드목록 조회] |
||||
|
||||
==== [HTTP REQUEST INFO] |
||||
include::{snippets}/com/code/code/http-request.adoc[] |
||||
|
||||
include::{snippets}/com/code/code/query-parameters.adoc[] |
||||
|
||||
==== [HTTP RESPONSE INFO] |
||||
include::{snippets}/com/code/code/http-response.adoc[] |
||||
|
||||
include::{snippets}/com/code/code/response-fields.adoc[] |
||||
|
||||
*** |
||||
|
||||
=== [Code 그룹목록 조회] |
||||
|
||||
==== [HTTP REQUEST INFO] |
||||
include::{snippets}/com/code/group/http-request.adoc[] |
||||
|
||||
==== [HTTP RESPONSE INFO] |
||||
include::{snippets}/com/code/group/http-response.adoc[] |
||||
|
||||
include::{snippets}/com/code/group/response-fields.adoc[] |
||||
|
||||
*** |
||||
|
||||
=== [Code 그룹 등록] |
||||
|
||||
==== [HTTP REQUEST INFO] |
||||
include::{snippets}/com/code/group/create/http-request.adoc[] |
||||
|
||||
include::{snippets}/com/code/group/create/request-fields.adoc[] |
||||
|
||||
==== [HTTP RESPONSE INFO] |
||||
include::{snippets}/com/code/group/create/http-response.adoc[] |
||||
|
||||
include::{snippets}/com/code/group/create/response-fields.adoc[] |
||||
|
||||
*** |
||||
|
||||
=== [Code 코드 등록] |
||||
|
||||
==== [HTTP REQUEST INFO] |
||||
include::{snippets}/com/code/code/create/http-request.adoc[] |
||||
|
||||
include::{snippets}/com/code/code/create/request-fields.adoc[] |
||||
|
||||
==== [HTTP RESPONSE INFO] |
||||
include::{snippets}/com/code/code/create/http-response.adoc[] |
||||
|
||||
include::{snippets}/com/code/code/create/response-fields.adoc[] |
||||
|
||||
*** |
||||
|
||||
=== [Code 코드언어 등록] |
||||
|
||||
==== [HTTP REQUEST INFO] |
||||
include::{snippets}/com/code/lang/create/http-request.adoc[] |
||||
|
||||
include::{snippets}/com/code/lang/create/request-fields.adoc[] |
||||
|
||||
==== [HTTP RESPONSE INFO] |
||||
include::{snippets}/com/code/lang/create/http-response.adoc[] |
||||
|
||||
include::{snippets}/com/code/lang/create/response-fields.adoc[] |
||||
|
||||
*** |
||||
|
||||
=== [Code 그룹 수정] |
||||
|
||||
==== [HTTP REQUEST INFO] |
||||
include::{snippets}/com/code/group/update/http-request.adoc[] |
||||
|
||||
include::{snippets}/com/code/group/update/request-fields.adoc[] |
||||
|
||||
==== [HTTP RESPONSE INFO] |
||||
include::{snippets}/com/code/group/update/http-response.adoc[] |
||||
|
||||
include::{snippets}/com/code/group/update/response-fields.adoc[] |
||||
|
||||
*** |
||||
|
||||
=== [Code 코드 수정] |
||||
|
||||
==== [HTTP REQUEST INFO] |
||||
include::{snippets}/com/code/code/update/http-request.adoc[] |
||||
|
||||
include::{snippets}/com/code/code/update/request-fields.adoc[] |
||||
|
||||
==== [HTTP RESPONSE INFO] |
||||
include::{snippets}/com/code/code/update/http-response.adoc[] |
||||
|
||||
include::{snippets}/com/code/code/update/response-fields.adoc[] |
||||
|
||||
*** |
||||
|
||||
=== [Code 코드언어 수정] |
||||
|
||||
==== [HTTP REQUEST INFO] |
||||
include::{snippets}/com/code/lang/update/http-request.adoc[] |
||||
|
||||
include::{snippets}/com/code/lang/update/request-fields.adoc[] |
||||
|
||||
==== [HTTP RESPONSE INFO] |
||||
include::{snippets}/com/code/lang/update/http-response.adoc[] |
||||
|
||||
include::{snippets}/com/code/lang/update/response-fields.adoc[] |
||||
|
||||
*** |
||||
|
||||
=== [Code 그룹 삭제] |
||||
|
||||
==== [HTTP REQUEST INFO] |
||||
include::{snippets}/com/code/group/delete/http-request.adoc[] |
||||
|
||||
include::{snippets}/com/code/group/delete/query-parameters.adoc[] |
||||
|
||||
==== [HTTP RESPONSE INFO] |
||||
include::{snippets}/com/code/group/delete/http-response.adoc[] |
||||
|
||||
*** |
||||
|
||||
=== [Code 코드 삭제] |
||||
|
||||
==== [HTTP REQUEST INFO] |
||||
include::{snippets}/com/code/code/delete/http-request.adoc[] |
||||
|
||||
include::{snippets}/com/code/code/delete/query-parameters.adoc[] |
||||
|
||||
==== [HTTP RESPONSE INFO] |
||||
include::{snippets}/com/code/code/delete/http-response.adoc[] |
||||
|
||||
*** |
||||
|
||||
=== [Code 언어 삭제] |
||||
|
||||
==== [HTTP REQUEST INFO] |
||||
include::{snippets}/com/code/lang/delete/http-request.adoc[] |
||||
|
||||
include::{snippets}/com/code/lang/delete/query-parameters.adoc[] |
||||
|
||||
==== [HTTP RESPONSE INFO] |
||||
include::{snippets}/com/code/lang/delete/http-response.adoc[] |
||||
|
||||
*** |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,54 @@
|
||||
package kr.co.palnet.kac.app.config; |
||||
|
||||
import org.ehcache.config.builders.CacheConfigurationBuilder; |
||||
import org.ehcache.config.builders.ExpiryPolicyBuilder; |
||||
import org.ehcache.config.builders.ResourcePoolsBuilder; |
||||
import org.ehcache.config.units.EntryUnit; |
||||
import org.ehcache.config.units.MemoryUnit; |
||||
import org.ehcache.jsr107.Eh107Configuration; |
||||
import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer; |
||||
import org.springframework.cache.CacheManager; |
||||
import org.springframework.cache.annotation.EnableCaching; |
||||
import org.springframework.cache.jcache.JCacheCacheManager; |
||||
import org.springframework.context.annotation.AdviceMode; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.context.annotation.Profile; |
||||
|
||||
import javax.cache.Caching; |
||||
import javax.cache.spi.CachingProvider; |
||||
import java.time.Duration; |
||||
|
||||
@Configuration |
||||
@Profile("local") |
||||
@EnableCaching(proxyTargetClass = true, mode = AdviceMode.PROXY) |
||||
public class CachingConfig { |
||||
|
||||
|
||||
@Bean(name = "customCacheManager") |
||||
public JCacheCacheManager ehCacheManager() { |
||||
CachingProvider cachingProvider = Caching.getCachingProvider(); |
||||
javax.cache.CacheManager jCacheManager = cachingProvider.getCacheManager(); |
||||
|
||||
//이부분에 캐싱 설정 추가
|
||||
jCacheManager.createCache("code", createCacheConfiguration(Duration.ofSeconds(10), Duration.ofSeconds(20))); |
||||
jCacheManager.createCache("flight", createCacheConfiguration(Duration.ofSeconds(10), Duration.ofSeconds(20))); |
||||
|
||||
return new JCacheCacheManager(jCacheManager); |
||||
} |
||||
|
||||
//cache 기본 설정
|
||||
private javax.cache.configuration.Configuration<Object, Object> createCacheConfiguration(Duration timeToIdle, Duration timeToLive) { |
||||
return Eh107Configuration.fromEhcacheCacheConfiguration( |
||||
CacheConfigurationBuilder.newCacheConfigurationBuilder(Object.class, Object.class, |
||||
ResourcePoolsBuilder.newResourcePoolsBuilder() |
||||
.heap(5000, EntryUnit.ENTRIES)) |
||||
.withSizeOfMaxObjectSize(500, MemoryUnit.B) |
||||
.withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(timeToIdle)) |
||||
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(timeToLive))); |
||||
} |
||||
@Bean |
||||
public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(CacheManager cacheManager) { |
||||
return hibernateProperties -> hibernateProperties.put(org.hibernate.cache.jcache.ConfigSettings.CACHE_MANAGER, cacheManager); |
||||
} |
||||
} |
@ -0,0 +1,68 @@
|
||||
package kr.co.palnet.kac.app.config; |
||||
|
||||
import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties; |
||||
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; |
||||
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; |
||||
import org.springframework.boot.context.properties.ConfigurationProperties; |
||||
import org.springframework.boot.jdbc.DataSourceBuilder; |
||||
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.context.annotation.Primary; |
||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; |
||||
import org.springframework.orm.jpa.JpaTransactionManager; |
||||
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; |
||||
import org.springframework.transaction.PlatformTransactionManager; |
||||
|
||||
import javax.sql.DataSource; |
||||
import java.util.Map; |
||||
import java.util.Objects; |
||||
|
||||
@Configuration |
||||
@EnableJpaRepositories( |
||||
basePackages = "kr.co.palnet.kac.data.*.repository", |
||||
entityManagerFactoryRef = "kacEntityManagerFactory", |
||||
transactionManagerRef = "kacTransactionManager" |
||||
) |
||||
public class KacJpaConfig { |
||||
|
||||
private final JpaProperties jpaProperties; |
||||
private final HibernateProperties hibernateProperties; |
||||
|
||||
public KacJpaConfig(JpaProperties jpaProperties, HibernateProperties hibernateProperties) { |
||||
this.jpaProperties = jpaProperties; |
||||
this.hibernateProperties = hibernateProperties; |
||||
} |
||||
|
||||
@Bean(name = "kacDataSource") |
||||
@Primary |
||||
@ConfigurationProperties(prefix = "spring.datasource.pav-kac") |
||||
public DataSource kacDataSource() { |
||||
return DataSourceBuilder.create().build(); |
||||
} |
||||
|
||||
@Bean(name = "kacEntityManagerFactory") |
||||
@Primary |
||||
public LocalContainerEntityManagerFactoryBean kacEntityManagerFactory(EntityManagerFactoryBuilder builder) { |
||||
Map<String, Object> prop = hibernateProperties.determineHibernateProperties( |
||||
jpaProperties.getProperties(), |
||||
new HibernateSettings() |
||||
); |
||||
|
||||
return builder.dataSource(kacDataSource()) |
||||
.properties(prop) |
||||
.packages( |
||||
"kr.co.palnet.kac.data.**.model", |
||||
"kr.co.palnet.kac.data.**.domain" |
||||
) |
||||
.persistenceUnit("kac") |
||||
.build(); |
||||
} |
||||
|
||||
@Bean(name = "kacTransactionManager") |
||||
@Primary |
||||
public PlatformTransactionManager kacTransactionManager(EntityManagerFactoryBuilder builder) { |
||||
return new JpaTransactionManager(Objects.requireNonNull(kacEntityManagerFactory(builder).getObject())); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,26 @@
|
||||
package kr.co.palnet.kac.app.config; |
||||
|
||||
import org.springframework.beans.factory.annotation.Qualifier; |
||||
import org.springframework.context.MessageSource; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.context.support.MessageSourceAccessor; |
||||
import org.springframework.context.support.ReloadableResourceBundleMessageSource; |
||||
|
||||
@Configuration |
||||
public class MessageSourceConfig { |
||||
|
||||
@Bean(name = "errorMessageSource") |
||||
public MessageSource getErrorMessageSource() { |
||||
ReloadableResourceBundleMessageSource errorMessageSource = new ReloadableResourceBundleMessageSource(); |
||||
errorMessageSource.setBasenames("classpath:messages/errors/error"); |
||||
errorMessageSource.setDefaultEncoding("UTF-8"); |
||||
errorMessageSource.setCacheSeconds(300); |
||||
return errorMessageSource; |
||||
} |
||||
|
||||
@Bean(name = "errorMessageSourceAccessor") |
||||
public MessageSourceAccessor errorMessageSourceAccessor(@Qualifier("errorMessageSource") MessageSource errorMessageSource) { |
||||
return new MessageSourceAccessor(errorMessageSource); |
||||
} |
||||
} |
@ -0,0 +1,20 @@
|
||||
package kr.co.palnet.kac.app.config; |
||||
|
||||
import com.querydsl.jpa.impl.JPAQueryFactory; |
||||
import jakarta.persistence.EntityManager; |
||||
import jakarta.persistence.PersistenceContext; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
|
||||
@Configuration |
||||
public class QueryDslConfig { |
||||
|
||||
@PersistenceContext |
||||
private EntityManager entityManager; |
||||
|
||||
@Bean |
||||
public JPAQueryFactory jpaQueryFactory() { |
||||
return new JPAQueryFactory(entityManager); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,81 @@
|
||||
package kr.co.palnet.kac.app.config; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo; |
||||
import com.fasterxml.jackson.databind.ObjectMapper; |
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; |
||||
import org.springframework.beans.factory.annotation.Value; |
||||
import org.springframework.cache.annotation.EnableCaching; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.context.annotation.Profile; |
||||
import org.springframework.data.redis.cache.RedisCacheConfiguration; |
||||
import org.springframework.data.redis.cache.RedisCacheManager; |
||||
import org.springframework.data.redis.connection.RedisConnectionFactory; |
||||
import org.springframework.data.redis.connection.RedisStandaloneConfiguration; |
||||
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; |
||||
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; |
||||
import org.springframework.data.redis.serializer.RedisSerializationContext; |
||||
import org.springframework.data.redis.serializer.StringRedisSerializer; |
||||
|
||||
import java.time.Duration; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
@Configuration |
||||
@EnableCaching |
||||
@Profile("!local") |
||||
public class RedisCacheConfig { |
||||
|
||||
@Value("${spring.data.redis.host}") |
||||
private String redisHost; |
||||
|
||||
@Value("${spring.data.redis.port}") |
||||
private int redisPort; |
||||
|
||||
@Value("${spring.data.redis.password}") |
||||
private String redisPwd; |
||||
|
||||
@Bean |
||||
public RedisConnectionFactory redisConnectionFactory() { |
||||
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(); |
||||
redisStandaloneConfiguration.setHostName(redisHost); |
||||
redisStandaloneConfiguration.setPort(redisPort); |
||||
redisStandaloneConfiguration.setPassword(redisPwd); |
||||
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration); |
||||
return lettuceConnectionFactory; |
||||
} |
||||
|
||||
@Bean(name = "customCacheManager") |
||||
public RedisCacheManager redisCacheManager(RedisConnectionFactory cf) { |
||||
|
||||
return RedisCacheManager |
||||
.RedisCacheManagerBuilder |
||||
.fromConnectionFactory(cf) |
||||
.cacheDefaults(defaultConfig()) |
||||
.withInitialCacheConfigurations(customConfigurationMap()) |
||||
.build(); |
||||
} |
||||
|
||||
//캐시 설정 추가
|
||||
private Map<String, RedisCacheConfiguration> customConfigurationMap() { |
||||
Map<String, RedisCacheConfiguration> customConfigurationMap = new HashMap<>(); |
||||
customConfigurationMap.put("code", defaultConfig().entryTtl(Duration.ofSeconds(10L))); |
||||
customConfigurationMap.put("flight", defaultConfig().entryTtl(Duration.ofMinutes(1L))); |
||||
return customConfigurationMap; |
||||
} |
||||
|
||||
//기본설정
|
||||
private RedisCacheConfiguration defaultConfig() { |
||||
ObjectMapper objectMapper = new ObjectMapper(); |
||||
objectMapper.registerModule(new JavaTimeModule()); |
||||
objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), |
||||
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); |
||||
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(objectMapper); |
||||
|
||||
return RedisCacheConfiguration.defaultCacheConfig() |
||||
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) |
||||
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer)) |
||||
.entryTtl(Duration.ofMinutes(3L)); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,112 @@
|
||||
package kr.co.palnet.kac.app.config; |
||||
|
||||
import io.swagger.v3.oas.models.Components; |
||||
import io.swagger.v3.oas.models.OpenAPI; |
||||
import io.swagger.v3.oas.models.info.Info; |
||||
import io.swagger.v3.oas.models.security.SecurityRequirement; |
||||
import io.swagger.v3.oas.models.security.SecurityScheme; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
|
||||
import org.springdoc.core.models.GroupedOpenApi; |
||||
import org.springframework.boot.web.servlet.FilterRegistrationBean; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.core.Ordered; |
||||
import org.springframework.web.cors.CorsConfiguration; |
||||
import org.springframework.web.cors.UrlBasedCorsConfigurationSource; |
||||
import org.springframework.web.filter.CorsFilter; |
||||
|
||||
import java.util.List; |
||||
|
||||
@Slf4j |
||||
@Configuration |
||||
public class SwaggerConfig { |
||||
|
||||
// @Bean
|
||||
// public Docket api() {
|
||||
// return new Docket(DocumentationType.OAS_30) // open api spec 3.0
|
||||
// .apiInfo(new ApiInfoBuilder().version("1.0").title("PAV").build())
|
||||
// .forCodeGeneration(true).securitySchemes(Arrays.asList(apiKey()))
|
||||
// .select()
|
||||
// .apis(RequestHandlerSelectors.any())
|
||||
// .paths(PathSelectors.any())
|
||||
// .build()
|
||||
// .apiInfo(apiInfo())
|
||||
// .directModelSubstitute(Date.class, String.class)
|
||||
// .directModelSubstitute(LocalDate.class, String.class)
|
||||
// .directModelSubstitute(LocalDateTime.class, String.class)
|
||||
// .directModelSubstitute(Pageable.class, SwaggerPageable.class)
|
||||
// .securityContexts(Arrays.asList(securityContext()))
|
||||
// .securitySchemes(Arrays.asList(apiKey()));
|
||||
// }
|
||||
//
|
||||
//
|
||||
// private ApiInfo apiInfo() {
|
||||
// return new ApiInfoBuilder()
|
||||
// .title("PAV API")
|
||||
// .description("----")
|
||||
// .version("1.0")
|
||||
// .build();
|
||||
// }
|
||||
//
|
||||
// //ApiKey 정의
|
||||
// private ApiKey apiKey() {
|
||||
// return new ApiKey("Authorization", "Authorization", "header");
|
||||
// }
|
||||
//
|
||||
// //JWT SecurityContext 구성
|
||||
// private SecurityContext securityContext() {
|
||||
// return SecurityContext.builder().securityReferences(defaultAuth()).build();
|
||||
// }
|
||||
//
|
||||
// private List<SecurityReference> defaultAuth() {
|
||||
// AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEveryThing");
|
||||
// AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
|
||||
// authorizationScopes[0] = authorizationScope;
|
||||
// return Arrays.asList(new SecurityReference("Authorization", authorizationScopes));
|
||||
// }
|
||||
|
||||
private static final String BEARER_TOKEN_PREFIX = "palnet"; |
||||
|
||||
@Bean |
||||
public OpenAPI openAPI() { |
||||
final String securitySchemeName = "BearerAuth"; |
||||
|
||||
SecurityRequirement securityRequirement = new SecurityRequirement().addList(securitySchemeName, List.of("read", "write")); |
||||
|
||||
Components components = new Components() |
||||
.addSecuritySchemes(securitySchemeName, new SecurityScheme() |
||||
.type(SecurityScheme.Type.APIKEY) |
||||
.in(SecurityScheme.In.HEADER) |
||||
.name("Authorization") |
||||
.description("prefix add 'palnet ' + token") |
||||
); |
||||
|
||||
// Swagger UI 접속 후, 딱 한 번만 accessToken을 입력해주면 모든 API에 토큰 인증 작업이 적용됩니다.
|
||||
return new OpenAPI() |
||||
.addSecurityItem(securityRequirement) |
||||
.components(components) |
||||
.info(new Info() |
||||
.title("PAV API") |
||||
.version("1.0") |
||||
.description("PAV API") |
||||
); |
||||
} |
||||
|
||||
@Bean |
||||
public GroupedOpenApi commonCode() { |
||||
return GroupedOpenApi.builder() |
||||
.group("공통-코드") |
||||
.pathsToMatch("/v1/com/code/**") |
||||
.build(); |
||||
} |
||||
|
||||
@Bean |
||||
public GroupedOpenApi selectAll() { |
||||
return GroupedOpenApi.builder() |
||||
.group("All") |
||||
.pathsToMatch("/**") |
||||
.build(); |
||||
} |
||||
} |
||||
|
@ -0,0 +1,19 @@
|
||||
package kr.co.palnet.kac.app.config; |
||||
|
||||
import kr.co.palnet.kac.app.core.web.BaseAcceptHeaderLocaleResolver; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.web.servlet.LocaleResolver; |
||||
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver; |
||||
|
||||
import java.util.Locale; |
||||
|
||||
@Configuration |
||||
public class WebConfig { |
||||
@Bean |
||||
public LocaleResolver localeResolver() { |
||||
AcceptHeaderLocaleResolver localeResolver = new BaseAcceptHeaderLocaleResolver(); |
||||
localeResolver.setDefaultLocale(Locale.KOREA); |
||||
return localeResolver; |
||||
} |
||||
} |
@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" |
||||
maxBytesLocalHeap="300M" |
||||
updateCheck="false"> |
||||
<!-- CacheManager에 의해 관리되는 캐시의 메모리를 300M로 제한 --> |
||||
<!-- 임시저장 경로를 설정 --> |
||||
<diskStore path="java.io.tmpdir" /> |
||||
<!-- |
||||
Cache에 저장할 레퍼런스의 최대값을 100000으로 지정, |
||||
maxDepthExceededBehavior = "continue" : 초과 된 최대 깊이에 대해 경고하지만 크기가 조정 된 요소를 계속 탐색 |
||||
maxDepthExceededBehavior = "abort" : 순회를 중지하고 부분적으로 계산 된 크기를 즉시 반환 |
||||
--> |
||||
<sizeOfPolicy maxDepth="100000" maxDepthExceededBehavior="continue"/> |
||||
|
||||
<!-- default Cache 설정 (반드시 선언해야 하는 Cache) --> |
||||
<defaultCache |
||||
eternal="false" |
||||
timeToIdleSeconds="0" |
||||
timeToLiveSeconds="1200" |
||||
overflowToDisk="false" |
||||
diskPersistent="false" |
||||
diskExpiryThreadIntervalSeconds="120" |
||||
memoryStoreEvictionPolicy="LRU"> |
||||
</defaultCache> |
||||
|
||||
<!-- 사용하고자 하는 캐시 별 설정 --> |
||||
<cache name="LocalCacheData" |
||||
eternal="false" |
||||
timeToIdleSeconds="0" |
||||
timeToLiveSeconds="1200" |
||||
overflowToDisk="false" |
||||
diskPersistent="false" |
||||
diskExpiryThreadIntervalSeconds="120" |
||||
memoryStoreEvictionPolicy="LRU"> |
||||
</cache> |
||||
|
||||
<cache name="AuthMemberList" |
||||
eternal="false" |
||||
timeToIdleSeconds="0" |
||||
timeToLiveSeconds="1200" |
||||
overflowToDisk="false" |
||||
diskPersistent="false" |
||||
diskExpiryThreadIntervalSeconds="120" |
||||
memoryStoreEvictionPolicy="LRU"> |
||||
</cache> |
||||
</ehcache> |
@ -0,0 +1,132 @@
|
||||
package kr.co.palnet.kac.app.core.exception; |
||||
|
||||
|
||||
import kr.co.palnet.kac.core.exception.BaseErrorCode; |
||||
import kr.co.palnet.kac.core.exception.BaseException; |
||||
import kr.co.palnet.kac.core.exception.Level; |
||||
import kr.co.palnet.kac.core.exception.model.BaseErrorModel; |
||||
import lombok.RequiredArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.beans.factory.annotation.Qualifier; |
||||
import org.springframework.context.NoSuchMessageException; |
||||
import org.springframework.context.i18n.LocaleContextHolder; |
||||
import org.springframework.context.support.MessageSourceAccessor; |
||||
import org.springframework.http.ResponseEntity; |
||||
import org.springframework.web.bind.annotation.ExceptionHandler; |
||||
import org.springframework.web.bind.annotation.RestControllerAdvice; |
||||
import org.springframework.web.context.request.RequestContextHolder; |
||||
import org.springframework.web.context.request.ServletRequestAttributes; |
||||
import org.springframework.web.servlet.resource.NoResourceFoundException; |
||||
|
||||
import java.time.Instant; |
||||
|
||||
@Slf4j |
||||
@RequiredArgsConstructor |
||||
@RestControllerAdvice |
||||
public class ServerExceptionHandler { |
||||
|
||||
@Qualifier("errorMessageSourceAccessor") |
||||
private final MessageSourceAccessor errorMessageSourceAccessor; |
||||
|
||||
@ExceptionHandler(BaseException.class) |
||||
public ResponseEntity<BaseErrorModel> appExceptionHandle(BaseException e) { |
||||
|
||||
BaseErrorCode errorType = e.getErrorCode(); |
||||
|
||||
BaseErrorModel baseBody = new BaseErrorModel(); |
||||
baseBody.setTimestamp(Instant.now()); |
||||
baseBody.setStatus(errorType.status().value()); |
||||
baseBody.setError(errorType.status().getReasonPhrase()); |
||||
baseBody.setCode(errorType.code()); |
||||
baseBody.setMessage(this.getMessage(errorType)); |
||||
baseBody.setPath(this.getUrl()); |
||||
|
||||
this.printLog(e); |
||||
|
||||
return ResponseEntity.status(errorType.status()).body(baseBody); |
||||
} |
||||
|
||||
@ExceptionHandler(NoResourceFoundException.class) |
||||
public ResponseEntity<BaseErrorModel> noResourceFoundException(NoResourceFoundException e) { |
||||
|
||||
BaseErrorModel baseBody = new BaseErrorModel(); |
||||
baseBody.setTimestamp(Instant.now()); |
||||
baseBody.setStatus(e.getBody().getStatus()); |
||||
baseBody.setError(e.getBody().getDetail()); |
||||
baseBody.setCode(BaseErrorCode.WEB_NOT_FOUND.code()); |
||||
baseBody.setMessage(this.getMessage(BaseErrorCode.WEB_NOT_FOUND)); |
||||
baseBody.setPath(e.getResourcePath()); |
||||
|
||||
log.warn("", e); |
||||
|
||||
return ResponseEntity.status(e.getBody().getStatus()).body(baseBody); |
||||
} |
||||
|
||||
@ExceptionHandler(Exception.class) |
||||
public ResponseEntity<BaseErrorModel> exceptionHandle(Exception e) { |
||||
BaseErrorCode errorType = BaseErrorCode.UNKNOWN; |
||||
|
||||
BaseErrorModel baseBody = new BaseErrorModel(); |
||||
baseBody.setTimestamp(Instant.now()); |
||||
baseBody.setStatus(errorType.status().value()); |
||||
baseBody.setError(errorType.status().getReasonPhrase()); |
||||
baseBody.setCode(errorType.code()); |
||||
baseBody.setMessage(this.getMessage(errorType)); |
||||
baseBody.setPath(this.getUrl()); |
||||
|
||||
log.error("", e); |
||||
|
||||
return ResponseEntity.status(errorType.status()).body(baseBody); |
||||
} |
||||
|
||||
private String getUrl() { |
||||
ServletRequestAttributes servletRequestAttr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); |
||||
if (servletRequestAttr != null) return servletRequestAttr.getRequest().getRequestURI(); |
||||
else return null; |
||||
} |
||||
|
||||
private String getMessage(BaseErrorCode e) { |
||||
String message = null; |
||||
try { |
||||
// message = errorMessageSourceAccessor.getMessage(e.code(), LocaleContextHolder.getLocale());
|
||||
message = errorMessageSourceAccessor.getMessage(e.code()); |
||||
} catch (NoSuchMessageException noSuchMessageException) { |
||||
message = "관리자에게 문의해주세요."; |
||||
} |
||||
return message; |
||||
} |
||||
|
||||
private void printLog(BaseException e) { |
||||
Level level = e.getLevel(); |
||||
String message = e.getLogMessage() == null ? e.getMessage() : e.getLogMessage(); |
||||
Object[] paramArray = e.getParamArray(); |
||||
|
||||
switch (level) { |
||||
case TRACE: |
||||
log.trace("message: {}, params: {}, trace: {}", message, paramArray, e.getStackTrace()); |
||||
log.trace("", e); |
||||
break; |
||||
case DEBUG: |
||||
log.debug("message: {}, params: {}, trace: {}", message, paramArray, e.getStackTrace()); |
||||
log.debug("", e); |
||||
break; |
||||
case INFO: |
||||
log.info("message: {}, params: {}, trace: {}", message, paramArray, e.getStackTrace()); |
||||
log.info("", e); |
||||
break; |
||||
case WARN: |
||||
log.warn("message: {}, params: {}, trace: {}", message, paramArray, e.getStackTrace()); |
||||
log.warn("", e); |
||||
break; |
||||
case ERROR: |
||||
log.trace("message: {}, params: {}, trace: {}", message, paramArray, e.getStackTrace()); |
||||
log.error("", e); |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
} |
||||
|
||||
|
||||
} |
||||
|
@ -0,0 +1,62 @@
|
||||
package kr.co.palnet.kac.app.core.security; |
||||
|
||||
import kr.co.palnet.kac.config.security.SecurityConfig; |
||||
import kr.co.palnet.kac.config.security.exception.BaseAccessDeniedHandler; |
||||
import kr.co.palnet.kac.config.security.exception.BaseAuthenticationEntryPoint; |
||||
import kr.co.palnet.kac.config.security.service.BaseUserDetailsService; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.context.annotation.DependsOn; |
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity; |
||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; |
||||
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; |
||||
import org.springframework.security.web.SecurityFilterChain; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
|
||||
@Slf4j |
||||
@EnableWebSecurity |
||||
@Configuration |
||||
public class AppSecurityConfig extends SecurityConfig { |
||||
|
||||
// 시큐리티 적용 안하는 URL 목록
|
||||
private final String[] IGNORE_URL = { |
||||
"/v1/com/code/**", |
||||
}; |
||||
|
||||
// 권한(ROLE)별 URL
|
||||
private final String[] USER_URL = { |
||||
}; |
||||
|
||||
public AppSecurityConfig(BaseUserDetailsService baseUserDetailsService, BaseAuthenticationEntryPoint baseAuthenticationEntryPoint, BaseAccessDeniedHandler baseAccessDeniedHandler) { |
||||
super(baseUserDetailsService, baseAuthenticationEntryPoint, baseAccessDeniedHandler); |
||||
} |
||||
|
||||
@Override |
||||
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { |
||||
// 기본 security 설정을 불러온다.
|
||||
this.setDefaultHttpSecurity(http); |
||||
// 여기서는 role별 허용 url 설정을 한다.
|
||||
http |
||||
.securityMatchers(matchers -> matchers.requestMatchers("/**")) |
||||
.authorizeHttpRequests(authz -> |
||||
authz |
||||
.requestMatchers(USER_URL).hasRole("USER") |
||||
.anyRequest().authenticated() |
||||
) |
||||
; |
||||
|
||||
return http.build(); |
||||
} |
||||
|
||||
// security filter 제외 - permission all
|
||||
@Override |
||||
protected List<String> getExcludeURI() { |
||||
return new ArrayList<>(Arrays.asList(IGNORE_URL)); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,68 @@
|
||||
package kr.co.palnet.kac.app.core.web; |
||||
|
||||
import jakarta.servlet.http.HttpServletRequest; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.context.i18n.LocaleContextHolder; |
||||
import org.springframework.util.StringUtils; |
||||
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
import java.util.Locale; |
||||
|
||||
@Slf4j |
||||
public class BaseAcceptHeaderLocaleResolver extends AcceptHeaderLocaleResolver { |
||||
private final List<Locale> LOCALES = Arrays.asList( |
||||
new Locale("ko"), |
||||
new Locale("ko", "KR"), |
||||
new Locale("en"), |
||||
new Locale("en", "US") |
||||
); |
||||
private final String LOCALE_HEADER_KEY = "Accept-Language"; |
||||
|
||||
/** |
||||
* resolve locale 구성 |
||||
* |
||||
* @param request the request to resolve the locale for |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public Locale resolveLocale(HttpServletRequest request) { |
||||
if (!StringUtils.hasText(request.getHeader(LOCALE_HEADER_KEY))) { |
||||
return this.getDefaultLocale(); |
||||
} |
||||
try { |
||||
|
||||
Locale locale = LOCALES.stream().filter(_locale -> { |
||||
String defaultLocale = _locale.toString() |
||||
.replaceAll("-", "") |
||||
.replaceAll("_", "") |
||||
.toLowerCase(); |
||||
String headerLocale = request.getHeader(LOCALE_HEADER_KEY).toString() |
||||
.replaceAll("-", "") |
||||
.replaceAll("_", "") |
||||
.toLowerCase(); |
||||
return defaultLocale.equals(headerLocale); |
||||
}).findFirst().orElse(null); |
||||
|
||||
if (locale == null) { |
||||
locale = LOCALES.stream() |
||||
.filter(_locale -> { |
||||
String language = _locale.getLanguage(); |
||||
return request.getHeader(LOCALE_HEADER_KEY).contains(language); |
||||
}) |
||||
.map(_locale -> { |
||||
String language = _locale.getLanguage(); |
||||
return new Locale(language); |
||||
}) |
||||
.distinct() |
||||
.findFirst().orElse(Locale.KOREAN); |
||||
} |
||||
// log.debug("{}, {}", request.getHeader(LOCALE_HEADER_KEY), locale);
|
||||
return locale; |
||||
} catch (IllegalArgumentException e) { |
||||
log.warn("{}", e.getMessage()); |
||||
return this.getDefaultLocale(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,3 @@
|
||||
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier |
||||
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Value |
||||
lombok.anyConstructor.addConstructorProperties=true |
@ -0,0 +1,7 @@
|
||||
spring: |
||||
datasource: |
||||
pav-kac: |
||||
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy |
||||
jdbc-url: jdbc:log4jdbc:mysql://localhost:13306/PAV_KAC?characterEncoding=UTF-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true |
||||
username: kac |
||||
password: palnet!234 |
@ -0,0 +1,41 @@
|
||||
springdoc: |
||||
api-docs: |
||||
path: /api-docs |
||||
groups: |
||||
enabled: true |
||||
# paths-to-exclude: |
||||
# - /api/v1/utm |
||||
# - /api/bas/flight/** |
||||
# - /api/ctr/cntrl/contains |
||||
# - /api/file/** |
||||
swagger-ui: |
||||
# 각 API의 그룹 표시 순서 |
||||
# path, query, body, response 순으로 출력 |
||||
path: /index.html |
||||
display-request-duration: true |
||||
|
||||
groups-order: ASC |
||||
|
||||
# 태그 정렬 순서. |
||||
# alpha: 알파벳 순 정렬 |
||||
# method: OpenAPI specification file에 원하는 태그 정렬 방식 직접 기재 |
||||
tags-sorter: alpha |
||||
|
||||
# 컨트롤러 정렬 순서. |
||||
# method는 delete - get - patch - post - put 순으로 정렬된다. |
||||
# alpha를 사용해 알파벳 순으로 정렬할 수 있다. |
||||
operations-sorter: alpha |
||||
|
||||
# Spring Actuator의 endpoint까지 보여줄 것인지? |
||||
show-actuator: false |
||||
|
||||
# request media type 의 기본 값 |
||||
default-consumes-media-type: application/json |
||||
|
||||
# response media type 의 기본 값 |
||||
default-produces-media-type: application/json |
||||
|
||||
# Swagger UI에서 기본적으로 펼쳐져 보이는 경로의 수 |
||||
doc-expansion : none |
||||
|
||||
|
@ -0,0 +1,32 @@
|
||||
spring: |
||||
profiles: |
||||
include: |
||||
- database |
||||
- swagger |
||||
threads: |
||||
virtual: |
||||
enabled: true |
||||
jpa: |
||||
hibernate: |
||||
ddl-auto: none |
||||
naming: |
||||
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl |
||||
data: |
||||
redis: |
||||
host: 127.0.0.1 |
||||
port: 6379 |
||||
password : palnet!234 |
||||
logging: |
||||
level: |
||||
kr.co.palnet: DEBUG |
||||
com.com.zaxxer.hikari: INFO |
||||
jdbc: |
||||
audit: OFF |
||||
resultset: OFF |
||||
resultsettable: INFO #SQL 결과 데이터 Table을 로그로 남긴다. |
||||
sqlonly: OFF #SQL만 로그로 남긴다. |
||||
sqltiming: INFO #SQL과 소요시간을 표기한다. |
||||
connection : OFF # 커넥션 확인가능 |
||||
org.hibernate: |
||||
SQL: DEBUG |
||||
type.descriptor.sql.BasicBinder: TRACE |
@ -0,0 +1,2 @@
|
||||
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator |
||||
log4jdbc.dump.sql.maxlinelength=0 |
@ -0,0 +1,22 @@
|
||||
CM001=\uC131\uACF5\uC785\uB2C8\uB2E4. |
||||
CM900=\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uC785\uB2C8\uB2E4. |
||||
CM999=\uC2E4\uD328\uC785\uB2C8\uB2E4. |
||||
CM002=\uC694\uCCAD\uD558\uC2E0 \uB0B4\uC6A9\uC774 \uCC98\uB9AC \uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. |
||||
CM003=\uC785\uCD9C\uB825 \uC624\uB958\uC785\uB2C8\uB2E4. |
||||
CM100=\uB85C\uADF8\uC778\uC744 \uB2E4\uC2DC \uD574\uC8FC\uC138\uC694. |
||||
CM101=\uC774\uBBF8 \uB85C\uADF8\uC778\uD55C \uC0AC\uC6A9\uC790\uC785\uB2C8\uB2E4. |
||||
CM102=\uB85C\uADF8\uC778 \uC2DC\uB3C4\uAC00 \uC815\uD574\uC9C4 \uD69F\uC218\uB97C \uCD08\uACFC\uD558\uC600\uC2B5\uB2C8\uB2E4. |
||||
CM110=SNS \uB85C\uADF8\uC778\uC744 \uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. |
||||
CM111=\uC774\uBBF8 \uAC00\uC785\uB41C SNS \uACC4\uC815\uC785\uB2C8\uB2E4. |
||||
CM120=\uD1A0\uD070\uC774 \uB9CC\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. |
||||
CM121=\uC798\uBABB\uB41C \uD1A0\uD070\uC785\uB2C8\uB2E4. |
||||
CM130=\uC0AC\uC6A9\uC790\uC758 \uACC4\uC815\uC774 \uC815\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4. |
||||
CM131=\uC0AC\uC6A9\uC790\uC758 \uACC4\uC815\uC774 \uD734\uBA74\uC0C1\uD0DC\uC785\uB2C8\uB2E4. |
||||
CM200=\uCE90\uC2DC \uB85C\uB529\uC5D0 \uC2E4\uD328\uD558\uC600\uC2B5\uB2C8\uB2E4. |
||||
CM201=\uCE90\uC2DC \uB9AC\uB85C\uB529\uC5D0 \uC2E4\uD328\uD558\uC600\uC2B5\uB2C8\uB2E4. |
||||
CM401=\uC0AC\uC6A9\uC790\uC758 \uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. |
||||
WB400=\uD30C\uB77C\uBBF8\uD130\uB97C \uB2E4\uC2DC \uD655\uC778 \uD6C4 \uC694\uCCAD\uD574\uC8FC\uC138\uC694. |
||||
WB500=\uC678\uBD80 \uC5F0\uB3D9 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD558\uC600\uC2B5\uB2C8\uB2E4. |
||||
WB404=\uC694\uCCAD\uD558\uC2E0 URL\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. |
||||
DT001=\uC774\uBBF8 \uB4F1\uB85D\uB41C \uB370\uC774\uD130 \uC785\uB2C8\uB2E4. |
||||
DT002=\uC694\uCCAD\uD55C \uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. |
@ -0,0 +1,22 @@
|
||||
CM001=It's a success. |
||||
CM900=Unknown error. |
||||
CM999=It's a failure. |
||||
CM002=Your request has not been processed. |
||||
CM003=Input/output error. |
||||
CM100=Please log in again. |
||||
CM101=This is a user who has already logged in. |
||||
CM102=The login attempt exceeded the specified number of times. |
||||
CM110=I can't log in to SNS. |
||||
CM111=This is an SNS account that has already been subscribed. |
||||
CM120=The token has expired. |
||||
CM121=Invalid token. |
||||
CM130=Your account has been suspended. |
||||
CM131=Your account is dormant. |
||||
CM200=Cache loading failed. |
||||
CM201=Cache reloading failed. |
||||
CM401=You do not have permissions. |
||||
WB400=Please check the parameters again and request them. |
||||
WB500=External interlocking error occurred. |
||||
WB404=The URL you requested does not exist. |
||||
DT001=Data already registered. |
||||
DT002=No data requested. |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,39 @@
|
||||
package kr.co.palnet.kac; |
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper; |
||||
import org.junit.jupiter.api.BeforeEach; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.restdocs.RestDocumentationContextProvider; |
||||
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation; |
||||
import org.springframework.test.web.servlet.MockMvc; |
||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders; |
||||
import org.springframework.web.context.WebApplicationContext; |
||||
import org.springframework.web.filter.CharacterEncodingFilter; |
||||
|
||||
import static org.springframework.restdocs.operation.preprocess.Preprocessors.modifyUris; |
||||
import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; |
||||
|
||||
public class BaseTest { |
||||
|
||||
@Autowired |
||||
protected WebApplicationContext webApplicationContext; |
||||
|
||||
public MockMvc mockMvc; |
||||
|
||||
@BeforeEach |
||||
public void setUpAll(RestDocumentationContextProvider restDocumentationContextProvider){ |
||||
this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) // @Autowired로 빈주입 받은 context
|
||||
.addFilter(new CharacterEncodingFilter("UTF-8", true)) // UTF-8 인코딩 필터
|
||||
.apply( |
||||
MockMvcRestDocumentation.documentationConfiguration(restDocumentationContextProvider) |
||||
.operationPreprocessors() |
||||
.withRequestDefaults( |
||||
modifyUris().scheme("http").host("localhost").port(8080), prettyPrint() // URL 정보를 넣어주시면 됩니다.
|
||||
) |
||||
.withResponseDefaults( |
||||
prettyPrint() |
||||
) |
||||
) |
||||
.build(); |
||||
} |
||||
} |
@ -0,0 +1,608 @@
|
||||
package kr.co.palnet.kac.com.code; |
||||
|
||||
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; |
||||
import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; |
||||
import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; |
||||
import static org.springframework.restdocs.payload.PayloadDocumentation.*; |
||||
import static org.springframework.restdocs.request.RequestDocumentation.*; |
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; |
||||
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; |
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
||||
|
||||
import kr.co.palnet.kac.BaseTest; |
||||
import kr.co.palnet.kac.api.v1.common.code.model.FormCodeGroupRQ; |
||||
import kr.co.palnet.kac.api.v1.common.code.model.FormCodeLangRQ; |
||||
import kr.co.palnet.kac.api.v1.common.code.model.FormCodeRQ; |
||||
import kr.co.palnet.kac.api.v1.common.code.service.ComCodeService; |
||||
import lombok.RequiredArgsConstructor; |
||||
|
||||
import org.junit.jupiter.api.DisplayName; |
||||
import org.junit.jupiter.api.Test; |
||||
import org.junit.jupiter.api.extension.ExtendWith; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.boot.test.context.SpringBootTest; |
||||
import org.springframework.http.MediaType; |
||||
import org.springframework.restdocs.RestDocumentationExtension; |
||||
import org.springframework.restdocs.payload.JsonFieldType; |
||||
import org.springframework.transaction.annotation.Propagation; |
||||
import org.springframework.transaction.annotation.Transactional; |
||||
|
||||
import kr.co.palnet.kac.app.KacAppApplication; |
||||
|
||||
@SpringBootTest(classes = KacAppApplication.class) |
||||
@ExtendWith({RestDocumentationExtension.class}) |
||||
@RequiredArgsConstructor |
||||
public class ComnCodeControllerTest extends BaseTest { |
||||
|
||||
@Autowired |
||||
private ComCodeService comCodeService; |
||||
|
||||
private final String BASE_URL = "/v1/com/code"; |
||||
|
||||
@DisplayName("언어코드 삭제") |
||||
@Test |
||||
public void deleteLang() throws Exception{ |
||||
String groupCd = "NEW_GROUP001"; |
||||
String cdId = "NEW_CODE001"; |
||||
String langDivCd = "ko_KR"; |
||||
|
||||
this.mockMvc.perform( |
||||
delete(this.BASE_URL + "/lang?groupCd=" + groupCd + "&cdId=" + cdId + "&langDivCd=" + langDivCd) |
||||
.contentType(MediaType.APPLICATION_JSON_VALUE) |
||||
.accept(MediaType.APPLICATION_JSON_VALUE) |
||||
) |
||||
.andDo(print()) |
||||
.andDo( |
||||
document( |
||||
"com/code/lang/delete", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
|
||||
preprocessResponse(prettyPrint()), |
||||
queryParameters( |
||||
parameterWithName("groupCd").description("그룹 아이디"), |
||||
parameterWithName("cdId").description("코드 아이디"), |
||||
parameterWithName("langDivCd").description("삭제할 언어코드") |
||||
) |
||||
) |
||||
) |
||||
.andExpect(status().isOk()); |
||||
} |
||||
|
||||
@DisplayName("코드 삭제") |
||||
@Test |
||||
public void deleteCode() throws Exception{ |
||||
String groupCd = "NEW_GROUP001"; |
||||
String cdId = "NEW_CODE001"; |
||||
|
||||
this.mockMvc.perform( |
||||
delete(this.BASE_URL + "/code?groupCd=" + groupCd + "&cdId=" + cdId) |
||||
.contentType(MediaType.APPLICATION_JSON_VALUE) |
||||
.accept(MediaType.APPLICATION_JSON_VALUE) |
||||
) |
||||
.andDo(print()) |
||||
.andDo( |
||||
document( |
||||
"com/code/code/delete", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
|
||||
preprocessResponse(prettyPrint()), |
||||
queryParameters( |
||||
parameterWithName("groupCd").description("그룹 아이디"), |
||||
parameterWithName("cdId").description("코드 아이디") |
||||
) |
||||
) |
||||
) |
||||
.andExpect(status().isOk()); |
||||
} |
||||
|
||||
@DisplayName("그룹 삭제") |
||||
@Test |
||||
public void deleteCodeGroup() throws Exception { |
||||
|
||||
String deleteGroupCd = "NEW_GROUP001"; |
||||
|
||||
this.mockMvc.perform( |
||||
delete(this.BASE_URL + "/group?groupCd=" + deleteGroupCd) |
||||
.contentType(MediaType.APPLICATION_JSON_VALUE) |
||||
.accept(MediaType.APPLICATION_JSON_VALUE) |
||||
) |
||||
.andDo(print()) |
||||
.andDo( |
||||
document( |
||||
"com/code/group/delete", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
|
||||
preprocessResponse(prettyPrint()), |
||||
queryParameters( |
||||
parameterWithName("groupCd").description("그룹 아이디") |
||||
) |
||||
) |
||||
) |
||||
.andExpect(status().isOk()); |
||||
} |
||||
|
||||
@DisplayName("코드의 언어코드 수정") |
||||
@Test |
||||
@Transactional |
||||
public void updateCodeLang() throws Exception{ |
||||
|
||||
String randomNm = "NEW_GROUP_" + System.currentTimeMillis(); |
||||
randomNm = randomNm.substring(0, 20); |
||||
|
||||
FormCodeGroupRQ groupRq = FormCodeGroupRQ.builder().groupCd(randomNm).siteCd("KAC").groupCdNm("신규그룹001").rm("비고....").build(); |
||||
comCodeService.createCodeGroup(groupRq); |
||||
|
||||
FormCodeRQ codeRq = FormCodeRQ.builder().groupCd(randomNm).cdId("NEW_CODE001").upperCd(null).sortOrdr(0).addInfoValue("추가!!").useYn("Y").build(); |
||||
comCodeService.createCode(codeRq); |
||||
|
||||
FormCodeLangRQ langRq = FormCodeLangRQ.builder().groupCd(randomNm).cdId("NEW_CODE001").langDivCd("ko_KR").cdNm("신규코드001").rm("비고....").build(); |
||||
comCodeService.createCodeLang(langRq); |
||||
|
||||
String jsonRQ = """ |
||||
{ |
||||
"groupCd": "%s", |
||||
"cdId": "NEW_CODE001", |
||||
"langDivCd": "ko_KR", |
||||
"cdNm": "신규코드001", |
||||
"rm": "수정..." |
||||
} |
||||
""".formatted(randomNm); |
||||
|
||||
this.mockMvc.perform( |
||||
put(this.BASE_URL + "/lang") |
||||
.contentType(MediaType.APPLICATION_JSON_VALUE) |
||||
.content(jsonRQ) |
||||
.accept(MediaType.APPLICATION_JSON_VALUE) |
||||
) |
||||
.andDo(print()) |
||||
.andDo( |
||||
document( |
||||
"com/code/lang/update", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
|
||||
preprocessResponse(prettyPrint()), |
||||
requestFields( |
||||
fieldWithPath("groupCd").type(JsonFieldType.STRING).description("그룹코드"), |
||||
fieldWithPath("cdId").type(JsonFieldType.STRING).description("코드 아이디"), |
||||
fieldWithPath("langDivCd").type(JsonFieldType.STRING).description("언어코드"), |
||||
fieldWithPath("cdNm").type(JsonFieldType.STRING).description("코드이름[언어별]"), |
||||
fieldWithPath("rm").type(JsonFieldType.STRING).description("비고") |
||||
), |
||||
responseFields( |
||||
fieldWithPath("groupCd").type(JsonFieldType.STRING).description("그룹코드"), |
||||
fieldWithPath("cdId").type(JsonFieldType.STRING).description("코드 아이디"), |
||||
fieldWithPath("langDivCd").type(JsonFieldType.STRING).description("언어코드"), |
||||
fieldWithPath("cdNm").type(JsonFieldType.STRING).description("코드이름[언어별]"), |
||||
fieldWithPath("rm").type(JsonFieldType.STRING).description("비고"), |
||||
fieldWithPath("createUserId").type(JsonFieldType.STRING).description("등록한 유저 아이디"), |
||||
fieldWithPath("createDt").type(JsonFieldType.STRING).description("등록일시"), |
||||
fieldWithPath("updateUserId").type(JsonFieldType.STRING).description("수정한 유저 아이디"), |
||||
fieldWithPath("updateDt").type(JsonFieldType.STRING).description("수정일시") |
||||
) |
||||
) |
||||
) |
||||
.andExpect(status().isOk()); |
||||
} |
||||
|
||||
@DisplayName("코드 수정") |
||||
@Test |
||||
@Transactional |
||||
public void updateCode() throws Exception{ |
||||
|
||||
String randomNm = "NEW_GROUP_" + System.currentTimeMillis(); |
||||
randomNm = randomNm.substring(0, 20); |
||||
|
||||
FormCodeGroupRQ groupRq = FormCodeGroupRQ.builder().groupCd(randomNm).siteCd("KAC").groupCdNm("신규그룹001").rm("비고....").build(); |
||||
comCodeService.createCodeGroup(groupRq); |
||||
|
||||
FormCodeRQ codeRq = FormCodeRQ.builder().groupCd(randomNm).cdId("NEW_CODE001").upperCd(null).sortOrdr(0).addInfoValue("추가!!").useYn("Y").build(); |
||||
comCodeService.createCode(codeRq); |
||||
|
||||
FormCodeLangRQ langRq = FormCodeLangRQ.builder().groupCd(randomNm).cdId("NEW_CODE001").langDivCd("ko_KR").cdNm("신규코드001").rm("비고....").build(); |
||||
comCodeService.createCodeLang(langRq); |
||||
|
||||
String jsonRQ = """ |
||||
{ |
||||
"groupCd": "%s", |
||||
"cdId": "NEW_CODE001", |
||||
"sortOrdr": 0, |
||||
"addInfoValue": "수정!!", |
||||
"useYn": "Y" |
||||
} |
||||
""".formatted(randomNm); |
||||
|
||||
this.mockMvc.perform( |
||||
put(this.BASE_URL + "/code") |
||||
.contentType(MediaType.APPLICATION_JSON_VALUE) |
||||
.content(jsonRQ) |
||||
.accept(MediaType.APPLICATION_JSON_VALUE) |
||||
) |
||||
.andDo(print()) |
||||
.andDo( |
||||
document( |
||||
"com/code/code/update", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
|
||||
preprocessResponse(prettyPrint()), |
||||
requestFields( |
||||
fieldWithPath("groupCd").type(JsonFieldType.STRING).description("그룹코드"), |
||||
fieldWithPath("cdId").type(JsonFieldType.STRING).description("코드 아이디"), |
||||
fieldWithPath("sortOrdr").type(JsonFieldType.NUMBER).description("정렬순서"), |
||||
fieldWithPath("addInfoValue").type(JsonFieldType.STRING).description("추가사항"), |
||||
fieldWithPath("useYn").type(JsonFieldType.STRING).description("사용여부") |
||||
), |
||||
responseFields( |
||||
fieldWithPath("groupCd").type(JsonFieldType.STRING).description("그룹코드"), |
||||
fieldWithPath("cdId").type(JsonFieldType.STRING).description("코드 아이디"), |
||||
fieldWithPath("upperCd").type(JsonFieldType.STRING).description("상위 아이디").optional(), |
||||
fieldWithPath("sortOrdr").type(JsonFieldType.NUMBER).description("정렬순서"), |
||||
fieldWithPath("addInfoValue").type(JsonFieldType.STRING).description("추가사항"), |
||||
fieldWithPath("useYn").type(JsonFieldType.STRING).description("사용여부"), |
||||
fieldWithPath("createUserId").type(JsonFieldType.STRING).description("등록한 유저 아이디"), |
||||
fieldWithPath("createDt").type(JsonFieldType.STRING).description("등록일시"), |
||||
fieldWithPath("updateUserId").type(JsonFieldType.STRING).description("수정한 유저 아이디"), |
||||
fieldWithPath("updateDt").type(JsonFieldType.STRING).description("수정일시") |
||||
) |
||||
) |
||||
) |
||||
.andExpect(status().isOk()); |
||||
} |
||||
|
||||
@DisplayName("그룹 수정") |
||||
@Test |
||||
@Transactional |
||||
public void updateCodeGroup() throws Exception{ |
||||
|
||||
String randomNm = "NEW_GROUP_" + System.currentTimeMillis(); |
||||
randomNm = randomNm.substring(0, 20); |
||||
|
||||
FormCodeGroupRQ groupRq = FormCodeGroupRQ.builder().groupCd(randomNm).siteCd("KAC").groupCdNm("신규그룹001").rm("비고....").build(); |
||||
comCodeService.createCodeGroup(groupRq); |
||||
|
||||
|
||||
String jsonRQ = """ |
||||
{ |
||||
"groupCd": "%s", |
||||
"siteCd": "KAC", |
||||
"groupCdNm": "신규그룹001", |
||||
"rm": "비고...." |
||||
} |
||||
""".formatted(randomNm); |
||||
|
||||
this.mockMvc.perform( |
||||
put(this.BASE_URL + "/group") |
||||
.contentType(MediaType.APPLICATION_JSON_VALUE) |
||||
.content(jsonRQ) |
||||
.accept(MediaType.APPLICATION_JSON_VALUE) |
||||
) |
||||
.andDo(print()) |
||||
.andDo( |
||||
document( |
||||
"com/code/group/update", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
|
||||
preprocessResponse(prettyPrint()), |
||||
requestFields( |
||||
fieldWithPath("groupCd").type(JsonFieldType.STRING).description("그룹코드"), |
||||
fieldWithPath("siteCd").type(JsonFieldType.STRING).description("사이트코드"), |
||||
fieldWithPath("groupCdNm").type(JsonFieldType.STRING).description("그룹이름"), |
||||
fieldWithPath("rm").type(JsonFieldType.STRING).description("비고") |
||||
), |
||||
responseFields( |
||||
fieldWithPath("groupCd").type(JsonFieldType.STRING).description("그룹코드"), |
||||
fieldWithPath("siteCd").type(JsonFieldType.STRING).description("사이트코드"), |
||||
fieldWithPath("groupCdNm").type(JsonFieldType.STRING).description("그룹이름"), |
||||
fieldWithPath("rm").type(JsonFieldType.STRING).description("비고"), |
||||
fieldWithPath("createUserId").type(JsonFieldType.STRING).description("등록한 유저 아이디"), |
||||
fieldWithPath("createDt").type(JsonFieldType.STRING).description("등록일시"), |
||||
fieldWithPath("updateUserId").type(JsonFieldType.STRING).description("수정한 유저 아이디"), |
||||
fieldWithPath("updateDt").type(JsonFieldType.STRING).description("수정일시") |
||||
) |
||||
) |
||||
) |
||||
.andExpect(status().isOk()); |
||||
} |
||||
|
||||
@DisplayName("코드의 언어코드 추가") |
||||
@Test |
||||
@Transactional |
||||
public void createCodeLang() throws Exception{ |
||||
|
||||
String langDivCd = "ko_KR"; |
||||
|
||||
String randomNm = "NEW_GROUP_" + System.currentTimeMillis(); |
||||
randomNm = randomNm.substring(0, 20); |
||||
|
||||
FormCodeGroupRQ groupRq = FormCodeGroupRQ.builder().groupCd(randomNm).siteCd("KAC").groupCdNm("신규그룹001").rm("비고....").build(); |
||||
comCodeService.createCodeGroup(groupRq); |
||||
|
||||
FormCodeRQ codeRq = FormCodeRQ.builder().groupCd(randomNm).cdId("NEW_CODE001").upperCd(null).sortOrdr(0).addInfoValue("추가!!").useYn("Y").build(); |
||||
comCodeService.createCode(codeRq); |
||||
|
||||
String jsonRQ = """ |
||||
{ |
||||
"groupCd": "%s", |
||||
"cdId": "NEW_CODE001", |
||||
"langDivCd": "%s", |
||||
"cdNm": "신규코드001", |
||||
"rm": "비고...." |
||||
} |
||||
""".formatted(randomNm,langDivCd); |
||||
|
||||
this.mockMvc.perform( |
||||
post(this.BASE_URL + "/lang") |
||||
.contentType(MediaType.APPLICATION_JSON_VALUE) |
||||
.content(jsonRQ) |
||||
.accept(MediaType.APPLICATION_JSON_VALUE) |
||||
) |
||||
.andDo(print()) |
||||
.andDo( |
||||
document( |
||||
"com/code/lang/create", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
|
||||
preprocessResponse(prettyPrint()), |
||||
requestFields( |
||||
fieldWithPath("groupCd").type(JsonFieldType.STRING).description("그룹코드"), |
||||
fieldWithPath("cdId").type(JsonFieldType.STRING).description("코드 아이디"), |
||||
fieldWithPath("langDivCd").type(JsonFieldType.STRING).description("언어코드"), |
||||
fieldWithPath("cdNm").type(JsonFieldType.STRING).description("코드이름[언어별]"), |
||||
fieldWithPath("rm").type(JsonFieldType.STRING).description("비고") |
||||
), |
||||
responseFields( |
||||
fieldWithPath("groupCd").type(JsonFieldType.STRING).description("그룹코드"), |
||||
fieldWithPath("cdId").type(JsonFieldType.STRING).description("코드 아이디"), |
||||
fieldWithPath("langDivCd").type(JsonFieldType.STRING).description("언어코드"), |
||||
fieldWithPath("cdNm").type(JsonFieldType.STRING).description("코드이름[언어별]"), |
||||
fieldWithPath("rm").type(JsonFieldType.STRING).description("비고"), |
||||
fieldWithPath("createUserId").type(JsonFieldType.STRING).description("등록한 유저 아이디"), |
||||
fieldWithPath("createDt").type(JsonFieldType.STRING).description("등록일시"), |
||||
fieldWithPath("updateUserId").type(JsonFieldType.STRING).description("수정한 유저 아이디"), |
||||
fieldWithPath("updateDt").type(JsonFieldType.STRING).description("수정일시") |
||||
) |
||||
) |
||||
) |
||||
.andExpect(status().isOk()); |
||||
|
||||
} |
||||
|
||||
@DisplayName("코드 추가") |
||||
@Test |
||||
@Transactional |
||||
public void createCode() throws Exception{ |
||||
String codeNm = "NEW_CODE001"; |
||||
|
||||
String randomNm = "NEW_GROUP_" + System.currentTimeMillis(); |
||||
randomNm = randomNm.substring(0, 20); |
||||
|
||||
FormCodeGroupRQ groupRq = FormCodeGroupRQ.builder().groupCd(randomNm).siteCd("KAC").groupCdNm("신규그룹001").rm("비고....").build(); |
||||
comCodeService.createCodeGroup(groupRq); |
||||
|
||||
String jsonRQ = """ |
||||
{ |
||||
"groupCd": "%s", |
||||
"cdId": "%s", |
||||
"sortOrdr": 0, |
||||
"addInfoValue": "추가!!", |
||||
"useYn": "Y" |
||||
} |
||||
""".formatted(randomNm, codeNm); |
||||
|
||||
this.mockMvc.perform( |
||||
post(this.BASE_URL + "/code") |
||||
.contentType(MediaType.APPLICATION_JSON_VALUE) |
||||
.content(jsonRQ) |
||||
.accept(MediaType.APPLICATION_JSON_VALUE) |
||||
) |
||||
.andDo(print()) |
||||
.andDo( |
||||
document( |
||||
"com/code/code/create", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
|
||||
preprocessResponse(prettyPrint()), |
||||
requestFields( |
||||
fieldWithPath("groupCd").type(JsonFieldType.STRING).description("그룹코드"), |
||||
fieldWithPath("cdId").type(JsonFieldType.STRING).description("코드 아이디"), |
||||
fieldWithPath("sortOrdr").type(JsonFieldType.NUMBER).description("정렬순서"), |
||||
fieldWithPath("addInfoValue").type(JsonFieldType.STRING).description("추가사항"), |
||||
fieldWithPath("useYn").type(JsonFieldType.STRING).description("사용여부") |
||||
), |
||||
responseFields( |
||||
fieldWithPath("groupCd").type(JsonFieldType.STRING).description("그룹코드"), |
||||
fieldWithPath("cdId").type(JsonFieldType.STRING).description("코드 아이디"), |
||||
fieldWithPath("upperCd").type(JsonFieldType.STRING).description("상위 아이디").optional(), |
||||
fieldWithPath("sortOrdr").type(JsonFieldType.NUMBER).description("정렬순서"), |
||||
fieldWithPath("addInfoValue").type(JsonFieldType.STRING).description("추가사항"), |
||||
fieldWithPath("useYn").type(JsonFieldType.STRING).description("사용여부"), |
||||
fieldWithPath("createUserId").type(JsonFieldType.STRING).description("등록한 유저 아이디"), |
||||
fieldWithPath("createDt").type(JsonFieldType.STRING).description("등록일시"), |
||||
fieldWithPath("updateUserId").type(JsonFieldType.STRING).description("수정한 유저 아이디"), |
||||
fieldWithPath("updateDt").type(JsonFieldType.STRING).description("수정일시") |
||||
) |
||||
) |
||||
) |
||||
.andExpect(status().isOk()); |
||||
} |
||||
|
||||
@DisplayName("코드그룹 추가") |
||||
@Test |
||||
@Transactional |
||||
public void createCodeGroup() throws Exception{ |
||||
|
||||
String randomNm = "NEW_GROUP_" + System.currentTimeMillis(); |
||||
randomNm = randomNm.substring(0, 20); |
||||
|
||||
String jsonRQ = """ |
||||
{ |
||||
"groupCd": "%s", |
||||
"siteCd": "KAC", |
||||
"groupCdNm": "신규그룹001", |
||||
"rm": "비고...." |
||||
} |
||||
""".formatted(randomNm); |
||||
|
||||
this.mockMvc.perform( |
||||
post(this.BASE_URL + "/group") |
||||
.contentType(MediaType.APPLICATION_JSON_VALUE) |
||||
.content(jsonRQ) |
||||
.accept(MediaType.APPLICATION_JSON_VALUE) |
||||
) |
||||
.andDo(print()) |
||||
.andDo( |
||||
document( |
||||
"com/code/group/create", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
|
||||
preprocessResponse(prettyPrint()), |
||||
requestFields( |
||||
fieldWithPath("groupCd").type(JsonFieldType.STRING).description("그룹코드"), |
||||
fieldWithPath("siteCd").type(JsonFieldType.STRING).description("사이트코드"), |
||||
fieldWithPath("groupCdNm").type(JsonFieldType.STRING).description("그룹이름"), |
||||
fieldWithPath("rm").type(JsonFieldType.STRING).description("비고") |
||||
), |
||||
responseFields( |
||||
fieldWithPath("groupCd").type(JsonFieldType.STRING).description("그룹코드"), |
||||
fieldWithPath("siteCd").type(JsonFieldType.STRING).description("사이트코드"), |
||||
fieldWithPath("groupCdNm").type(JsonFieldType.STRING).description("그룹이름"), |
||||
fieldWithPath("rm").type(JsonFieldType.STRING).description("비고"), |
||||
fieldWithPath("createUserId").type(JsonFieldType.STRING).description("등록한 유저 아이디"), |
||||
fieldWithPath("createDt").type(JsonFieldType.STRING).description("등록일시"), |
||||
fieldWithPath("updateUserId").type(JsonFieldType.STRING).description("수정한 유저 아이디"), |
||||
fieldWithPath("updateDt").type(JsonFieldType.STRING).description("수정일시") |
||||
) |
||||
) |
||||
) |
||||
.andExpect(status().isOk()); |
||||
} |
||||
|
||||
@DisplayName("모든 코드 조회") |
||||
@Test |
||||
@Transactional(propagation = Propagation.SUPPORTS) |
||||
public void getAllCodeByGroup() throws Exception{ |
||||
|
||||
String randomNm = "NEW_GROUP_" + System.currentTimeMillis(); |
||||
randomNm = randomNm.substring(0, 20); |
||||
|
||||
FormCodeGroupRQ groupRq = FormCodeGroupRQ.builder().groupCd(randomNm).siteCd("KAC").groupCdNm("신규그룹001").rm("비고....").build(); |
||||
comCodeService.createCodeGroup(groupRq); |
||||
|
||||
FormCodeRQ codeRq = FormCodeRQ.builder().groupCd(randomNm).cdId("NEW_CODE001").upperCd(null).sortOrdr(0).addInfoValue("추가!!").useYn("Y").build(); |
||||
comCodeService.createCode(codeRq); |
||||
|
||||
FormCodeLangRQ langRq = FormCodeLangRQ.builder().groupCd(randomNm).cdId("NEW_CODE001").langDivCd("ko_KR").cdNm("신규코드001").rm("비고....").build(); |
||||
comCodeService.createCodeLang(langRq); |
||||
|
||||
String langDivCd = "ko_KR"; |
||||
|
||||
this.mockMvc.perform( |
||||
get(this.BASE_URL + "/code") |
||||
.param("groupCd", randomNm) |
||||
.param("langDivCd", langDivCd) |
||||
.contentType(MediaType.APPLICATION_JSON_VALUE) |
||||
.accept(MediaType.APPLICATION_JSON_VALUE) |
||||
) |
||||
.andDo(print()) |
||||
.andDo( |
||||
document( |
||||
"com/code/code", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
|
||||
preprocessResponse(prettyPrint()), |
||||
queryParameters( |
||||
parameterWithName("groupCd").description("그룹코드"), |
||||
parameterWithName("langDivCd").description("언어코드") |
||||
), |
||||
responseFields( |
||||
fieldWithPath("[].groupCd").type(JsonFieldType.STRING).description("코드의 그룹").optional(), |
||||
fieldWithPath("[].cdId").type(JsonFieldType.STRING).description("코드의 ID").optional(), |
||||
fieldWithPath("[].cdNm").type(JsonFieldType.STRING).description("코드의 이름").optional(), |
||||
fieldWithPath("[].upperCd").type(JsonFieldType.STRING).description("상위 코드의 이름").optional(), |
||||
fieldWithPath("[].sortOrdr").type(JsonFieldType.NUMBER).description("코드의 정렬순서").optional(), |
||||
fieldWithPath("[].addInfoValue").type(JsonFieldType.STRING).description("코드의 추가 밸류").optional(), |
||||
fieldWithPath("[].children").type(JsonFieldType.STRING).description("코드의 하위요소").optional() |
||||
) |
||||
) |
||||
) |
||||
.andExpect(status().isOk()); |
||||
|
||||
// comCodeService.deleteLang(randomNm, "NEW_CODE001", "ko_KR");
|
||||
// comCodeService.deleteCode(randomNm, "NEW_CODE001");
|
||||
comCodeService.deleteCodeGroup(randomNm); |
||||
} |
||||
|
||||
@DisplayName("모든 그룹과 코드 조회") |
||||
@Test |
||||
@Transactional |
||||
public void getAllGroupCode() throws Exception{ |
||||
|
||||
String randomNm = "NEW_GROUP_" + System.currentTimeMillis(); |
||||
randomNm = randomNm.substring(0, 20); |
||||
|
||||
FormCodeGroupRQ groupRq = FormCodeGroupRQ.builder().groupCd(randomNm).siteCd("KAC").groupCdNm("신규그룹001").rm("비고....").build(); |
||||
comCodeService.createCodeGroup(groupRq); |
||||
|
||||
FormCodeRQ codeRq = FormCodeRQ.builder().groupCd(randomNm).cdId("NEW_CODE001").upperCd(null).sortOrdr(0).addInfoValue("추가!!").useYn("Y").build(); |
||||
comCodeService.createCode(codeRq); |
||||
|
||||
FormCodeLangRQ langRq = FormCodeLangRQ.builder().groupCd(randomNm).cdId("NEW_CODE001").langDivCd("ko_KR").cdNm("신규코드001").rm("비고....").build(); |
||||
comCodeService.createCodeLang(langRq); |
||||
|
||||
this.mockMvc.perform( |
||||
get(this.BASE_URL + "/group") |
||||
.contentType(MediaType.APPLICATION_JSON_VALUE) |
||||
.accept(MediaType.APPLICATION_JSON_VALUE) |
||||
) |
||||
.andDo(print()) |
||||
.andDo( |
||||
document( |
||||
"com/code/group", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
|
||||
preprocessResponse(prettyPrint()), |
||||
responseFields( |
||||
fieldWithPath("[].groupCd").type(JsonFieldType.STRING).description("그룹 코드").optional(), |
||||
fieldWithPath("[].siteCd").type(JsonFieldType.STRING).description("사이트 코드").optional(), |
||||
fieldWithPath("[].groupCdNm").type(JsonFieldType.STRING).description("그룹 명").optional(), |
||||
fieldWithPath("[].rm").type(JsonFieldType.STRING).description("비고").optional(), |
||||
fieldWithPath("[].codeList").type(JsonFieldType.ARRAY).description("그룹에 포함된 코드 리스트").optional() |
||||
) |
||||
) |
||||
) |
||||
.andExpect(status().isOk()); |
||||
} |
||||
|
||||
@DisplayName("모든 그룹 조회") |
||||
@Test |
||||
@Transactional |
||||
public void getAllGroup() throws Exception{ |
||||
|
||||
String randomNm = "NEW_GROUP_" + System.currentTimeMillis(); |
||||
randomNm = randomNm.substring(0, 20); |
||||
|
||||
FormCodeGroupRQ groupRq = FormCodeGroupRQ.builder().groupCd(randomNm).siteCd("KAC").groupCdNm("신규그룹001").rm("비고....").build(); |
||||
comCodeService.createCodeGroup(groupRq); |
||||
|
||||
FormCodeRQ codeRq = FormCodeRQ.builder().groupCd(randomNm).cdId("NEW_CODE001").upperCd(null).sortOrdr(0).addInfoValue("추가!!").useYn("Y").build(); |
||||
comCodeService.createCode(codeRq); |
||||
|
||||
FormCodeLangRQ langRq = FormCodeLangRQ.builder().groupCd(randomNm).cdId("NEW_CODE001").langDivCd("ko_KR").cdNm("신규코드001").rm("비고....").build(); |
||||
comCodeService.createCodeLang(langRq); |
||||
|
||||
String siteCd = "KAC"; |
||||
String langDivCd = "ko_KR"; |
||||
|
||||
this.mockMvc.perform( |
||||
get(this.BASE_URL + "/all") |
||||
.param("siteCd", siteCd) |
||||
.param("langDivCd", langDivCd) |
||||
.contentType(MediaType.APPLICATION_JSON_VALUE) |
||||
.accept(MediaType.APPLICATION_JSON_VALUE) |
||||
) |
||||
.andDo(print()) |
||||
.andDo( |
||||
document( |
||||
"com/code/all", // gradle build를 하게 되면 generated-snippets에 만들어질 폴더이름
|
||||
preprocessResponse(prettyPrint()), |
||||
queryParameters( |
||||
parameterWithName("siteCd").description("사이트코드"), |
||||
parameterWithName("langDivCd").description("언어코드") |
||||
), |
||||
responseFields( |
||||
fieldWithPath("[].groupCd").type(JsonFieldType.STRING).description("그룹 코드").optional(), |
||||
fieldWithPath("[].siteCd").type(JsonFieldType.STRING).description("사이트 코드").optional(), |
||||
fieldWithPath("[].groupCdNm").type(JsonFieldType.STRING).description("그룹 명").optional(), |
||||
fieldWithPath("[].rm").type(JsonFieldType.STRING).description("비고").optional(), |
||||
fieldWithPath("[].codeList").type(JsonFieldType.ARRAY).description("그룹에 포함된 코드 리스트").optional(), |
||||
fieldWithPath("[].codeList[].groupCd").type(JsonFieldType.STRING).description("코드의 그룹").optional(), |
||||
fieldWithPath("[].codeList[].cdId").type(JsonFieldType.STRING).description("코드의 ID").optional(), |
||||
fieldWithPath("[].codeList[].cdNm").type(JsonFieldType.STRING).description("코드의 이름").optional(), |
||||
fieldWithPath("[].codeList[].upperCd").type(JsonFieldType.STRING).description("상위 코드의 이름").optional(), |
||||
fieldWithPath("[].codeList[].sortOrdr").type(JsonFieldType.NUMBER).description("코드의 정렬순서").optional(), |
||||
fieldWithPath("[].codeList[].addInfoValue").type(JsonFieldType.STRING).description("코드의 추가 밸류").optional(), |
||||
fieldWithPath("[].codeList[].children").type(JsonFieldType.STRING).description("코드의 하위요소").optional() |
||||
) |
||||
) |
||||
) |
||||
.andExpect(status().isOk()); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,11 @@
|
||||
.+{{path}}+ |
||||
|=== |
||||
|파라미터|설명|필수 |
||||
|
||||
{{#parameters}} |
||||
|{{#tableCellContent}}`+{{name}}+`{{/tableCellContent}} |
||||
|{{#tableCellContent}}{{description}}{{/tableCellContent}} |
||||
|{{#tableCellContent}}{{#optional}}false{{/optional}}{{^optional}}true{{/optional}}{{/tableCellContent}} |
||||
|
||||
{{/parameters}} |
||||
|=== |
@ -0,0 +1,10 @@
|
||||
|=== |
||||
|파라미터|설명|필수 |
||||
|
||||
{{#parameters}} |
||||
|{{#tableCellContent}}`+{{name}}+`{{/tableCellContent}} |
||||
|{{#tableCellContent}}{{description}}{{/tableCellContent}} |
||||
|{{#tableCellContent}}{{#optional}}false{{/optional}}{{^optional}}true{{/optional}}{{/tableCellContent}} |
||||
|
||||
{{/parameters}} |
||||
|=== |
@ -0,0 +1,12 @@
|
||||
|=== |
||||
|파라미터|타입|설명|필수 |
||||
|
||||
{{#fields}} |
||||
|
||||
|{{#tableCellContent}}`+{{path}}+`{{/tableCellContent}} |
||||
|{{#tableCellContent}}`+{{type}}+`{{/tableCellContent}} |
||||
|{{#tableCellContent}}{{description}}{{/tableCellContent}} |
||||
|{{#tableCellContent}}{{#optional}}false{{/optional}}{{^optional}}true{{/optional}}{{/tableCellContent}} |
||||
|
||||
{{/fields}} |
||||
|=== |
@ -0,0 +1,10 @@
|
||||
|=== |
||||
|파라미터|설명|필수 |
||||
|
||||
{{#headers}} |
||||
|{{#tableCellContent}}`+{{name}}+`{{/tableCellContent}} |
||||
|{{#tableCellContent}}{{description}}{{/tableCellContent}} |
||||
|{{#tableCellContent}}{{#optional}}false{{/optional}}{{^optional}}true{{/optional}}{{/tableCellContent}} |
||||
|
||||
{{/headers}} |
||||
|=== |
@ -0,0 +1,12 @@
|
||||
|=== |
||||
|파라미터|타입|설명|필수 |
||||
|
||||
{{#fields}} |
||||
|
||||
|{{#tableCellContent}}`+{{path}}+`{{/tableCellContent}} |
||||
|{{#tableCellContent}}`+{{type}}+`{{/tableCellContent}} |
||||
|{{#tableCellContent}}{{description}}{{/tableCellContent}} |
||||
|{{#tableCellContent}}{{#optional}}false{{/optional}}{{^optional}}true{{/optional}}{{/tableCellContent}} |
||||
|
||||
{{/fields}} |
||||
|=== |
@ -0,0 +1,6 @@
|
||||
|
||||
|
||||
dependencies { |
||||
implementation "$boot:spring-boot-starter-web" |
||||
} |
||||
|
@ -0,0 +1,4 @@
|
||||
package kr.co.palnet.kac.core; |
||||
|
||||
public class Sample { |
||||
} |
@ -0,0 +1,54 @@
|
||||
package kr.co.palnet.kac.core.exception; |
||||
|
||||
|
||||
import org.springframework.http.HttpStatus; |
||||
|
||||
public enum BaseErrorCode { |
||||
SUCCESS("CM001", HttpStatus.OK, "성공"), |
||||
FAILED("CM900", HttpStatus.INTERNAL_SERVER_ERROR, "실패"), |
||||
UNKNOWN("CM999", HttpStatus.INTERNAL_SERVER_ERROR, "실패(사용자 정의 없는 에러)"), |
||||
NOT_PROCESS("CM002", HttpStatus.INTERNAL_SERVER_ERROR, "처리되지 않음"), |
||||
IO_ERROR("CM003", HttpStatus.INTERNAL_SERVER_ERROR, "IO 에러"), |
||||
LOGIN_FAILED("CM100", HttpStatus.INTERNAL_SERVER_ERROR, "로그인 실패"), |
||||
LOGIN_DUPLICATED("CM101", HttpStatus.INTERNAL_SERVER_ERROR, "중복 로그인"), |
||||
LOGIN_ATTEMPT_COUNT("CM102", HttpStatus.INTERNAL_SERVER_ERROR, "로그인 실패 횟수 초과"), |
||||
LOGIN_SNS_FAILED("CM110", HttpStatus.INTERNAL_SERVER_ERROR, "SNS 로그인 실패"), |
||||
LOGIN_SNS_DUPLICATED("CM111", HttpStatus.INTERNAL_SERVER_ERROR, "SNS 가입 중복"), |
||||
TOKEN_EXPIRED("CM120", HttpStatus.INTERNAL_SERVER_ERROR, "토큰 만료"), |
||||
TOKEN_INVALID("CM121", HttpStatus.INTERNAL_SERVER_ERROR, "잘못된 토큰"), |
||||
ACCOUNT_LOCK("CM130", HttpStatus.INTERNAL_SERVER_ERROR, "계정 잠김"), |
||||
ACCOUNT_DORMANT("CM131", HttpStatus.INTERNAL_SERVER_ERROR, "휴면 계정"), |
||||
CACHE_LOAD_FAILED("CM200", HttpStatus.INTERNAL_SERVER_ERROR, "캐시 로딩 실패"), |
||||
CACHE_RELOAD_FAILED("CM201", HttpStatus.INTERNAL_SERVER_ERROR, "캐시 리로딩 실패"), |
||||
AUTH_EMPTY("CM401", HttpStatus.UNAUTHORIZED, "권한 없음"), |
||||
WEB_PARAM_INVALID("WB400", HttpStatus.INTERNAL_SERVER_ERROR, "잘못된 파라미터"), |
||||
WEB_NOT_FOUND("WB404", HttpStatus.INTERNAL_SERVER_ERROR, "찾을수 없는 페이지"), |
||||
WEB_API_ERROR("WB500", HttpStatus.INTERNAL_SERVER_ERROR, "외부 연동 에러"), |
||||
DATA_ALREADY_EXISTS("DT001", HttpStatus.INTERNAL_SERVER_ERROR, "이미 등록된 데이터"), |
||||
DATA_EMPTY("DT002", HttpStatus.INTERNAL_SERVER_ERROR, "데이터 없음"); |
||||
|
||||
|
||||
private final String code; |
||||
|
||||
private final HttpStatus status; |
||||
|
||||
private final String message; |
||||
|
||||
private BaseErrorCode(String code, HttpStatus status, String message) { |
||||
this.code = code; |
||||
this.status = status; |
||||
this.message = message; |
||||
} |
||||
|
||||
public String code() { |
||||
return this.code; |
||||
} |
||||
|
||||
public String message() { |
||||
return this.message; |
||||
} |
||||
|
||||
public HttpStatus status() { |
||||
return this.status; |
||||
} |
||||
} |
@ -0,0 +1,132 @@
|
||||
package kr.co.palnet.kac.core.exception; |
||||
|
||||
import lombok.Getter; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.context.MessageSource; |
||||
|
||||
import java.util.Locale; |
||||
|
||||
@Getter |
||||
public class BaseException extends RuntimeException { |
||||
|
||||
|
||||
private final BaseErrorCode errorCode; |
||||
|
||||
private final String logMessage; |
||||
|
||||
private final Level level; |
||||
|
||||
private final Object[] paramArray; |
||||
|
||||
public BaseException() { |
||||
this(BaseErrorCode.FAILED, null, Level.WARN, null); |
||||
} |
||||
|
||||
public BaseException(Object[] paramArray) { |
||||
this(BaseErrorCode.FAILED, null, Level.WARN, paramArray); |
||||
} |
||||
|
||||
public BaseException(Level level) { |
||||
this(BaseErrorCode.FAILED, null, level, null); |
||||
} |
||||
|
||||
public BaseException(Level level, Object[] paramArray) { |
||||
this(BaseErrorCode.FAILED, null, level, paramArray); |
||||
} |
||||
|
||||
public BaseException(String logMessage) { |
||||
this(BaseErrorCode.FAILED, logMessage, Level.WARN, null); |
||||
} |
||||
|
||||
public BaseException(String logMessage, Object[] paramArray) { |
||||
this(BaseErrorCode.FAILED, logMessage, Level.WARN, paramArray); |
||||
} |
||||
|
||||
public BaseException(String logMessage, Level level) { |
||||
this(BaseErrorCode.FAILED, logMessage, level, null); |
||||
} |
||||
|
||||
public BaseException(String logMessage, Level level, Object[] paramArray) { |
||||
this(BaseErrorCode.FAILED, logMessage, level, paramArray); |
||||
} |
||||
|
||||
public BaseException(BaseErrorCode errorCode) { |
||||
this(errorCode, null, Level.WARN, null); |
||||
} |
||||
|
||||
public BaseException(BaseErrorCode errorCode, Object[] paramArray) { |
||||
this(errorCode, null, Level.WARN, paramArray); |
||||
} |
||||
|
||||
public BaseException(BaseErrorCode errorCode, Level level) { |
||||
this(errorCode, null, level, null); |
||||
} |
||||
|
||||
public BaseException(BaseErrorCode errorCode, Level level, Object[] paramArray) { |
||||
this(errorCode, null, level, paramArray); |
||||
} |
||||
|
||||
public BaseException(BaseErrorCode errorCode, String logMessage) { |
||||
this(errorCode, logMessage, Level.WARN, null); |
||||
} |
||||
|
||||
public BaseException(BaseErrorCode errorCode, String logMessage, Object[] paramArray) { |
||||
this(errorCode, logMessage, Level.WARN, paramArray); |
||||
} |
||||
|
||||
public BaseException(BaseErrorCode errorCode, String logMessage, Level level) { |
||||
this(errorCode, logMessage, level, null); |
||||
} |
||||
|
||||
public BaseException(BaseErrorCode errorCode, String logMessage, Level level, Object[] paramArray) { |
||||
this.errorCode = errorCode; |
||||
this.logMessage = logMessage; |
||||
this.level = level; |
||||
this.paramArray = paramArray; |
||||
} |
||||
|
||||
public BaseException(String message, BaseErrorCode errorCode, String logMessage, Level level, Object[] paramArray) { |
||||
super(message); |
||||
this.errorCode = errorCode; |
||||
this.logMessage = logMessage; |
||||
this.level = level; |
||||
this.paramArray = paramArray; |
||||
} |
||||
|
||||
public BaseException(String message, Throwable cause, BaseErrorCode errorCode, String logMessage, Level level, Object[] paramArray) { |
||||
super(message, cause); |
||||
this.errorCode = errorCode; |
||||
this.logMessage = logMessage; |
||||
this.level = level; |
||||
this.paramArray = paramArray; |
||||
} |
||||
|
||||
public BaseException(Throwable cause, BaseErrorCode errorCode, String logMessage, Level level, Object[] paramArray) { |
||||
super(cause); |
||||
this.errorCode = errorCode; |
||||
this.logMessage = logMessage; |
||||
this.level = level; |
||||
this.paramArray = paramArray; |
||||
} |
||||
|
||||
public BaseException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, BaseErrorCode errorCode, String logMessage, Level level, Object[] paramArray) { |
||||
super(message, cause, enableSuppression, writableStackTrace); |
||||
this.errorCode = errorCode; |
||||
this.logMessage = logMessage; |
||||
this.level = level; |
||||
this.paramArray = paramArray; |
||||
} |
||||
|
||||
public String getCode() { |
||||
return errorCode.code(); |
||||
} |
||||
|
||||
public String getErrorMessage(MessageSource ms) { |
||||
if (ms == null) { |
||||
return BaseErrorCode.UNKNOWN.message(); |
||||
} |
||||
return ms.getMessage(getCode(), getParamArray(), BaseErrorCode.UNKNOWN.message(), Locale.getDefault()); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,9 @@
|
||||
package kr.co.palnet.kac.core.exception; |
||||
|
||||
public enum Level { |
||||
TRACE, |
||||
DEBUG, |
||||
INFO, |
||||
WARN, |
||||
ERROR |
||||
} |
@ -0,0 +1,28 @@
|
||||
package kr.co.palnet.kac.core.exception.model; |
||||
|
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Builder; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
|
||||
import java.time.Instant; |
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
public class BaseErrorModel { |
||||
|
||||
private Instant timestamp; |
||||
|
||||
private int status; |
||||
|
||||
private String error; |
||||
|
||||
private String path; |
||||
|
||||
private String message; |
||||
|
||||
private String code; |
||||
|
||||
} |
@ -0,0 +1,7 @@
|
||||
|
||||
|
||||
dependencies { |
||||
// implementation "$boot:spring-boot-starter" |
||||
// implementation "$boot:spring-boot-starter-json" |
||||
implementation "$boot:spring-boot-starter-json" |
||||
} |
@ -0,0 +1,87 @@
|
||||
package kr.co.palnet.kac.util; |
||||
|
||||
import lombok.extern.slf4j.Slf4j; |
||||
|
||||
import javax.crypto.Cipher; |
||||
import javax.crypto.spec.IvParameterSpec; |
||||
import javax.crypto.spec.SecretKeySpec; |
||||
import java.nio.charset.StandardCharsets; |
||||
import java.util.Base64; |
||||
|
||||
@Slf4j |
||||
public class EncryptUtil { |
||||
|
||||
// 16byte
|
||||
private static String ENCRYPT_KEY = "__DEFAULT__KEY__"; |
||||
private static String ENCRYPT_IV = "DEFAULT_IV_VALUE"; |
||||
|
||||
public static void setEncryptKey(String encryptKey) { |
||||
ENCRYPT_KEY = encryptKey; |
||||
} |
||||
|
||||
public static void setEncryptIv(String encryptIv) { |
||||
ENCRYPT_IV = encryptIv; |
||||
} |
||||
|
||||
public static String encrypt(String value) { |
||||
return encrypt(ENCRYPT_KEY, ENCRYPT_IV, value); |
||||
} |
||||
|
||||
public static String decrypt(String encrypted) { |
||||
return decrypt(ENCRYPT_KEY, ENCRYPT_IV, encrypted); |
||||
} |
||||
|
||||
// 암호화
|
||||
public static String encrypt(String key, String initVector, String value) { |
||||
// log.info("encrypt() key: {}, initVector: {}, value: {}", key, initVector, value);
|
||||
try { |
||||
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes(StandardCharsets.UTF_8)); |
||||
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES"); |
||||
|
||||
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); |
||||
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); |
||||
// cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
|
||||
byte[] encrypted = cipher.doFinal(value.getBytes()); |
||||
Base64.Encoder encoder = Base64.getEncoder(); |
||||
String encodedString = encoder.encodeToString(encrypted); |
||||
log.debug("encrypted string: {}", encodedString); |
||||
return encodedString; |
||||
} catch (Exception e) { |
||||
log.error("encrypt() Exception: {}", e.getMessage()); |
||||
} |
||||
return value; |
||||
} |
||||
|
||||
// 복호화
|
||||
public static String decrypt(String key, String initVector, String encrypted) { |
||||
// log.info("decrypt() key: {}, initVector: {}, encrypted: {}", key, initVector, encrypted);
|
||||
try { |
||||
|
||||
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes(StandardCharsets.UTF_8)); |
||||
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES"); |
||||
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); |
||||
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); |
||||
//cipher.init(Cipher.DECRYPT_MODE, skeySpec);
|
||||
Base64.Decoder decoder = Base64.getDecoder(); |
||||
byte[] original = cipher.doFinal(decoder.decode(encrypted)); |
||||
|
||||
return new String(original); |
||||
} catch (Exception e) { |
||||
log.error("decrypt() Exception: {}", e.getMessage()); |
||||
} |
||||
return encrypted; |
||||
} |
||||
|
||||
public static void main(String[] args) { |
||||
String key = "1234567890123456"; |
||||
String initVector = "1234567890123456"; |
||||
String test = "test"; |
||||
|
||||
// WkaOhqSK03Z1pSuPOdc03w==
|
||||
// WkaOhqSK03Z1pSuPOdc03w==
|
||||
String encrypted = encrypt(test); |
||||
log.info("encrypted: {}", encrypted); |
||||
String decrypted = decrypt(encrypted); |
||||
log.info("decrypted: {}", decrypted); |
||||
} |
||||
} |
@ -0,0 +1,128 @@
|
||||
package kr.co.palnet.kac.util; |
||||
|
||||
import kr.co.palnet.kac.util.kisa.KISA_SEED_CBC; |
||||
import kr.co.palnet.kac.util.kisa.KISA_SEED_CTR; |
||||
import kr.co.palnet.kac.util.kisa.KISA_SEED_ECB; |
||||
import kr.co.palnet.kac.util.kisa.KISA_SHA256; |
||||
|
||||
import java.nio.charset.StandardCharsets; |
||||
import java.util.Base64; |
||||
|
||||
public class KisaEncryptUtil { |
||||
// 사용자가 지정하는 입력 키 (16 bytes)
|
||||
private final static String PBSZ_USER_KEY = "PBSZ_USER_KEY___"; // 16 bytes
|
||||
// 사용자가 지정하는 초기화 벡트 (16 bytes)
|
||||
private final static String PBSZ_VECTOR = "PBSZ_INIT_VECTOR"; // 16 bytes
|
||||
public static class EcbEncrypt { |
||||
public static String encrypt(String value) { |
||||
byte[] ecbEncBytes = KISA_SEED_ECB.SEED_ECB_Encrypt(PBSZ_USER_KEY.getBytes(StandardCharsets.UTF_8), value.getBytes(StandardCharsets.UTF_8), 0, value.getBytes(StandardCharsets.UTF_8).length); |
||||
Base64.Encoder encoder = Base64.getEncoder(); |
||||
byte[] ecbEncode = encoder.encode(ecbEncBytes); |
||||
return new String(ecbEncode); |
||||
} |
||||
|
||||
public static String decrypt(String value) { |
||||
Base64.Decoder decoder = Base64.getDecoder(); |
||||
byte[] ecbDecoder = decoder.decode(value.getBytes(StandardCharsets.UTF_8)); |
||||
byte[] ecbDecBytes = KISA_SEED_ECB.SEED_ECB_Decrypt(PBSZ_USER_KEY.getBytes(StandardCharsets.UTF_8), ecbDecoder, 0, ecbDecoder.length); |
||||
return new String(ecbDecBytes); |
||||
} |
||||
} |
||||
|
||||
public static class CbcEncrypt { |
||||
public static String encrypt(String value) { |
||||
byte[] ecbEncBytes = KISA_SEED_CBC.SEED_CBC_Encrypt( |
||||
PBSZ_USER_KEY.getBytes(StandardCharsets.UTF_8), |
||||
PBSZ_VECTOR.getBytes(StandardCharsets.UTF_8), |
||||
value.getBytes(StandardCharsets.UTF_8), |
||||
0, |
||||
value.getBytes(StandardCharsets.UTF_8).length |
||||
); |
||||
Base64.Encoder encoder = Base64.getEncoder(); |
||||
byte[] ecbEncode = encoder.encode(ecbEncBytes); |
||||
return new String(ecbEncode); |
||||
} |
||||
|
||||
public static String decrypt(String value) { |
||||
Base64.Decoder decoder = Base64.getDecoder(); |
||||
byte[] ecbDecoder = decoder.decode(value.getBytes(StandardCharsets.UTF_8)); |
||||
byte[] ecbDecBytes = KISA_SEED_CBC.SEED_CBC_Decrypt( |
||||
PBSZ_USER_KEY.getBytes(StandardCharsets.UTF_8), |
||||
PBSZ_VECTOR.getBytes(StandardCharsets.UTF_8), |
||||
ecbDecoder, |
||||
0, |
||||
ecbDecoder.length |
||||
); |
||||
return new String(ecbDecBytes); |
||||
} |
||||
} |
||||
|
||||
public static class CtrEncrypt { |
||||
|
||||
public static String encrypt(String value) { |
||||
byte[] encBytes = KISA_SEED_CTR.SEED_CTR_Encrypt( |
||||
PBSZ_USER_KEY.getBytes(StandardCharsets.UTF_8), |
||||
PBSZ_VECTOR.getBytes(StandardCharsets.UTF_8), |
||||
value.getBytes(StandardCharsets.UTF_8), |
||||
0, |
||||
value.getBytes(StandardCharsets.UTF_8).length |
||||
); |
||||
Base64.Encoder encoder = Base64.getEncoder(); |
||||
byte[] encodeBytes = encoder.encode(encBytes); |
||||
return new String(encodeBytes); |
||||
} |
||||
public static String decrypt(String value) { |
||||
Base64.Decoder decoder = Base64.getDecoder(); |
||||
byte[] decodeBytes = decoder.decode(value.getBytes(StandardCharsets.UTF_8)); |
||||
|
||||
byte[] decBytes = KISA_SEED_CTR.SEED_CTR_Decrypt( |
||||
PBSZ_USER_KEY.getBytes(StandardCharsets.UTF_8), |
||||
PBSZ_VECTOR.getBytes(StandardCharsets.UTF_8), |
||||
decodeBytes, |
||||
0, |
||||
decodeBytes.length |
||||
); |
||||
return new String(decBytes); |
||||
} |
||||
} |
||||
|
||||
public static class ShaEncrypt { |
||||
public static String encrypt(String value) { |
||||
byte[] bytes = value.getBytes(StandardCharsets.UTF_8); |
||||
byte[] pszDigest = new byte[32]; |
||||
KISA_SHA256.SHA256_Encrpyt(bytes, bytes.length, pszDigest); |
||||
StringBuffer encrypted = new StringBuffer(); |
||||
for (int i = 0; i < 32; i++) { |
||||
encrypted.append(String.format("%02x", pszDigest[i])); |
||||
} |
||||
return encrypted.toString(); |
||||
} |
||||
} |
||||
|
||||
|
||||
public static void main(String[] args) { |
||||
String message = "this is message!!@#!$^#$%^&@#$~!@ 메시지 입니다.___+_+)(_)("; |
||||
System.out.println("message = " + message); |
||||
System.out.println("=============== ECB ================="); |
||||
String ecbEncStr = EcbEncrypt.encrypt(message); |
||||
System.out.println("ecbEncStr = " + ecbEncStr); |
||||
String ecbDecStr = EcbEncrypt.decrypt(ecbEncStr); |
||||
System.out.println("ecbDecStr = " + ecbDecStr); |
||||
|
||||
System.out.println("=============== CBC ================="); |
||||
String cbcEncStr = CbcEncrypt.encrypt(message); |
||||
System.out.println("cbcEncStr = " + cbcEncStr); |
||||
String cbcDncStr = CbcEncrypt.decrypt(cbcEncStr); |
||||
System.out.println("cbcDncStr = " + cbcDncStr); |
||||
|
||||
System.out.println("=============== CTR ================="); |
||||
String ctrEncStr = CtrEncrypt.encrypt(message); |
||||
System.out.println("ctrEncStr = " + ctrEncStr); |
||||
String ctrDncStr = CtrEncrypt.decrypt(ctrEncStr); |
||||
System.out.println("ctrDncStr = " + ctrDncStr); |
||||
|
||||
System.out.println("=============== SHA ================="); |
||||
String shaEncStr = ShaEncrypt.encrypt(message); |
||||
System.out.println("shaEncStr = " + shaEncStr); |
||||
} |
||||
} |
@ -0,0 +1,106 @@
|
||||
package kr.co.palnet.kac.util; |
||||
|
||||
import java.util.regex.Matcher; |
||||
import java.util.regex.Pattern; |
||||
|
||||
public class MaskingUtil { |
||||
|
||||
public static String maskString(String originalString, int start, int end) { |
||||
String mask = originalString.substring(start, end).replaceAll(".", "*"); |
||||
return originalString.substring(0, start) + mask + originalString.substring(end); |
||||
} |
||||
|
||||
public static String maskStringEndWith(String originalString, int end) { |
||||
return maskString(originalString, 0, end); |
||||
} |
||||
|
||||
public static String maskStringStartWith(String originalString, int start) { |
||||
return maskString(originalString, start, originalString.length()); |
||||
} |
||||
|
||||
public static String maskEmail(String email) { |
||||
return email.replaceAll("(?<=.{3}).(?=[^@]*?@)", "*"); |
||||
} |
||||
|
||||
public static String maskEmailAndDomain(String email) { |
||||
String regex = "(.+)@(.+)"; |
||||
|
||||
Pattern pattern = Pattern.compile(regex); |
||||
Matcher matcher = pattern.matcher(email); |
||||
if (matcher.find()) { |
||||
String localPart = matcher.group(1); |
||||
String domain = matcher.group(2); |
||||
|
||||
localPart = maskString(localPart, 3, localPart.length()); |
||||
domain = maskString(domain, 3, domain.length()); |
||||
return localPart + "@" + domain; |
||||
} |
||||
return email; |
||||
} |
||||
|
||||
public static String maskCardNumber(String cardNumber) { |
||||
// return cardNumber.replaceAll("\\b(\\d{6})(\\d+)(\\d{4})\\b", "$1****$2");
|
||||
// 하이픈 제거
|
||||
String cardNumberWithoutHyphens = cardNumber.replace("-", ""); |
||||
|
||||
// 마스킹 적용
|
||||
StringBuffer sb = new StringBuffer(); |
||||
Pattern pattern = Pattern.compile("(\\d{6})(\\d+)(\\d{4})"); |
||||
Matcher matcher = pattern.matcher(cardNumberWithoutHyphens); |
||||
while (matcher.find()) { |
||||
matcher.appendReplacement(sb, matcher.group(1) + "*".repeat(matcher.group(2).length()) + matcher.group(3)); |
||||
} |
||||
matcher.appendTail(sb); |
||||
String maskedCardNumber = sb.toString(); |
||||
|
||||
// Return the card number in the original format
|
||||
return cardNumber.contains("-") |
||||
? maskedCardNumber.replaceAll("(\\d{4})(.{4})(.{4})(\\d{3,4})", "$1-$2-$3-$4") |
||||
: maskedCardNumber; |
||||
|
||||
} |
||||
|
||||
|
||||
public static String maskName(String name) { |
||||
if (name.length() == 1) { |
||||
return "*"; |
||||
} else if (name.length() == 2) { |
||||
return name.replaceAll("(?<=.).", "*"); |
||||
} else { |
||||
return name.replaceAll("(?<=.).(?=.)", "*"); |
||||
} |
||||
} |
||||
|
||||
public static String maskPhoneNumber(String phoneNumber) { |
||||
// 하이픈 제거
|
||||
String phoneNumberWithoutHyphens = phoneNumber.replace("-", ""); |
||||
|
||||
// 마스킹 적용
|
||||
StringBuffer sb = new StringBuffer(); |
||||
Pattern pattern = Pattern.compile("(02|0\\d{2})(\\d+)(\\d{4})"); |
||||
Matcher matcher = pattern.matcher(phoneNumberWithoutHyphens); |
||||
while (matcher.find()) { |
||||
matcher.appendReplacement(sb, matcher.group(1) + "*".repeat(matcher.group(2).length()) + matcher.group(3)); |
||||
} |
||||
matcher.appendTail(sb); |
||||
String maskedPhoneNumber = sb.toString(); |
||||
return phoneNumber.contains("-") |
||||
? maskedPhoneNumber.replaceAll("(\\d{2,3})(.{3,4})(\\d{4})", "$1-$2-$3") |
||||
: maskedPhoneNumber; |
||||
} |
||||
|
||||
public static String maskExpireDate(String expireDate) { |
||||
return expireDate.replaceAll("(\\d{2})(\\d{2})", "$1/$2"); |
||||
} |
||||
|
||||
|
||||
public static String maskResidentRegistrationNumber(String rrn) { |
||||
return rrn.replaceAll("(\\d{6}-?\\d{1})(\\d{6})", "$1******"); |
||||
} |
||||
|
||||
public static String maskIp(String ip) { |
||||
return ip.replaceAll("^(\\d+)(\\.\\d+\\.\\d+\\.\\d+)$", "***$2"); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,52 @@
|
||||
package kr.co.palnet.kac.util; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude; |
||||
import com.fasterxml.jackson.databind.DeserializationFeature; |
||||
import com.fasterxml.jackson.databind.MapperFeature; |
||||
import com.fasterxml.jackson.databind.ObjectMapper; |
||||
import com.fasterxml.jackson.databind.SerializationFeature; |
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; |
||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; |
||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; |
||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; |
||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; |
||||
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; |
||||
|
||||
import java.time.format.DateTimeFormatter; |
||||
import java.util.TimeZone; |
||||
|
||||
/** |
||||
* packageName : com.sumair.common.core.utils |
||||
* fileName : ObjectMapperUtils |
||||
* author : dhji |
||||
* date : 2023-05-17(017) |
||||
* description : |
||||
* =========================================================== |
||||
* DATE AUTHOR NOTE |
||||
* ----------------------------------------------------------- |
||||
* 2023-05-17(017) dhji 최초 생성 |
||||
*/ |
||||
public class ObjectMapperUtils { |
||||
public static ObjectMapper getObjectMapper() { |
||||
return getObjectMapperBuilder().build(); |
||||
} |
||||
|
||||
public static Jackson2ObjectMapperBuilder getObjectMapperBuilder() { |
||||
Jackson2ObjectMapperBuilder jacksonBuilder = new Jackson2ObjectMapperBuilder(); |
||||
jacksonBuilder.serializationInclusion(JsonInclude.Include.NON_NULL); |
||||
jacksonBuilder.serializationInclusion(JsonInclude.Include.NON_EMPTY); |
||||
// jacksonBuilder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
|
||||
// jacksonBuilder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
|
||||
// jacksonBuilder.featuresToDisable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
|
||||
// jacksonBuilder.featuresToDisable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
|
||||
// jacksonBuilder.modulesToInstall(new JavaTimeModule());
|
||||
// jacksonBuilder.timeZone(TimeZone.getTimeZone("UTC"));
|
||||
// jacksonBuilder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
// jacksonBuilder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
|
||||
// jacksonBuilder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
||||
// jacksonBuilder.deserializers(new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
|
||||
// jacksonBuilder.deserializers(new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
||||
|
||||
return jacksonBuilder; |
||||
} |
||||
} |
@ -0,0 +1,11 @@
|
||||
package kr.co.palnet.kac.util; |
||||
|
||||
import org.springframework.boot.SpringApplication; |
||||
import org.springframework.boot.autoconfigure.SpringBootApplication; |
||||
|
||||
@SpringBootApplication |
||||
public class UtilApplication { |
||||
public static void main(String[] args) { |
||||
SpringApplication.run(UtilApplication.class, args); |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,453 @@
|
||||
package kr.co.palnet.kac.util.kisa; |
||||
|
||||
/** |
||||
@file KISA_SHA256.java |
||||
@brief SHA256 암호 알고리즘 |
||||
@author Copyright (c) 2013 by KISA |
||||
@remarks http://seed.kisa.or.kr/
|
||||
*/ |
||||
|
||||
public class KISA_SHA256 { |
||||
|
||||
// DEFAULT : JAVA = BIG_ENDIAN
|
||||
private static int ENDIAN = Common.BIG_ENDIAN; |
||||
|
||||
private static final int SHA256_DIGEST_BLOCKLEN = 64; |
||||
private static final int SHA256_DIGEST_VALUELEN = 32; |
||||
|
||||
private static final int SHA256_K[] = |
||||
{ |
||||
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, |
||||
0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, |
||||
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, |
||||
0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, |
||||
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, |
||||
0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, |
||||
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, |
||||
0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, |
||||
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, |
||||
0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, |
||||
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 |
||||
}; |
||||
|
||||
|
||||
private static final int ROTL_ULONG(int x, int n) { |
||||
return (x << n) | Common.URShift(x, 32 - n); |
||||
} |
||||
|
||||
private static final int ROTR_ULONG(int x, int n) { |
||||
return Common.URShift(x, n) | (x << (32 - (n))); |
||||
} |
||||
|
||||
private static final int ENDIAN_REVERSE_ULONG(int dwS) { |
||||
return ( (ROTL_ULONG((dwS), 8) & 0x00ff00ff) | (ROTL_ULONG((dwS), 24) & 0xff00ff00) ); |
||||
} |
||||
|
||||
private static final void BIG_D2B(int D, byte[] B, int B_offset) { |
||||
Common.int_to_byte_unit(B, B_offset, D, ENDIAN); |
||||
} |
||||
|
||||
private static final int RR(int x, int n) { return ROTR_ULONG(x, n); } |
||||
private static final int SS(int x, int n) { return Common.URShift(x, n); } |
||||
|
||||
private static final int Ch(int x, int y, int z) { return ((x & y) ^ ((~x) & z)); } |
||||
private static final int Maj(int x, int y, int z) { return ((x & y) ^ (x & z) ^ (y & z)); } |
||||
private static final int Sigma0(int x) { return (RR(x, 2) ^ RR(x, 13) ^ RR(x, 22)); } |
||||
private static final int Sigma1(int x) { return (RR(x, 6) ^ RR(x, 11) ^ RR(x, 25)); } |
||||
|
||||
private static final int RHO0(int x) { return (RR(x, 7) ^ RR(x, 18) ^ SS(x, 3)); } |
||||
private static final int RHO1(int x) { return (RR(x, 17) ^ RR(x, 19) ^ SS(x, 10)); } |
||||
|
||||
private static final int abcdefgh_a = 0; |
||||
private static final int abcdefgh_b = 1; |
||||
private static final int abcdefgh_c = 2; |
||||
private static final int abcdefgh_d = 3; |
||||
private static final int abcdefgh_e = 4; |
||||
private static final int abcdefgh_f = 5; |
||||
private static final int abcdefgh_g = 6; |
||||
private static final int abcdefgh_h = 7; |
||||
|
||||
private static final void FF(int[] abcdefgh, int a, int b, int c, int d, int e, int f, int g, int h, int[] X, int j) { |
||||
long T1; |
||||
|
||||
T1 = Common.intToUnsigned(abcdefgh[h]) + Common.intToUnsigned(Sigma1(abcdefgh[e])) + Common.intToUnsigned(Ch(abcdefgh[e], abcdefgh[f], abcdefgh[g])) + Common.intToUnsigned(SHA256_K[j]) + Common.intToUnsigned(X[j]); |
||||
abcdefgh[d] += T1; |
||||
abcdefgh[h] = (int)(T1 + Common.intToUnsigned(Sigma0(abcdefgh[a])) + Common.intToUnsigned(Maj(abcdefgh[a], abcdefgh[b], abcdefgh[c]))); |
||||
} |
||||
|
||||
private static final int GetData(byte[] x, int x_offset) { |
||||
return Common.byte_to_int(x, x_offset, ENDIAN); |
||||
} |
||||
|
||||
//*********************************************************************************************************************************
|
||||
// o SHA256_Transform() : 512 비트 단위 블록의 메시지를 입력 받아 연쇄변수를 갱신하는 압축 함수로써
|
||||
// 4 라운드(64 단계)로 구성되며 8개의 연쇄변수(a, b, c, d, e, f, g, h)를 사용
|
||||
// o 입력 : Message - 입력 메시지의 포인터 변수
|
||||
// ChainVar - 연쇄변수의 포인터 변수
|
||||
// o 출력 :
|
||||
//*********************************************************************************************************************************
|
||||
private static void SHA256_Transform(byte[] Message, int[] ChainVar) { |
||||
int abcdefgh[] = new int[8]; |
||||
int T1[] = new int[1]; |
||||
int X[] = new int[64]; |
||||
int j; |
||||
|
||||
for (j = 0; j < 16; j++) |
||||
X[j] = GetData(Message, j*4); |
||||
|
||||
for (j = 16; j < 64; j++) |
||||
X[j] = (int)(Common.intToUnsigned(RHO1(X[j - 2])) + Common.intToUnsigned(X[j - 7]) + Common.intToUnsigned(RHO0(X[j - 15])) + Common.intToUnsigned(X[j - 16])); |
||||
|
||||
abcdefgh[abcdefgh_a] = ChainVar[0]; |
||||
abcdefgh[abcdefgh_b] = ChainVar[1]; |
||||
abcdefgh[abcdefgh_c] = ChainVar[2]; |
||||
abcdefgh[abcdefgh_d] = ChainVar[3]; |
||||
abcdefgh[abcdefgh_e] = ChainVar[4]; |
||||
abcdefgh[abcdefgh_f] = ChainVar[5]; |
||||
abcdefgh[abcdefgh_g] = ChainVar[6]; |
||||
abcdefgh[abcdefgh_h] = ChainVar[7]; |
||||
|
||||
for (j = 0; j < 64; j += 8) |
||||
{ |
||||
FF(abcdefgh, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, X, j + 0); |
||||
FF(abcdefgh, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, X, j + 1); |
||||
FF(abcdefgh, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, X, j + 2); |
||||
FF(abcdefgh, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, X, j + 3); |
||||
FF(abcdefgh, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, X, j + 4); |
||||
FF(abcdefgh, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, X, j + 5); |
||||
FF(abcdefgh, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, X, j + 6); |
||||
FF(abcdefgh, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, X, j + 7); |
||||
} |
||||
|
||||
ChainVar[0] += abcdefgh[abcdefgh_a]; |
||||
ChainVar[1] += abcdefgh[abcdefgh_b]; |
||||
ChainVar[2] += abcdefgh[abcdefgh_c]; |
||||
ChainVar[3] += abcdefgh[abcdefgh_d]; |
||||
ChainVar[4] += abcdefgh[abcdefgh_e]; |
||||
ChainVar[5] += abcdefgh[abcdefgh_f]; |
||||
ChainVar[6] += abcdefgh[abcdefgh_g]; |
||||
ChainVar[7] += abcdefgh[abcdefgh_h]; |
||||
} |
||||
|
||||
/** |
||||
@brief 연쇄변수와 길이변수를 초기화하는 함수 |
||||
@param Info : SHA256_Process 호출 시 사용되는 구조체 |
||||
*/ |
||||
public static void SHA256_Init( SHA256_INFO Info ) { |
||||
Info.uChainVar[0] = 0x6a09e667; |
||||
Info.uChainVar[1] = 0xbb67ae85; |
||||
Info.uChainVar[2] = 0x3c6ef372; |
||||
Info.uChainVar[3] = 0xa54ff53a; |
||||
Info.uChainVar[4] = 0x510e527f; |
||||
Info.uChainVar[5] = 0x9b05688c; |
||||
Info.uChainVar[6] = 0x1f83d9ab; |
||||
Info.uChainVar[7] = 0x5be0cd19; |
||||
|
||||
Info.uHighLength = Info.uLowLength = Info.remainNum = 0; |
||||
} |
||||
|
||||
/** |
||||
@brief 연쇄변수와 길이변수를 초기화하는 함수 |
||||
@param Info : SHA256_Init 호출하여 초기화된 구조체(내부적으로 사용된다.) |
||||
@param pszMessage : 사용자 입력 평문 |
||||
@param inLen : 사용자 입력 평문 길이 |
||||
*/ |
||||
public static void SHA256_Process( SHA256_INFO Info, byte[] pszMessage, int uDataLen ) { |
||||
/* |
||||
int pszMessage_offset = Info.remainNum; |
||||
|
||||
if((Info.uLowLength += (uDataLen << 3)) < 0) { |
||||
Info.uHighLength++; |
||||
} |
||||
|
||||
Info.uHighLength += Common.URShift(uDataLen,29); |
||||
|
||||
while (uDataLen + pszMessage_offset >= SHA256_DIGEST_BLOCKLEN) { |
||||
Common.arraycopy_offset(Info.szBuffer, pszMessage_offset, pszMessage, 0, SHA256_DIGEST_BLOCKLEN); |
||||
SHA256_Transform(Info.szBuffer, Info.uChainVar); |
||||
pszMessage_offset += SHA256_DIGEST_BLOCKLEN - pszMessage_offset; |
||||
uDataLen -= SHA256_DIGEST_BLOCKLEN - pszMessage_offset; |
||||
pszMessage_offset = 0; |
||||
} |
||||
|
||||
Common.arraycopy_offset(Info.szBuffer, pszMessage_offset, pszMessage, 0, uDataLen); |
||||
Info.remainNum = pszMessage_offset + uDataLen; |
||||
|
||||
*/ |
||||
int pszMessage_offset; |
||||
|
||||
if((Info.uLowLength += (uDataLen << 3)) < 0) { |
||||
Info.uHighLength++; |
||||
} |
||||
|
||||
Info.uHighLength += Common.URShift(uDataLen,29); |
||||
|
||||
pszMessage_offset = 0; |
||||
while (uDataLen >= SHA256_DIGEST_BLOCKLEN) { |
||||
Common.arraycopy_offset(Info.szBuffer, 0, pszMessage, pszMessage_offset, SHA256_DIGEST_BLOCKLEN); |
||||
SHA256_Transform(Info.szBuffer, Info.uChainVar); |
||||
pszMessage_offset += SHA256_DIGEST_BLOCKLEN; |
||||
uDataLen -= SHA256_DIGEST_BLOCKLEN; |
||||
} |
||||
|
||||
Common.arraycopy_offset(Info.szBuffer, 0, pszMessage, pszMessage_offset, uDataLen); |
||||
} |
||||
|
||||
/** |
||||
@brief 메시지 덧붙이기와 길이 덧붙이기를 수행한 후 마지막 메시지 블록을 가지고 압축함수를 호출하는 함수 |
||||
@param Info : SHA256_Init 호출하여 초기화된 구조체(내부적으로 사용된다.) |
||||
@param pszDigest : 암호문 |
||||
*/ |
||||
public static void SHA256_Close( SHA256_INFO Info, byte[] pszDigest ) { |
||||
int i, Index; |
||||
|
||||
Index = Common.URShift(Info.uLowLength, 3) % SHA256_DIGEST_BLOCKLEN; |
||||
Info.szBuffer[Index++] = (byte)0x80; |
||||
|
||||
if (Index > SHA256_DIGEST_BLOCKLEN - 8) { |
||||
Common.arrayinit_offset(Info.szBuffer, Index, (byte)0, SHA256_DIGEST_BLOCKLEN - Index); |
||||
SHA256_Transform(Info.szBuffer, Info.uChainVar); |
||||
Common.arrayinit(Info.szBuffer, (byte)0, SHA256_DIGEST_BLOCKLEN - 8); |
||||
} |
||||
else { |
||||
Common.arrayinit_offset(Info.szBuffer, Index, (byte)0, SHA256_DIGEST_BLOCKLEN - Index - 8); |
||||
} |
||||
|
||||
if(ENDIAN == Common.LITTLE_ENDIAN) { |
||||
Info.uLowLength = ENDIAN_REVERSE_ULONG(Info.uLowLength); |
||||
Info.uHighLength = ENDIAN_REVERSE_ULONG(Info.uHighLength); |
||||
} |
||||
|
||||
Common.int_to_byte_unit(Info.szBuffer, ((int)(SHA256_DIGEST_BLOCKLEN / 4 - 2))*4, Info.uHighLength, ENDIAN); |
||||
Common.int_to_byte_unit(Info.szBuffer, ((int)(SHA256_DIGEST_BLOCKLEN / 4 - 1))*4, Info.uLowLength, ENDIAN); |
||||
|
||||
SHA256_Transform(Info.szBuffer, Info.uChainVar); |
||||
|
||||
for (i = 0; i < SHA256_DIGEST_VALUELEN; i += 4) |
||||
BIG_D2B((Info.uChainVar)[i / 4], pszDigest, i); |
||||
} |
||||
|
||||
/** |
||||
@brief 사용자 입력 평문을 한번에 처리 |
||||
@param pszMessage : 사용자 입력 평문 |
||||
@param pszDigest : 암호문 |
||||
@remarks 내부적으로 SHA256_Init, SHA256_Process, SHA256_Close를 호출한다. |
||||
*/ |
||||
public static void SHA256_Encrpyt( byte[] pszMessage, int uPlainTextLen, byte[] pszDigest ) { |
||||
SHA256_INFO info = new SHA256_INFO(); |
||||
SHA256_Init( info ); |
||||
SHA256_Process( info, pszMessage, uPlainTextLen ); |
||||
SHA256_Close( info, pszDigest ); |
||||
} |
||||
|
||||
|
||||
public static class SHA256_INFO { |
||||
public int uChainVar[] = new int[SHA256_DIGEST_VALUELEN / 4]; |
||||
public int uHighLength; |
||||
public int uLowLength; |
||||
public int remainNum; |
||||
public byte szBuffer[] = new byte[SHA256_DIGEST_BLOCKLEN]; |
||||
} |
||||
|
||||
public static class Common { |
||||
|
||||
public static final int BIG_ENDIAN = 0; |
||||
public static final int LITTLE_ENDIAN = 1; |
||||
|
||||
public static void arraycopy(byte[] dst, byte[] src, int length) { |
||||
for(int i=0; i<length; i++) { |
||||
dst[i] = src[i]; |
||||
} |
||||
} |
||||
|
||||
public static void arraycopy_offset(byte[] dst, int dst_offset, byte[] src, int src_offset, int length) { |
||||
for(int i=0; i<length; i++) { |
||||
dst[dst_offset+i] = src[src_offset+i]; |
||||
} |
||||
} |
||||
|
||||
public static void arrayinit(byte[] dst, byte value, int length) { |
||||
for(int i=0; i<length; i++) { |
||||
dst[i] = value; |
||||
} |
||||
} |
||||
|
||||
public static void arrayinit_offset(byte[] dst, int dst_offset, byte value, int length) { |
||||
for(int i=0; i<length; i++) { |
||||
dst[dst_offset+i] = value; |
||||
} |
||||
} |
||||
|
||||
public static void memcpy(int[] dst, byte[] src, int length, int ENDIAN) { |
||||
int iLen = length / 4; |
||||
for(int i=0; i<iLen; i++) { |
||||
byte_to_int(dst, i, src, i*4, ENDIAN); |
||||
} |
||||
} |
||||
|
||||
public static void memcpy(int[] dst, int[] src, int src_offset, int length) { |
||||
int iLen = length / 4 + ((length % 4 != 0)?1:0); |
||||
for(int i=0; i<iLen; i++) { |
||||
dst[i] = src[src_offset+i]; |
||||
} |
||||
} |
||||
|
||||
public static void set_byte_for_int(int[] dst, int b_offset, byte value, int ENDIAN) { |
||||
if(ENDIAN == BIG_ENDIAN) { |
||||
int shift_value = (3-b_offset%4)*8; |
||||
int mask_value = 0x0ff << shift_value; |
||||
int mask_value2 = ~mask_value; |
||||
int value2 = (value&0x0ff) << shift_value; |
||||
dst[b_offset/4] = (dst[b_offset/4] & mask_value2) | (value2 & mask_value); |
||||
} else { |
||||
int shift_value = (b_offset%4)*8; |
||||
int mask_value = 0x0ff << shift_value; |
||||
int mask_value2 = ~mask_value; |
||||
int value2 = (value&0x0ff) << shift_value; |
||||
dst[b_offset/4] = (dst[b_offset/4] & mask_value2) | (value2 & mask_value); |
||||
} |
||||
} |
||||
|
||||
public static byte get_byte_for_int(int[] src, int b_offset, int ENDIAN) { |
||||
if(ENDIAN == BIG_ENDIAN) { |
||||
int shift_value = (3-b_offset%4)*8; |
||||
int mask_value = 0x0ff << shift_value; |
||||
int value = (src[b_offset/4] & mask_value) >> shift_value; |
||||
return (byte)value; |
||||
} else { |
||||
int shift_value = (b_offset%4)*8; |
||||
int mask_value = 0x0ff << shift_value; |
||||
int value = (src[b_offset/4] & mask_value) >> shift_value; |
||||
return (byte)value; |
||||
} |
||||
|
||||
} |
||||
|
||||
public static byte[] get_bytes_for_ints(int[] src, int offset, int ENDIAN) { |
||||
int iLen = src.length-offset; |
||||
byte[] result = new byte[(iLen)*4]; |
||||
for(int i=0; i<iLen; i++) { |
||||
int_to_byte(result, i*4, src, offset+i, ENDIAN); |
||||
} |
||||
|
||||
return result; |
||||
} |
||||
|
||||
public static void byte_to_int(int[] dst, int dst_offset, byte[] src, int src_offset, int ENDIAN) { |
||||
if(ENDIAN == BIG_ENDIAN) { |
||||
dst[dst_offset] = ((0x0ff&src[src_offset]) << 24) | ((0x0ff&src[src_offset+1]) << 16) | ((0x0ff&src[src_offset+2]) << 8) | ((0x0ff&src[src_offset+3])); |
||||
} else { |
||||
dst[dst_offset] = ((0x0ff&src[src_offset])) | ((0x0ff&src[src_offset+1]) << 8) | ((0x0ff&src[src_offset+2]) << 16) | ((0x0ff&src[src_offset+3]) << 24); |
||||
} |
||||
} |
||||
|
||||
public static int byte_to_int(byte[] src, int src_offset, int ENDIAN) { |
||||
if(ENDIAN == BIG_ENDIAN) { |
||||
return ((0x0ff&src[src_offset]) << 24) | ((0x0ff&src[src_offset+1]) << 16) | ((0x0ff&src[src_offset+2]) << 8) | ((0x0ff&src[src_offset+3])); |
||||
} else { |
||||
return ((0x0ff&src[src_offset])) | ((0x0ff&src[src_offset+1]) << 8) | ((0x0ff&src[src_offset+2]) << 16) | ((0x0ff&src[src_offset+3]) << 24); |
||||
} |
||||
} |
||||
|
||||
public static int byte_to_int_big_endian(byte[] src, int src_offset) { |
||||
return ((0x0ff&src[src_offset]) << 24) | ((0x0ff&src[src_offset+1]) << 16) | ((0x0ff&src[src_offset+2]) << 8) | ((0x0ff&src[src_offset+3])); |
||||
} |
||||
|
||||
public static void int_to_byte(byte[] dst, int dst_offset, int[] src, int src_offset, int ENDIAN) { |
||||
int_to_byte_unit(dst, dst_offset, src[src_offset], ENDIAN); |
||||
} |
||||
|
||||
public static void int_to_byte_unit(byte[] dst, int dst_offset, int src, int ENDIAN) { |
||||
if(ENDIAN == BIG_ENDIAN) { |
||||
dst[dst_offset] = (byte)((src>> 24) & 0x0ff); |
||||
dst[dst_offset+1] = (byte)((src >> 16) & 0x0ff); |
||||
dst[dst_offset+2] = (byte)((src >> 8) & 0x0ff); |
||||
dst[dst_offset+3] = (byte)((src) & 0x0ff); |
||||
} else { |
||||
dst[dst_offset] = (byte)((src) & 0x0ff); |
||||
dst[dst_offset+1] = (byte)((src >> 8) & 0x0ff); |
||||
dst[dst_offset+2] = (byte)((src >> 16) & 0x0ff); |
||||
dst[dst_offset+3] = (byte)((src >> 24) & 0x0ff); |
||||
} |
||||
|
||||
} |
||||
|
||||
public static void int_to_byte_unit_big_endian(byte[] dst, int dst_offset, int src) { |
||||
dst[dst_offset] = (byte)((src>> 24) & 0x0ff); |
||||
dst[dst_offset+1] = (byte)((src >> 16) & 0x0ff); |
||||
dst[dst_offset+2] = (byte)((src >> 8) & 0x0ff); |
||||
dst[dst_offset+3] = (byte)((src) & 0x0ff); |
||||
} |
||||
|
||||
public static int URShift(int x, int n) { |
||||
if(n == 0) |
||||
return x; |
||||
if(n >= 32) |
||||
return 0; |
||||
int v = x >> n; |
||||
int v_mask = ~(0x80000000 >> (n-1)); |
||||
return v & v_mask; |
||||
} |
||||
|
||||
public static final long INT_RANGE_MAX = (long)Math.pow(2, 32); |
||||
|
||||
public static long intToUnsigned(int x) { |
||||
if(x >= 0) |
||||
return x; |
||||
return x + INT_RANGE_MAX; |
||||
} |
||||
} |
||||
|
||||
public static void main(String[] args) |
||||
{ |
||||
byte pbData[] = {(byte)0x00, (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07, |
||||
(byte)0x08, (byte)0x09, (byte)0x0A, (byte)0x0B, (byte)0x0C, (byte)0x0D, (byte)0x0E, (byte)0x0F, |
||||
(byte)0x08, (byte)0x09, (byte)0x0A, (byte)0x0B, (byte)0x0C, (byte)0x0D, (byte)0x0E, (byte)0x0F, |
||||
(byte)0x00, (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07, |
||||
(byte)0x08, (byte)0x09, (byte)0x0A, (byte)0x0B, (byte)0x0C, (byte)0x0D, (byte)0x0E, (byte)0x0F, |
||||
(byte)0x08, (byte)0x09, (byte)0x0A, (byte)0x0B, (byte)0x0C, (byte)0x0D, (byte)0x0E, (byte)0x0F}; |
||||
byte pbData1[] = {(byte)0x61}; |
||||
|
||||
byte pbCipher[] = new byte[32]; |
||||
byte pbPlain[] = new byte[16]; |
||||
|
||||
System.out.print("[ Test SHA256 reference code ]"+"\n"); |
||||
System.out.print("\n\n"); |
||||
System.out.print("[ Test HASH mode ]"+"\n"); |
||||
System.out.print("\n"); |
||||
|
||||
int Plaintext_length = 1; |
||||
|
||||
for(int k=0; k<30; k++) |
||||
{ |
||||
|
||||
System.out.print("Plaintext\t: "); |
||||
for (int i=0; i<Plaintext_length; i++) System.out.print(Integer.toHexString(0xff&pbData[i])+" "); |
||||
System.out.print("\n"); |
||||
|
||||
// Encryption
|
||||
SHA256_Encrpyt( pbData, Plaintext_length, pbCipher ); |
||||
|
||||
System.out.print("Ciphertext\t: "); |
||||
for (int i=0; i<32; i++) System.out.print(Integer.toHexString(0xff&pbCipher[i])+" "); |
||||
System.out.print("\n\n"); |
||||
|
||||
Plaintext_length++; |
||||
|
||||
} |
||||
|
||||
|
||||
System.out.print("Plaintext\t: "); |
||||
for (int i=0; i<1; i++) System.out.print(Integer.toHexString(0xff&pbData1[i])+" "); |
||||
System.out.print("\n"); |
||||
// Encryption
|
||||
SHA256_Encrpyt( pbData1, 1, pbCipher ); |
||||
System.out.print("Ciphertext\t: "); |
||||
for (int i=0; i<32; i++) System.out.print(Integer.toHexString(0xff&pbCipher[i])+" "); |
||||
System.out.print("\n\n"); |
||||
|
||||
|
||||
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,27 @@
|
||||
|
||||
dependencies { |
||||
implementation "$boot:spring-boot-starter-data-jpa" |
||||
|
||||
implementation "com.querydsl:querydsl-jpa:5.0.0:jakarta" |
||||
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" |
||||
annotationProcessor "jakarta.annotation:jakarta.annotation-api" |
||||
annotationProcessor "jakarta.persistence:jakarta.persistence-api" |
||||
|
||||
|
||||
|
||||
testRuntimeOnly("com.h2database:h2") |
||||
} |
||||
|
||||
def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile |
||||
|
||||
sourceSets { |
||||
main.java.srcDir(querydslDir) |
||||
} |
||||
|
||||
tasks.withType(JavaCompile) { |
||||
options.getGeneratedSourceOutputDirectory().set(file(querydslDir)) |
||||
} |
||||
|
||||
clean { |
||||
delete file(querydslDir) |
||||
} |
@ -0,0 +1,70 @@
|
||||
package kr.co.palnet.kac.data.cns.model; |
||||
|
||||
import jakarta.persistence.*; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Builder; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
import org.hibernate.annotations.CreationTimestamp; |
||||
import org.hibernate.annotations.UpdateTimestamp; |
||||
|
||||
import java.time.Instant; |
||||
|
||||
@Data |
||||
@AllArgsConstructor |
||||
@NoArgsConstructor |
||||
@Builder |
||||
@Entity |
||||
@Table(name = "CNS_FAQ_BAS") |
||||
public class CnsFaqBas { |
||||
|
||||
// FAQ일련번호
|
||||
@Id |
||||
@GeneratedValue(strategy = GenerationType.IDENTITY) |
||||
@Column(name = "FAQ_SNO", columnDefinition = "int unsigned") |
||||
private Long faqSno; |
||||
|
||||
// 카테고리
|
||||
@Column(name = "CATEGORY", length = 20) |
||||
private String category; |
||||
|
||||
// 제목
|
||||
@Column(name = "TITLE", nullable = false) |
||||
private String title; |
||||
|
||||
// 내용
|
||||
@Lob |
||||
@Column(name = "CONTENT", columnDefinition = "text") |
||||
private String content; |
||||
|
||||
// 조회수
|
||||
@Column(name = "VIEW_CNT", columnDefinition = "int default 0", nullable = false) |
||||
private Integer viewCnt; |
||||
|
||||
// 표출여부
|
||||
@Column(name = "EXPSR_YN", columnDefinition = "char(1) default 'N'", nullable = false) |
||||
private String expsrYn; |
||||
|
||||
// 삭제여부
|
||||
@Column(name = "DEL_YN", columnDefinition = "char(1) default 'N'", nullable = false) |
||||
private String delYn; |
||||
|
||||
// 등록사용자ID
|
||||
@Column(name = "CREATE_USER_ID", length = 30, updatable = false, nullable = false) |
||||
private String createUserId; |
||||
|
||||
// 등록일시
|
||||
@CreationTimestamp |
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) |
||||
private Instant createDt; |
||||
|
||||
// 수정사용자ID
|
||||
@Column(name = "UPDATE_USER_ID", length = 30, nullable = false) |
||||
private String updateUserId; |
||||
|
||||
// 수정일시
|
||||
@UpdateTimestamp |
||||
@Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) |
||||
private Instant updateDt; |
||||
|
||||
} |
@ -0,0 +1,98 @@
|
||||
package kr.co.palnet.kac.data.cns.model; |
||||
|
||||
import jakarta.persistence.*; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Builder; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
import org.hibernate.annotations.CreationTimestamp; |
||||
import org.hibernate.annotations.UpdateTimestamp; |
||||
|
||||
import java.time.Instant; |
||||
|
||||
|
||||
@Data |
||||
@AllArgsConstructor |
||||
@NoArgsConstructor |
||||
@Builder |
||||
@Entity |
||||
@Table(name = "CNS_QNA_BAS") |
||||
public class CnsQnaBas { |
||||
|
||||
// QNA일련번호
|
||||
@Id |
||||
@GeneratedValue(strategy = GenerationType.IDENTITY) |
||||
@Column(name = "QNA_SNO", columnDefinition = "int unsigned") |
||||
private Long qnaSno; |
||||
|
||||
// 상위QNA일련번호
|
||||
@Column(name = "TARGET_SNO", columnDefinition = "int unsigned") |
||||
private Long targetSno; |
||||
|
||||
// 카테고리
|
||||
@Column(name = "CATEGORY", length = 20) |
||||
private String category; |
||||
|
||||
// 제목
|
||||
@Column(name = "TITLE", nullable = false) |
||||
private String title; |
||||
|
||||
// 내용
|
||||
@Lob |
||||
@Column(name = "CONTENT", columnDefinition = "text") |
||||
private String content; |
||||
|
||||
// 연락처
|
||||
@Column(name = "CONTACT", length = 20) |
||||
private String contact; |
||||
|
||||
// 답변내용
|
||||
@Lob |
||||
@Column(name = "ANSER_CONTENT", columnDefinition = "text") |
||||
private String anserContent; |
||||
|
||||
// 답변자
|
||||
@Column(name = "ANSER_USER_NM", length = 50) |
||||
private String anserUserNm; |
||||
|
||||
// 답변처리일시
|
||||
@Column(name = "ANSER_PROC_DT", columnDefinition = "datetime") |
||||
private Instant anserProcDt; |
||||
|
||||
// 답변상태
|
||||
@Column(name = "ANSER_STATUS", length = 10) |
||||
private String anserStatus; // 질문, 답변중, 답변완료, 보류
|
||||
|
||||
// 파일그룹번호
|
||||
@Column(name = "FILE_GROUP_NO", columnDefinition = "int unsigned") |
||||
private Long fileGroupNo; |
||||
|
||||
// 표출여부
|
||||
@Column(name = "EXPSR_YN", columnDefinition = "char(1) default 'N'", nullable = false) |
||||
private String expsrYn; |
||||
|
||||
// 삭제여부
|
||||
@Column(name = "DEL_YN", columnDefinition = "char(1) default 'N'", nullable = false) |
||||
private String delYn; |
||||
|
||||
// 조회수
|
||||
@Column(name = "VIEW_CNT", columnDefinition = "int default 0", nullable = false) |
||||
private Integer viewCnt; |
||||
|
||||
// 등록사용자ID
|
||||
@Column(name = "CREATE_USER_ID", length = 30, updatable = false, nullable = false) |
||||
private String createUserId; |
||||
|
||||
// 등록일시
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) |
||||
private Instant createDt; |
||||
|
||||
// 수정사용자ID
|
||||
@Column(name = "UPDATE_USER_ID", length = 30, nullable = false) |
||||
private String updateUserId; |
||||
|
||||
// 수정일시
|
||||
@Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) |
||||
private Instant updateDt; |
||||
|
||||
} |
@ -0,0 +1,9 @@
|
||||
package kr.co.palnet.kac.data.cns.repository; |
||||
|
||||
|
||||
import kr.co.palnet.kac.data.cns.model.CnsFaqBas; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface CnsFaqBasRepository extends JpaRepository<CnsFaqBas, Integer> { |
||||
|
||||
} |
@ -0,0 +1,8 @@
|
||||
package kr.co.palnet.kac.data.cns.repository; |
||||
|
||||
|
||||
import kr.co.palnet.kac.data.cns.model.CnsQnaBas; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface CnsQnaBasRepository extends JpaRepository<CnsQnaBas, Integer> { |
||||
} |
@ -0,0 +1,27 @@
|
||||
|
||||
dependencies { |
||||
implementation "$boot:spring-boot-starter-data-jpa" |
||||
|
||||
implementation "com.querydsl:querydsl-jpa:5.0.0:jakarta" |
||||
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" |
||||
annotationProcessor "jakarta.annotation:jakarta.annotation-api" |
||||
annotationProcessor "jakarta.persistence:jakarta.persistence-api" |
||||
|
||||
|
||||
|
||||
testRuntimeOnly("com.h2database:h2") |
||||
} |
||||
|
||||
def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile |
||||
|
||||
sourceSets { |
||||
main.java.srcDir(querydslDir) |
||||
} |
||||
|
||||
tasks.withType(JavaCompile) { |
||||
options.getGeneratedSourceOutputDirectory().set(file(querydslDir)) |
||||
} |
||||
|
||||
clean { |
||||
delete file(querydslDir) |
||||
} |
@ -0,0 +1,53 @@
|
||||
package kr.co.palnet.kac.data.com.domain; |
||||
|
||||
import jakarta.persistence.Column; |
||||
import jakarta.persistence.Entity; |
||||
import jakarta.persistence.Id; |
||||
import jakarta.persistence.Table; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Builder; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
|
||||
|
||||
@Data |
||||
@AllArgsConstructor |
||||
@NoArgsConstructor |
||||
@Builder |
||||
@Entity |
||||
@Table(name = "COM_ADM_DISTRICT_BAS") |
||||
public class ComAdmDistrictBas { |
||||
|
||||
// 행정코드
|
||||
@Id |
||||
@Column(name = "ADM_CD", length = 10) |
||||
private String admCd; |
||||
// 행정구역명
|
||||
@Column(name = "ADM_SECT_NM", length = 100) |
||||
private String admSectNm; |
||||
// 최하위행정구역명
|
||||
@Column(name = "LOWEST_ADM_SECT_NM", length = 100) |
||||
private String lowestAdmSectNm; |
||||
// 레벨
|
||||
@Column(name = "LEVEL", columnDefinition = "int(11)") |
||||
private Integer level; |
||||
// 상위행정코드
|
||||
@Column(name = "UP_ADM_CD", length = 10) |
||||
private String upAdmCd; |
||||
// 삭제일자
|
||||
@Column(name = "DEL_YMD", length = 8) |
||||
private String delYmd; |
||||
// 변경전행정구역구분
|
||||
@Column(name = "CHG_BEF_ADM_SECT_GBN", length = 1) |
||||
private String chgBefAdmSectGbn; |
||||
// 생성일자
|
||||
@Column(name = "CRE_YMD", length = 8) |
||||
private String creYmd; |
||||
// 변경전행정구역코드
|
||||
@Column(name = "CHG_BEF_ADM_SECT_CD", length = 10) |
||||
private String chgBefAdmSectCd; |
||||
// 원천시군구코드
|
||||
@Column(name = "COL_ADM_SECT_CD", length = 5) |
||||
private String colAdmSectCd; |
||||
|
||||
} |
@ -0,0 +1,108 @@
|
||||
package kr.co.palnet.kac.data.com.domain; |
||||
|
||||
import jakarta.persistence.*; |
||||
import lombok.*; |
||||
|
||||
import java.time.Instant; |
||||
import java.util.List; |
||||
|
||||
|
||||
@Data |
||||
@AllArgsConstructor |
||||
@NoArgsConstructor |
||||
@Builder |
||||
@ToString(exclude = {"comIdntfBasList"}) |
||||
@Entity |
||||
@Table(name = "COM_ARCRFT_BAS") |
||||
public class ComArcrftBas { |
||||
|
||||
// 기체일련번호
|
||||
@Id |
||||
@GeneratedValue(strategy = GenerationType.IDENTITY) |
||||
@Column(name = "ARCRFT_SNO", columnDefinition = "int unsigned") |
||||
private Long arcrftSno; |
||||
|
||||
// 그룹ID
|
||||
@Column(name = "GROUP_ID", length = 50) |
||||
private String groupId; |
||||
|
||||
// 제작번호
|
||||
@Column(name = "PRDCT_NUM", length = 50, nullable = false) |
||||
private String prdctNum; |
||||
|
||||
// 기체종류코드
|
||||
@Column(name = "ARCRFT_TYPE_CD", length = 20, nullable = false) |
||||
private String arcrftTypeCd; |
||||
|
||||
// 기체모델명
|
||||
@Column(name = "ARCRFT_MODEL_NM", length = 50, nullable = false) |
||||
private String arcrftModelNm; |
||||
|
||||
// 제작자
|
||||
@Column(name = "PRDCT_CMPN_NM", length = 50) |
||||
private String prdctCmpnNm; |
||||
|
||||
// 제작일자
|
||||
@Column(name = "PRDCT_DATE", columnDefinition = "datetime") |
||||
private Instant prdctDate; |
||||
|
||||
// 기체길이
|
||||
@Column(name = "ARCRFT_LNGTH", columnDefinition = "double") |
||||
private double arcrftLngth; |
||||
|
||||
// 기체폭
|
||||
@Column(name = "ARCRFT_WDTH", columnDefinition = "double") |
||||
private double arcrftWdth; |
||||
|
||||
// 기체높이
|
||||
@Column(name = "ARCRFT_HGHT", columnDefinition = "double") |
||||
private double arcrftHght; |
||||
|
||||
// 자체중량
|
||||
@Column(name = "ARCRFT_WGHT", columnDefinition = "double") |
||||
private double arcrftWght; |
||||
|
||||
// 중량구분코드
|
||||
@Column(name = "WGHT_TYPE_CD", length = 20, nullable = false) |
||||
private String wghtTypeCd; |
||||
|
||||
// 이미지URL
|
||||
@Column(name = "IMAGE_URL", length = 200) |
||||
private String imageUrl; |
||||
|
||||
// 최대이륙중량
|
||||
@Column(name = "TAKEOFF_WGHT", columnDefinition = "double") |
||||
private double takeoffWght; |
||||
|
||||
// 사용여부
|
||||
@Column(name = "USE_YN", columnDefinition = "char(1) default 'N'", nullable = false) |
||||
private String useYn; |
||||
|
||||
// 카메라탑재여부
|
||||
@Column(name = "CAMERA_YN", columnDefinition = "char(1) default 'N'", nullable = false) |
||||
private String cameraYn; |
||||
|
||||
// 보험가입여부
|
||||
@Column(name = "INSRNC_YN", columnDefinition = "char(1) default 'N'", nullable = false) |
||||
private String insrncYn; |
||||
|
||||
// 등록일자
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) |
||||
private Instant createDt; |
||||
|
||||
// 등록사용자ID
|
||||
@Column(name = "CREATE_USER_ID", length = 30, updatable = false, nullable = false) |
||||
private String createUserId; |
||||
|
||||
// 수정일자
|
||||
@Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) |
||||
private Instant updateDt; |
||||
|
||||
// 수정사용자ID
|
||||
@Column(name = "UPDATE_USER_ID", length = 30, nullable = false) |
||||
private String updateUserId; |
||||
|
||||
@OneToMany(mappedBy = "comArcrftBas", fetch = FetchType.LAZY) |
||||
private List<ComIdntfBas> comIdntfBasList; |
||||
|
||||
} |
@ -0,0 +1,63 @@
|
||||
package kr.co.palnet.kac.data.com.domain; |
||||
|
||||
import jakarta.persistence.*; |
||||
import lombok.*; |
||||
|
||||
import java.time.Instant; |
||||
|
||||
|
||||
@Data |
||||
@AllArgsConstructor |
||||
@NoArgsConstructor |
||||
@Builder |
||||
@ToString(exclude = {"comSiteBas"}) |
||||
@Entity |
||||
@Table(name = "COM_AUTH_BAS") |
||||
public class ComAuthBas { |
||||
|
||||
// 권한ID
|
||||
@Id |
||||
@Column(name = "AUTH_ID", length = 50) |
||||
private String authId; |
||||
|
||||
// 사이트코드
|
||||
@Column(name = "SITE_CD", length = 20, nullable = false) |
||||
private String siteCd; |
||||
|
||||
// 권한명
|
||||
@Column(name = "AUTH_NM", length = 100, nullable = false) |
||||
private String authNm; |
||||
|
||||
// 사용여부
|
||||
@Column(name = "USE_YN", columnDefinition = "char(1) default 'N'", nullable = false) |
||||
private String useYn; |
||||
|
||||
// 비고
|
||||
@Lob |
||||
@Column(name = "RM", columnDefinition = "mediumtext") |
||||
private String rm; |
||||
|
||||
// 생성사용자ID
|
||||
@Column(name = "CREATE_USER_ID", length = 30, updatable = false, nullable = false) |
||||
private String createUserId; |
||||
|
||||
// 생성일시
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) |
||||
private Instant createDt; |
||||
|
||||
// 수정사용자ID
|
||||
@Column(name = "UPDATE_USER_ID", length = 30, nullable = false) |
||||
private String updateUserId; |
||||
|
||||
// 수정일시
|
||||
@Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) |
||||
private Instant updateDt; |
||||
|
||||
@JoinColumn( |
||||
name = "SITE_CD", updatable = false, insertable = false, |
||||
foreignKey = @ForeignKey(name = "FK_COM_AUTH_BAS_COM_SITE_BAS_SITE_CD") |
||||
) |
||||
@ManyToOne(fetch = FetchType.LAZY) |
||||
private ComSiteBas comSiteBas; |
||||
|
||||
} |
@ -0,0 +1,103 @@
|
||||
package kr.co.palnet.kac.data.com.domain; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore; |
||||
import jakarta.persistence.*; |
||||
import lombok.*; |
||||
|
||||
import java.io.Serializable; |
||||
import java.time.LocalDateTime; |
||||
import java.util.List; |
||||
|
||||
|
||||
@Data |
||||
@AllArgsConstructor |
||||
@NoArgsConstructor |
||||
@Builder |
||||
@ToString(exclude = {"comCdGroupBas", "comCdLangCtgList"}) |
||||
@IdClass(ComCdBas.ComCdBasId.class) |
||||
@Entity |
||||
@Table(name = "COM_CD_BAS") |
||||
public class ComCdBas { |
||||
|
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
public static class ComCdBasId implements Serializable { |
||||
// 그룹코드
|
||||
private String groupCd; |
||||
// 코드ID
|
||||
private String cdId; |
||||
} |
||||
|
||||
// 그룹코드
|
||||
@Id |
||||
@Column(name = "GROUP_CD", length = 20) |
||||
private String groupCd; |
||||
|
||||
// 코드ID
|
||||
@Id |
||||
@Column(name = "CD_ID", length = 30) |
||||
private String cdId; |
||||
|
||||
// 상위코드
|
||||
@Column(name = "UPPER_CD", length = 20) |
||||
private String upperCd; |
||||
|
||||
// 정렬순서
|
||||
@Column(name = "SORT_ORDR", columnDefinition = "tinyint default 0", nullable = false) |
||||
private Integer sortOrdr; |
||||
|
||||
// 추가정보값
|
||||
@Column(name = "ADD_INFO_VALUE", length = 100) |
||||
private String addInfoValue; |
||||
|
||||
// 사용여부
|
||||
@Column(name = "USE_YN", columnDefinition = "char(1) default 'Y'", nullable = false) |
||||
private String useYn; |
||||
|
||||
// 생성사용자ID
|
||||
@Column(name = "CREATE_USER_ID", length = 30, nullable = false, updatable = false) |
||||
private String createUserId; |
||||
|
||||
// 생성일시
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", nullable = false, updatable = false) |
||||
private LocalDateTime createDt; |
||||
|
||||
// 수정사용자ID
|
||||
@Column(name = "UPDATE_USER_ID", length = 30, nullable = false) |
||||
private String updateUserId; |
||||
|
||||
// 수정일시
|
||||
@Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) |
||||
private LocalDateTime updateDt; |
||||
|
||||
@JsonIgnore |
||||
@ManyToOne(fetch = FetchType.LAZY) |
||||
@JoinColumn( |
||||
name = "GROUP_CD", updatable = false, insertable = false, |
||||
foreignKey = @ForeignKey(name = "FK_COM_CD_BAS_TO_COM_CD_GROUP_BAS") |
||||
) |
||||
private ComCdGroupBas comCdGroupBas; |
||||
|
||||
@OneToMany(mappedBy = "comCdBas", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) |
||||
private List<ComCdLangCtg> comCdLangCtgList; |
||||
|
||||
public void update(ComCdBas comCdBas) { |
||||
if (comCdBas == null) return; |
||||
|
||||
if (comCdBas.getGroupCd() != null && !comCdBas.getGroupCd().isBlank()) this.groupCd = comCdBas.getGroupCd(); |
||||
if (comCdBas.getCdId() != null && !comCdBas.getCdId().isBlank()) this.cdId = comCdBas.getCdId(); |
||||
|
||||
if (comCdBas.getUpperCd() != null && !comCdBas.getUpperCd().isBlank()) this.upperCd = comCdBas.getUpperCd(); |
||||
if (comCdBas.getSortOrdr() != null) this.sortOrdr = comCdBas.getSortOrdr(); |
||||
if (comCdBas.getAddInfoValue() != null && !comCdBas.getAddInfoValue().isBlank()) |
||||
this.addInfoValue = comCdBas.getAddInfoValue(); |
||||
if (comCdBas.getUseYn() != null && !comCdBas.getUseYn().isBlank()) this.useYn = comCdBas.getUseYn(); |
||||
if (comCdBas.getUpdateUserId() != null && !comCdBas.getUpdateUserId().isBlank()) |
||||
this.updateUserId = comCdBas.getUpdateUserId(); |
||||
if (comCdBas.getUpdateDt() != null) this.updateDt = comCdBas.getUpdateDt(); |
||||
|
||||
} |
||||
} |
@ -0,0 +1,77 @@
|
||||
package kr.co.palnet.kac.data.com.domain; |
||||
|
||||
import java.time.LocalDateTime; |
||||
import java.util.List; |
||||
|
||||
import jakarta.persistence.CascadeType; |
||||
import jakarta.persistence.Column; |
||||
import jakarta.persistence.Entity; |
||||
import jakarta.persistence.FetchType; |
||||
import jakarta.persistence.Id; |
||||
import jakarta.persistence.Lob; |
||||
import jakarta.persistence.OneToMany; |
||||
import jakarta.persistence.Table; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Builder; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
|
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
@Entity |
||||
@Table(name = "COM_CD_GROUP_BAS") |
||||
public class ComCdGroupBas { |
||||
|
||||
// 그룹코드
|
||||
@Id |
||||
@Column(name = "GROUP_CD", length = 20) |
||||
private String groupCd; |
||||
|
||||
// 사이트코드
|
||||
@Column(name = "SITE_CD", length = 20, nullable = false) |
||||
private String siteCd; |
||||
|
||||
// 그룹코드명
|
||||
@Column(name = "GROUP_CD_NM", length = 100, nullable = false) |
||||
private String groupCdNm; |
||||
|
||||
// 비고
|
||||
@Lob |
||||
@Column(name = "RM", columnDefinition = "mediumtext") |
||||
private String rm; |
||||
|
||||
// 생성사용자ID
|
||||
@Column(name = "CREATE_USER_ID", length = 30, nullable = false, updatable = false) |
||||
private String createUserId; |
||||
|
||||
// 생성일시
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", nullable = false, updatable = false) |
||||
private LocalDateTime createDt; |
||||
|
||||
// 수정사용자ID
|
||||
@Column(name = "UPDATE_USER_ID", length = 30, nullable = false) |
||||
private String updateUserId; |
||||
|
||||
// 수정일시
|
||||
@Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) |
||||
private LocalDateTime updateDt; |
||||
|
||||
@OneToMany(mappedBy = "comCdGroupBas", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) |
||||
private List<ComCdBas> comCdBasList; |
||||
|
||||
public void update(ComCdGroupBas comCdGroupBas) { |
||||
if(comCdGroupBas == null) return; |
||||
// if(comCdGroupBas.getGroupCd() != null && this.groupCd != null && !this.groupCd.equals(comCdGroupBas.getGroupCd())) return;
|
||||
|
||||
if(comCdGroupBas.getGroupCd() != null && !comCdGroupBas.getGroupCd().isBlank()) this.groupCd = comCdGroupBas.getGroupCd(); |
||||
if(comCdGroupBas.getSiteCd() != null && !comCdGroupBas.getSiteCd().isBlank()) this.siteCd = comCdGroupBas.getSiteCd(); |
||||
if(comCdGroupBas.getGroupCdNm() != null && !comCdGroupBas.getGroupCdNm().isBlank()) this.groupCdNm = comCdGroupBas.getGroupCdNm(); |
||||
if(comCdGroupBas.getRm() != null && !comCdGroupBas.getRm().isBlank()) this.rm = comCdGroupBas.getRm(); |
||||
|
||||
if(comCdGroupBas.getUpdateUserId() != null && !comCdGroupBas.getUpdateUserId().isBlank()) this.updateUserId = comCdGroupBas.getUpdateUserId(); |
||||
if(comCdGroupBas.getUpdateDt() != null) this.updateDt = comCdGroupBas.getUpdateDt(); |
||||
} |
||||
} |
@ -0,0 +1,106 @@
|
||||
package kr.co.palnet.kac.data.com.domain; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore; |
||||
import jakarta.persistence.*; |
||||
import lombok.*; |
||||
|
||||
import java.io.Serializable; |
||||
import java.time.LocalDateTime; |
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
@ToString(exclude = {"comCdBas"}) |
||||
@IdClass(ComCdLangCtg.ComCdLangCtgId.class) |
||||
@Entity |
||||
@Table(name = "COM_CD_LANG_CTG") |
||||
public class ComCdLangCtg { |
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
public static class ComCdLangCtgId implements Serializable { |
||||
// 그룹코드
|
||||
private String groupCd; |
||||
// 코드ID
|
||||
private String cdId; |
||||
// 언어구분코드
|
||||
private String langDivCd; |
||||
} |
||||
|
||||
|
||||
// 그룹코드
|
||||
@Id |
||||
@Column(name = "GROUP_CD", length = 20) |
||||
private String groupCd; |
||||
|
||||
// 코드ID
|
||||
@Id |
||||
@Column(name = "CD_ID", length = 30) |
||||
private String cdId; |
||||
|
||||
// 언어구분코드
|
||||
@Id |
||||
@Column(name = "LANG_DIV_CD", length = 5) |
||||
private String langDivCd; |
||||
|
||||
// 코드명
|
||||
@Column(name = "CD_NM", length = 100, nullable = false) |
||||
private String cdNm; |
||||
|
||||
// 비고
|
||||
@Lob |
||||
@Column(name = "RM", columnDefinition = "mediumtext") |
||||
private String rm; |
||||
|
||||
// 생성사용자ID
|
||||
@Column(name = "CREATE_USER_ID", length = 30, nullable = false, updatable = false) |
||||
private String createUserId; |
||||
|
||||
// 생성일시
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", nullable = false, updatable = false) |
||||
private LocalDateTime createDt; |
||||
|
||||
// 수정사용자ID
|
||||
@Column(name = "UPDATE_USER_ID", length = 30, nullable = false) |
||||
private String updateUserId; |
||||
|
||||
// 수정일시
|
||||
@Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) |
||||
private LocalDateTime updateDt; |
||||
|
||||
@JsonIgnore |
||||
@ManyToOne(fetch = FetchType.LAZY) |
||||
@JoinColumns( |
||||
value = { |
||||
@JoinColumn(name = "GROUP_CD", referencedColumnName = "GROUP_CD", insertable = false, updatable = false), |
||||
@JoinColumn(name = "CD_ID", referencedColumnName = "CD_ID", insertable = false, updatable = false) |
||||
}, |
||||
foreignKey = @ForeignKey(name = "FK_COM_CD_LANG_CTG_COM_CD_BAS") |
||||
) |
||||
private ComCdBas comCdBas; |
||||
|
||||
public void update(ComCdLangCtg comCdLangCtg) { |
||||
if (comCdLangCtg == null) return; |
||||
// if(comCdLangCtg.getId() != null) {
|
||||
// if(comCdLangCtg.getId().getComCdBasId() != null) {
|
||||
// if(comCdLangCtg.getId().getComCdBasId().getGroupCd() != null && !comCdLangCtg.getId().getComCdBasId().getGroupCd().isBlank()) this.id.comCdBasId.setGroupCd(comCdLangCtg.getId().getComCdBasId().getGroupCd());
|
||||
// if(comCdLangCtg.getId().getComCdBasId().getCdId() != null && !comCdLangCtg.getId().getComCdBasId().getCdId().isBlank()) this.id.comCdBasId.setCdId(comCdLangCtg.getId().getComCdBasId().getCdId());
|
||||
// }
|
||||
// if(comCdLangCtg.getId().getLangDivCd() != null && !comCdLangCtg.getId().getLangDivCd().isBlank()) this.id.langDivCd = comCdLangCtg.getId().getLangDivCd();
|
||||
// }
|
||||
|
||||
if (comCdLangCtg.getGroupCd() != null && !comCdLangCtg.getGroupCd().isBlank()) this.groupCd = comCdLangCtg.getGroupCd(); |
||||
if (comCdLangCtg.getCdId() != null && !comCdLangCtg.getCdId().isBlank()) this.cdId = comCdLangCtg.getCdId(); |
||||
if (comCdLangCtg.getLangDivCd() != null && !comCdLangCtg.getLangDivCd().isBlank()) |
||||
this.langDivCd = comCdLangCtg.getLangDivCd(); |
||||
|
||||
if (comCdLangCtg.getCdNm() != null && !comCdLangCtg.getCdNm().isBlank()) this.cdNm = comCdLangCtg.getCdNm(); |
||||
if (comCdLangCtg.getRm() != null && !comCdLangCtg.getRm().isBlank()) this.rm = comCdLangCtg.getRm(); |
||||
if (comCdLangCtg.getUpdateUserId() != null && !comCdLangCtg.getUpdateUserId().isBlank()) |
||||
this.updateUserId = comCdLangCtg.getUpdateUserId(); |
||||
if (comCdLangCtg.getUpdateDt() != null) this.updateDt = comCdLangCtg.getUpdateDt(); |
||||
} |
||||
} |
@ -0,0 +1,68 @@
|
||||
package kr.co.palnet.kac.data.com.domain; |
||||
|
||||
import jakarta.persistence.*; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Builder; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
|
||||
import java.time.Instant; |
||||
|
||||
@Data |
||||
@Builder |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Entity |
||||
@Table(name = "COM_CONFIRM_BAS") |
||||
public class ComConfirmBas { |
||||
|
||||
// 확인일련번호
|
||||
@Id |
||||
@GeneratedValue(strategy = GenerationType.IDENTITY) |
||||
@Column(name = "CONFIRM_SNO", columnDefinition = "int unsigned") |
||||
private Long confirmSno; |
||||
|
||||
// 확인키
|
||||
@Column(name = "CONFIRM_KEY", length = 50, nullable = false) |
||||
private String confirmKey; |
||||
|
||||
// 상태
|
||||
@Column(name = "STATUS", length = 20, nullable = false) |
||||
private String status; // GENERATED, RECEIVED, CHECKED, FAILED, EXPIRED
|
||||
|
||||
// 대상구분
|
||||
@Column(name = "TARGET_TYPE", length = 100) |
||||
private String targetType; |
||||
|
||||
// RQ 데이터
|
||||
@Lob |
||||
@Column(name = "RQ_DATA", columnDefinition = "text") |
||||
private String rqData; |
||||
|
||||
// RS 데이터
|
||||
@Lob |
||||
@Column(name = "RS_DATA", columnDefinition = "text") |
||||
private String rsData; |
||||
|
||||
// 비고
|
||||
@Lob |
||||
@Column(name = "RM", columnDefinition = "text") |
||||
private String rm; |
||||
|
||||
// 생성사용자ID
|
||||
@Column(name = "CREATE_USER_ID", length = 30, updatable = false, nullable = false) |
||||
private String createUserId; |
||||
|
||||
// 생성일시
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) |
||||
private Instant createDt; |
||||
|
||||
// 수정사용자ID
|
||||
@Column(name = "UPDATE_USER_ID", length = 30, nullable = false) |
||||
private String updateUserId; |
||||
|
||||
// 수정일시
|
||||
@Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) |
||||
private Instant updateDt; |
||||
|
||||
} |
@ -0,0 +1,79 @@
|
||||
package kr.co.palnet.kac.data.com.domain; |
||||
|
||||
import jakarta.persistence.*; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Builder; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
|
||||
import java.time.Instant; |
||||
|
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
@Entity |
||||
@Table(name = "COM_FILE_BAS") |
||||
public class ComFileBas { |
||||
// 파일일련번호
|
||||
@Id |
||||
@GeneratedValue(strategy = GenerationType.IDENTITY) |
||||
@Column(name = "FILE_SNO", columnDefinition = "int unsigned") |
||||
private Long fileSno; |
||||
|
||||
// 파일그룹번호
|
||||
@Column(name = "FILE_GROUP_NO", columnDefinition = "int unsigned") |
||||
private Long fileGroupNo; |
||||
|
||||
// 저장된파일명
|
||||
@Column(name = "FILE_SAVE_NM", length = 200, nullable = false) |
||||
private String fileSaveNm; |
||||
|
||||
// 실제파일명
|
||||
@Column(name = "FILE_ORI_NM", length = 200) |
||||
private String fileOriNm; |
||||
|
||||
// 파일저장경로
|
||||
@Column(name = "FILE_PATH", length = 200) |
||||
private String filePath; |
||||
|
||||
// 파일확장명
|
||||
@Column(name = "FILE_EXT", length = 30) |
||||
private String fileExt; |
||||
|
||||
// 파일크기
|
||||
@Column(name = "FILE_SIZE", length = 30) |
||||
private String fileSize; |
||||
|
||||
// 삭제여부
|
||||
@Column(name = "DEL_YN", columnDefinition = "char(1) default 'N'", nullable = false) |
||||
private String delYn; |
||||
|
||||
// 삭제사용자ID
|
||||
@Column(name = "DEL_USER_ID", length = 30) |
||||
private String delUserId; |
||||
|
||||
// 삭제일시
|
||||
@Column(name = "DEL_DT", columnDefinition = "datetime") |
||||
private Instant delDt; |
||||
|
||||
// 생성사용자ID
|
||||
@Column(name = "CREATE_USER_ID", length = 30, updatable = false, nullable = false) |
||||
private String createUserId; |
||||
|
||||
// 생성일시
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) |
||||
private Instant createDt; |
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,72 @@
|
||||
package kr.co.palnet.kac.data.com.domain; |
||||
|
||||
import jakarta.persistence.*; |
||||
import lombok.*; |
||||
|
||||
import java.io.Serializable; |
||||
import java.time.Instant; |
||||
|
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
@ToString(exclude = {"comArcrftBas"}) |
||||
@IdClass(ComIdntfBas.ComIdntfBasId.class) |
||||
@Entity |
||||
@Table(name = "COM_IDNTF_BAS") |
||||
public class ComIdntfBas { |
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
public static class ComIdntfBasId implements Serializable { |
||||
// 식별번호
|
||||
private String idntfNum; |
||||
// 기체일련번호
|
||||
private Long arcrftSno; |
||||
} |
||||
|
||||
// 식별번호
|
||||
@Id |
||||
@Column(name = "IDNTF_NUM", length = 30) |
||||
private String idntfNum; |
||||
|
||||
// 기체일련번호
|
||||
@Id |
||||
@Column(name = "ARCRFT_SNO", columnDefinition = "int unsigned") |
||||
private Long arcrftSno; |
||||
|
||||
// 식별장치종류코드
|
||||
@Column(name = "IDNTF_TYPE_CD", length = 20, nullable = false) |
||||
private String idntfTypeCd; |
||||
|
||||
// 소유자명
|
||||
@Column(name = "OWNER_NM", length = 100, nullable = false) |
||||
private String ownerNm; |
||||
|
||||
// 고객일련번호(소유자)
|
||||
@Column(name = "CSTMR_SNO", columnDefinition = "int unsigned") |
||||
private Long cstmrSno; |
||||
|
||||
// 휴대폰번호
|
||||
@Column(name = "HPNO", length = 100, nullable = false) |
||||
private String hpno; |
||||
|
||||
// 등록일자
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) |
||||
private Instant createDt; |
||||
|
||||
// 수정일자
|
||||
@Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) |
||||
private Instant updateDt; |
||||
|
||||
@JoinColumn( |
||||
name = "ARCRFT_SNO", updatable = false, insertable = false, |
||||
foreignKey = @ForeignKey(name = "FK_COM_IDNTF_BAS_COM_ARCRFT_BAS_ARCRFT_SNO") |
||||
) |
||||
@ManyToOne(fetch = FetchType.LAZY) |
||||
private ComArcrftBas comArcrftBas; |
||||
|
||||
} |
@ -0,0 +1,111 @@
|
||||
package kr.co.palnet.kac.data.com.domain; |
||||
|
||||
import jakarta.persistence.*; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Builder; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
import org.hibernate.annotations.CreationTimestamp; |
||||
import org.hibernate.annotations.UpdateTimestamp; |
||||
|
||||
import java.io.Serializable; |
||||
import java.time.Instant; |
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
@IdClass(ComRiseSetBas.ComRiseSetBasId.class) |
||||
@Entity |
||||
@Table(name = "COM_RISE_SET_BAS") |
||||
public class ComRiseSetBas { |
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
public static class ComRiseSetBasId implements Serializable { |
||||
|
||||
// 날짜
|
||||
private String locDate; |
||||
// 지역
|
||||
private String location; |
||||
|
||||
} |
||||
|
||||
|
||||
// 날짜
|
||||
@Id |
||||
@Column(name = "LOC_DATE", length = 8) |
||||
private String locDate; |
||||
|
||||
// 지역
|
||||
@Id |
||||
@Column(name = "LOCATION", length = 100) |
||||
private String location; |
||||
|
||||
// 경도
|
||||
@Column(name = "LON", columnDefinition = "double") |
||||
private Double lon; |
||||
|
||||
// 위도
|
||||
@Column(name = "LAT" , columnDefinition = "double") |
||||
private Double lat; |
||||
|
||||
// 일출
|
||||
@Column(name = "SUNRISE", length = 6) |
||||
private String sunrise; |
||||
|
||||
// 일증
|
||||
@Column(name = "SUNTRANSIT", length = 6) |
||||
private String suntransit; |
||||
|
||||
// 일몰
|
||||
@Column(name = "SUNSET", length = 6) |
||||
private String sunset; |
||||
|
||||
// 월출
|
||||
@Column(name = "MOONRISE", length = 6) |
||||
private String moonrise; |
||||
|
||||
// 월중
|
||||
@Column(name = "MOONTRANSIT", length = 6) |
||||
private String moontransit; |
||||
|
||||
// 월몰
|
||||
@Column(name = "MOONSET", length = 6) |
||||
private String moonset; |
||||
|
||||
// 시민박명(아침)
|
||||
@Column(name = "CIVILM", length = 6) |
||||
private String civilm; |
||||
|
||||
// 시민박명(저녁)
|
||||
@Column(name = "CIVILE", length = 6) |
||||
private String civile; |
||||
|
||||
// 황해박명(아침)
|
||||
@Column(name = "NAUTM", length = 6) |
||||
private String nautm; |
||||
|
||||
// 황해박명(저녁)
|
||||
@Column(name = "NAUTE", length = 6) |
||||
private String naute; |
||||
|
||||
// 천문박명(아침)
|
||||
@Column(name = "ASTM", length = 6) |
||||
private String astm; |
||||
|
||||
// 춘문박명(저녁)
|
||||
@Column(name = "ASTE", length = 6) |
||||
private String aste; |
||||
|
||||
// 수정일시
|
||||
@Column(name = "UPDATE_DT", columnDefinition = "datetime") |
||||
private Instant updateDt; |
||||
|
||||
// 등록일시
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false) |
||||
private Instant createDt; |
||||
|
||||
} |
@ -0,0 +1,59 @@
|
||||
package kr.co.palnet.kac.data.com.domain; |
||||
|
||||
import jakarta.persistence.*; |
||||
import lombok.*; |
||||
|
||||
import java.time.Instant; |
||||
import java.util.List; |
||||
|
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
@ToString(exclude = {"comAuthBasList"}) |
||||
@Entity |
||||
@Table(name = "COM_SITE_BAS") |
||||
public class ComSiteBas { |
||||
|
||||
// 사이트코드
|
||||
@Id |
||||
@Column(name = "SITE_CD", length = 20) |
||||
private String siteCd; |
||||
|
||||
// 사이트경로
|
||||
@Column(name = "SITE_URL", length = 50, nullable = false) |
||||
private String siteUrl; |
||||
|
||||
// 사이트명
|
||||
@Column(name = "SITE_NM", length = 50, nullable = false) |
||||
private String siteNm; |
||||
|
||||
// 사이트설명
|
||||
@Lob |
||||
@Column(name = "SITE_DESC", columnDefinition = "text") |
||||
private String siteDesc; |
||||
|
||||
// 사용여부
|
||||
@Column(name = "USE_YN", columnDefinition = "char(1) default 'N'", nullable = false) |
||||
private String useYn; |
||||
|
||||
// 등록일자
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) |
||||
private Instant createDt; |
||||
|
||||
// 등록사용자
|
||||
@Column(name = "CREATE_USER_ID", length = 30, updatable = false, nullable = false) |
||||
private String createUserId; |
||||
|
||||
// 수정일자
|
||||
@Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) |
||||
private Instant updateDt; |
||||
|
||||
// 수정사용자
|
||||
@Column(name = "UPDATE_USER_ID", length = 30, nullable = false) |
||||
private String updateUserId; |
||||
|
||||
@OneToMany(mappedBy = "comSiteBas", fetch = FetchType.LAZY) |
||||
private List<ComAuthBas> comAuthBasList; |
||||
} |
@ -0,0 +1,58 @@
|
||||
package kr.co.palnet.kac.data.com.domain; |
||||
|
||||
import jakarta.persistence.Column; |
||||
import jakarta.persistence.Entity; |
||||
import jakarta.persistence.Id; |
||||
import jakarta.persistence.Table; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Builder; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
|
||||
import java.time.Instant; |
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
@Entity |
||||
@Table(name = "COM_TRMNL_BAS") |
||||
public class ComTrmnlBas { |
||||
|
||||
// 터미널ID
|
||||
@Id |
||||
@Column(name = "TRMNL_ID", length = 20) |
||||
private String trmnlId; |
||||
|
||||
// 터미널명
|
||||
@Column(name = "TRMNL_NM", length = 100, nullable = false) |
||||
private String trmnlNm; |
||||
|
||||
// 인증KEY
|
||||
@Column(name = "AUTH_KEY", length = 100, nullable = false) |
||||
private String authKey; |
||||
|
||||
// 터미널설명
|
||||
@Column(name = "DESC_SN") |
||||
private String descSn; |
||||
|
||||
// 사용여부
|
||||
@Column(name = "USE_YN", columnDefinition = "char(1) default 'N'", nullable = false) |
||||
private String useYn; |
||||
// 등록일시
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) |
||||
private Instant createDt; |
||||
|
||||
// 등록사용자ID
|
||||
@Column(name = "CREATE_USER_ID", length = 30, updatable = false, nullable = false) |
||||
private String createUserId; |
||||
|
||||
// 수정일시
|
||||
@Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) |
||||
private Instant updateDt; |
||||
|
||||
// 수정사용자ID
|
||||
@Column(name = "UPDATE_USER_ID", length = 30, nullable = false) |
||||
private String updateUserId; |
||||
|
||||
} |
@ -0,0 +1,7 @@
|
||||
package kr.co.palnet.kac.data.com.repository; |
||||
|
||||
import kr.co.palnet.kac.data.com.domain.ComAdmDistrictBas; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface ComAdmDistrictBasRepository extends JpaRepository<ComAdmDistrictBas, String> { |
||||
} |
@ -0,0 +1,7 @@
|
||||
package kr.co.palnet.kac.data.com.repository; |
||||
|
||||
import kr.co.palnet.kac.data.com.domain.ComArcrftBas; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface ComArcrftBasRepository extends JpaRepository<ComArcrftBas, Integer> { |
||||
} |
@ -0,0 +1,7 @@
|
||||
package kr.co.palnet.kac.data.com.repository; |
||||
|
||||
import kr.co.palnet.kac.data.com.domain.ComAuthBas; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface ComAuthBasRepository extends JpaRepository<ComAuthBas, String>{ |
||||
} |
@ -0,0 +1,14 @@
|
||||
package kr.co.palnet.kac.data.com.repository; |
||||
|
||||
import kr.co.palnet.kac.data.com.domain.ComCdBas; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
import java.util.List; |
||||
|
||||
public interface ComCdBasRepository extends JpaRepository<ComCdBas, ComCdBas.ComCdBasId> { |
||||
|
||||
List<ComCdBas> findByGroupCdAndUseYnOrderBySortOrdrAsc(String groupCd, String y); |
||||
|
||||
ComCdBas findByGroupCdAndCdIdAndUseYn(String groupCd, String cdId, String useYn); |
||||
|
||||
} |
@ -0,0 +1,10 @@
|
||||
package kr.co.palnet.kac.data.com.repository; |
||||
|
||||
import kr.co.palnet.kac.data.com.domain.ComCdGroupBas; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
import java.util.List; |
||||
|
||||
public interface ComCdGroupBasRepository extends JpaRepository<ComCdGroupBas, String> { |
||||
List<ComCdGroupBas> findBySiteCd(String siteCd); |
||||
} |
@ -0,0 +1,10 @@
|
||||
package kr.co.palnet.kac.data.com.repository; |
||||
|
||||
import kr.co.palnet.kac.data.com.domain.ComCdLangCtg; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
import java.util.List; |
||||
|
||||
public interface ComCdLangCtgRepository extends JpaRepository<ComCdLangCtg, ComCdLangCtg.ComCdLangCtgId> { |
||||
List<ComCdLangCtg> findByGroupCdAndCdId(String groupCd, String cdId); |
||||
} |
@ -0,0 +1,8 @@
|
||||
package kr.co.palnet.kac.data.com.repository; |
||||
|
||||
import kr.co.palnet.kac.data.com.domain.ComConfirmBas; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface ComConfirmBasRepository extends JpaRepository<ComConfirmBas, Integer> { |
||||
|
||||
} |
@ -0,0 +1,8 @@
|
||||
package kr.co.palnet.kac.data.com.repository; |
||||
|
||||
import kr.co.palnet.kac.data.com.domain.ComFileBas; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface ComFileBasRepository extends JpaRepository<ComFileBas, Integer> { |
||||
|
||||
} |
@ -0,0 +1,8 @@
|
||||
package kr.co.palnet.kac.data.com.repository; |
||||
|
||||
import kr.co.palnet.kac.data.com.domain.ComIdntfBas; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface ComIdntBasRepository extends JpaRepository<ComIdntfBas, String> { |
||||
|
||||
} |
@ -0,0 +1,8 @@
|
||||
package kr.co.palnet.kac.data.com.repository; |
||||
|
||||
import kr.co.palnet.kac.data.com.domain.ComRiseSetBas; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface ComRiseSetBasRepository extends JpaRepository<ComRiseSetBas, ComRiseSetBas.ComRiseSetBasId> { |
||||
|
||||
} |
@ -0,0 +1,7 @@
|
||||
package kr.co.palnet.kac.data.com.repository; |
||||
|
||||
import kr.co.palnet.kac.data.com.domain.ComSiteBas; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface ComSiteBasRepository extends JpaRepository<ComSiteBas, String>{ |
||||
} |
@ -0,0 +1,7 @@
|
||||
package kr.co.palnet.kac.data.com.repository; |
||||
|
||||
import kr.co.palnet.kac.data.com.domain.ComTrmnlBas; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface ComTrmnlBasRepository extends JpaRepository<ComTrmnlBas, String>{ |
||||
} |
@ -0,0 +1,216 @@
|
||||
package kr.co.palnet.kac.data.com.service; |
||||
|
||||
import java.time.LocalDateTime; |
||||
import java.util.List; |
||||
|
||||
import org.springframework.cache.annotation.CacheConfig; |
||||
import org.springframework.cache.annotation.CacheEvict; |
||||
import org.springframework.cache.annotation.CachePut; |
||||
import org.springframework.cache.annotation.Cacheable; |
||||
import org.springframework.stereotype.Service; |
||||
import org.springframework.transaction.annotation.Transactional; |
||||
|
||||
import kr.co.palnet.kac.data.com.domain.ComCdBas; |
||||
import kr.co.palnet.kac.data.com.domain.ComCdGroupBas; |
||||
import kr.co.palnet.kac.data.com.domain.ComCdLangCtg; |
||||
import kr.co.palnet.kac.data.com.repository.ComCdBasRepository; |
||||
import kr.co.palnet.kac.data.com.repository.ComCdGroupBasRepository; |
||||
import kr.co.palnet.kac.data.com.repository.ComCdLangCtgRepository; |
||||
import lombok.RequiredArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
|
||||
@Slf4j |
||||
@Transactional |
||||
@RequiredArgsConstructor |
||||
@Service |
||||
public class ComCodeDomainService { |
||||
|
||||
private final ComCdGroupBasRepository comCdGroupBasRepository; |
||||
private final ComCdBasRepository comCdBasRepository; |
||||
private final ComCdLangCtgRepository comCdLangCtgRepository; |
||||
|
||||
// 그룹 조회
|
||||
@Transactional(readOnly = true) |
||||
public List<ComCdGroupBas> getComCdGroupBasList() { |
||||
return comCdGroupBasRepository.findAll(); |
||||
} |
||||
|
||||
@Transactional(readOnly = true) |
||||
public List<ComCdGroupBas> getComCdGroupBasList(String siteCd) { |
||||
return comCdGroupBasRepository.findBySiteCd(siteCd); |
||||
} |
||||
|
||||
@Transactional(readOnly = true) |
||||
public ComCdGroupBas getComCdGroupBas(String groupCd) { |
||||
return comCdGroupBasRepository.findById(groupCd).orElse(null); |
||||
} |
||||
|
||||
// 코드 조회
|
||||
@Transactional(readOnly = true) |
||||
public List<ComCdBas> getComCdBasList(String groupCd) { |
||||
return comCdBasRepository.findByGroupCdAndUseYnOrderBySortOrdrAsc(groupCd, "Y"); |
||||
} |
||||
|
||||
@Transactional(readOnly = true) |
||||
public ComCdBas getComCdBas(String groupCd, String cdId) { |
||||
return comCdBasRepository.findByGroupCdAndCdIdAndUseYn(groupCd, cdId, "Y"); |
||||
} |
||||
|
||||
// 언어 조회
|
||||
@Transactional(readOnly = true) |
||||
public List<ComCdLangCtg> getComCdLangCtgList(String groupCd, String cdId) { |
||||
return comCdLangCtgRepository.findByGroupCdAndCdId(groupCd, cdId); |
||||
} |
||||
|
||||
@Transactional(readOnly = true) |
||||
public ComCdLangCtg getComCdLangCtg(String groupCd, String cdId, String langDivCd) { |
||||
ComCdLangCtg.ComCdLangCtgId id = ComCdLangCtg.ComCdLangCtgId.builder() |
||||
.groupCd(groupCd) |
||||
.cdId(cdId) |
||||
.langDivCd(langDivCd) |
||||
.build(); |
||||
return comCdLangCtgRepository.findById(id).orElse(null); |
||||
} |
||||
|
||||
|
||||
// TODO Exception 처리
|
||||
// 그룹 등록
|
||||
public ComCdGroupBas createComCdGroupBas(ComCdGroupBas comCdGroupBas) { |
||||
comCdGroupBasRepository.findById(comCdGroupBas.getGroupCd()).ifPresent(bas -> { |
||||
throw new RuntimeException("이미 존재하는 코드 그룹입니다."); |
||||
}); |
||||
|
||||
// TODO 일자 및 사용자 넣기
|
||||
comCdGroupBas.setCreateDt(LocalDateTime.now()); |
||||
comCdGroupBas.setCreateUserId("CREATE_USER"); |
||||
comCdGroupBas.setUpdateDt(LocalDateTime.now()); |
||||
comCdGroupBas.setUpdateUserId("CREATE_USER"); |
||||
|
||||
return comCdGroupBasRepository.save(comCdGroupBas); |
||||
} |
||||
|
||||
// TODO 일자 및 사용자 넣기
|
||||
// TODO Exception 처리
|
||||
// 코드 등록
|
||||
public ComCdBas createComCdBas(ComCdBas comCdBas) { |
||||
var id = ComCdBas.ComCdBasId.builder() |
||||
.groupCd(comCdBas.getGroupCd()) |
||||
.cdId(comCdBas.getCdId()) |
||||
.build(); |
||||
comCdBasRepository.findById(id).ifPresent(bas -> { |
||||
throw new RuntimeException("이미 존재하는 코드입니다."); |
||||
}); |
||||
// TODO 일자 및 사용자 넣기
|
||||
comCdBas.setCreateDt(LocalDateTime.now()); |
||||
comCdBas.setCreateUserId("CREATE_USER"); |
||||
comCdBas.setUpdateDt(LocalDateTime.now()); |
||||
comCdBas.setUpdateUserId("CREATE_USER"); |
||||
|
||||
return comCdBasRepository.save(comCdBas); |
||||
} |
||||
|
||||
// 언어 등록
|
||||
public ComCdLangCtg createComCdLangCtg(ComCdLangCtg comCdLangCtg) { |
||||
// comCdLangCtgRepository.findById(comCdLangCtg.getId()).ifPresent(bas -> {
|
||||
// throw new RuntimeException("이미 존재하는 코드 언어입니다.");
|
||||
// });
|
||||
var id = ComCdLangCtg.ComCdLangCtgId.builder() |
||||
.groupCd(comCdLangCtg.getGroupCd()) |
||||
.cdId(comCdLangCtg.getCdId()) |
||||
.langDivCd(comCdLangCtg.getLangDivCd()) |
||||
.build(); |
||||
comCdLangCtgRepository.findById(id).ifPresent(bas -> { |
||||
throw new RuntimeException("이미 존재하는 코드 언어입니다."); |
||||
}); |
||||
|
||||
// TODO 일자 및 사용자 넣기
|
||||
comCdLangCtg.setCreateDt(LocalDateTime.now()); |
||||
comCdLangCtg.setCreateUserId("CREATE_USER"); |
||||
comCdLangCtg.setUpdateDt(LocalDateTime.now()); |
||||
comCdLangCtg.setUpdateUserId("CREATE_USER"); |
||||
|
||||
return comCdLangCtgRepository.save(comCdLangCtg); |
||||
} |
||||
|
||||
// TODO Exception 처리
|
||||
// 그룹 수정
|
||||
public ComCdGroupBas updateComCdGroupBas(ComCdGroupBas comCdGroupBas) { |
||||
var bas = comCdGroupBasRepository.findById(comCdGroupBas.getGroupCd()).orElseThrow(() -> { |
||||
throw new RuntimeException("존재하지 않는 코드 그룹입니다."); |
||||
}); |
||||
bas.update(comCdGroupBas); |
||||
|
||||
// TODO 일자 및 사용자 넣기
|
||||
bas.setUpdateDt(LocalDateTime.now()); |
||||
bas.setUpdateUserId("UPDATE_USER"); |
||||
|
||||
return comCdGroupBasRepository.save(bas); |
||||
} |
||||
|
||||
// TODO 일자 및 사용자 넣기
|
||||
// TODO Exception 처리
|
||||
// 코드 수정
|
||||
public ComCdBas updateComCdBas(ComCdBas comCdBas) { |
||||
|
||||
var id = ComCdBas.ComCdBasId.builder() |
||||
.groupCd(comCdBas.getGroupCd()) |
||||
.cdId(comCdBas.getCdId()) |
||||
.build(); |
||||
|
||||
var bas = comCdBasRepository.findById(id).orElseThrow(() -> { |
||||
throw new RuntimeException("존재하지 않는 코드입니다."); |
||||
}); |
||||
bas.update(comCdBas); |
||||
|
||||
// TODO 일자 및 사용자 넣기
|
||||
bas.setUpdateDt(LocalDateTime.now()); |
||||
bas.setUpdateUserId("UPDATE_USER"); |
||||
|
||||
return comCdBasRepository.save(bas); |
||||
} |
||||
|
||||
// TODO 일자 및 사용자 넣기
|
||||
// TODO Exception 처리
|
||||
// 언어 수정
|
||||
public ComCdLangCtg updateComCdLangCtg(ComCdLangCtg comCdLangCtg) { |
||||
var id = ComCdLangCtg.ComCdLangCtgId.builder() |
||||
.groupCd(comCdLangCtg.getGroupCd()) |
||||
.cdId(comCdLangCtg.getCdId()) |
||||
.langDivCd(comCdLangCtg.getLangDivCd()) |
||||
.build(); |
||||
var bas = comCdLangCtgRepository.findById(id).orElseThrow(() -> { |
||||
throw new RuntimeException("존재하지 않는 코드 언어입니다."); |
||||
}); |
||||
bas.update(comCdLangCtg); |
||||
|
||||
// TODO 일자 및 사용자 넣기
|
||||
bas.setUpdateDt(LocalDateTime.now()); |
||||
bas.setUpdateUserId("UPDATE_USER"); |
||||
|
||||
return comCdLangCtgRepository.save(bas); |
||||
} |
||||
|
||||
// 그룹 삭제
|
||||
public void deleteComCdGroupBas(String groupCd) { |
||||
comCdGroupBasRepository.deleteById(groupCd); |
||||
} |
||||
|
||||
// 코드 삭제
|
||||
public void deleteComCdBas(String groupCd, String cdId) { |
||||
var id = ComCdBas.ComCdBasId.builder() |
||||
.groupCd(groupCd) |
||||
.cdId(cdId) |
||||
.build(); |
||||
comCdBasRepository.deleteById(id); |
||||
} |
||||
|
||||
// 언어 삭제
|
||||
public void deleteComCdLangCtg(String groupCd, String cdId, String langDivCd) { |
||||
var id = ComCdLangCtg.ComCdLangCtgId.builder() |
||||
.groupCd(groupCd) |
||||
.cdId(cdId) |
||||
.langDivCd(langDivCd) |
||||
.build(); |
||||
comCdLangCtgRepository.deleteById(id); |
||||
} |
||||
} |
@ -0,0 +1,38 @@
|
||||
package kr.co.palnet.kac.data.com; |
||||
|
||||
import org.springframework.boot.SpringApplication; |
||||
import org.springframework.boot.autoconfigure.SpringBootApplication; |
||||
import org.springframework.boot.autoconfigure.domain.EntityScan; |
||||
import org.springframework.context.annotation.ComponentScan; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; |
||||
|
||||
@SpringBootApplication |
||||
public class DataComApplicationTestApp { |
||||
public static void main(String[] args) { |
||||
SpringApplication.run(DataComApplicationTestApp.class, args); |
||||
} |
||||
|
||||
@Configuration |
||||
@ComponentScan("kr.co.palnet.kac.data.com") |
||||
// @EnableJpaRepositories(basePackages = {
|
||||
// "kr.co.palnet.kac.data.com.repository"
|
||||
// })
|
||||
// @EntityScan(basePackages = {
|
||||
// "kr.co.palnet.kac.data.com.domain"
|
||||
// })
|
||||
public class Config { |
||||
|
||||
} |
||||
|
||||
// @Configuration
|
||||
// public class QueryDslConfig {
|
||||
// @PersistenceContext
|
||||
// private EntityManager entityManager;
|
||||
//
|
||||
// @Bean
|
||||
// public JPAQueryFactory jpaQueryFactory() {
|
||||
// return new JPAQueryFactory(entityManager);
|
||||
// }
|
||||
// }
|
||||
} |
@ -0,0 +1,234 @@
|
||||
package kr.co.palnet.kac.data.com.service; |
||||
|
||||
import kr.co.palnet.kac.data.com.domain.ComCdBas; |
||||
import kr.co.palnet.kac.data.com.domain.ComCdGroupBas; |
||||
import kr.co.palnet.kac.data.com.domain.ComCdLangCtg; |
||||
import kr.co.palnet.kac.data.com.domain.QComCdBas; |
||||
import kr.co.palnet.kac.data.com.repository.ComCdBasRepository; |
||||
import kr.co.palnet.kac.data.com.repository.ComCdGroupBasRepository; |
||||
import kr.co.palnet.kac.data.com.repository.ComCdLangCtgRepository; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.junit.jupiter.api.BeforeEach; |
||||
import org.junit.jupiter.api.DisplayName; |
||||
import org.junit.jupiter.api.Test; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; |
||||
|
||||
import java.time.LocalDateTime; |
||||
|
||||
@Slf4j |
||||
@DataJpaTest |
||||
class ComCodeDomainServiceTest { |
||||
|
||||
@Autowired |
||||
private ComCodeDomainService comCodeDomainService; |
||||
|
||||
@Autowired |
||||
private ComCdGroupBasRepository comCdGroupBasRepository; |
||||
@Autowired |
||||
private ComCdBasRepository comCdBasRepository; |
||||
@Autowired |
||||
private ComCdLangCtgRepository comCdLangCtgRepository; |
||||
|
||||
@BeforeEach |
||||
void before() { |
||||
log.info("before start"); |
||||
this.comCdLangCtgRepository.deleteAll(); |
||||
this.comCdBasRepository.deleteAll(); |
||||
this.comCdGroupBasRepository.deleteAll(); |
||||
|
||||
for (int i = 0; i < 3; i++) { |
||||
ComCdGroupBas comCdGroupBas = ComCdGroupBas.builder() |
||||
.groupCd("TEST" + i) |
||||
.siteCd("KAC") |
||||
.groupCdNm("테스트" + i) |
||||
.rm("비고") |
||||
.createUserId("INIT_CREATE_USER") |
||||
.createDt(LocalDateTime.now()) |
||||
.updateUserId("INIT_UPDATE_USER") |
||||
.updateDt(LocalDateTime.now()) |
||||
.build(); |
||||
|
||||
ComCdGroupBas saveComCdGroupBas = comCdGroupBasRepository.save(comCdGroupBas); |
||||
|
||||
for (int j = 0; j < 10; j++) { |
||||
|
||||
ComCdBas comCdBas = ComCdBas.builder() |
||||
.groupCd("TEST" + i) |
||||
.cdId("TEST" + j) |
||||
.addInfoValue("add infomation.") |
||||
.sortOrdr(0) |
||||
.useYn("Y") |
||||
.createUserId("INIT_CREATE_USER") |
||||
.createDt(LocalDateTime.now()) |
||||
.updateUserId("INIT_UPDATE_USER") |
||||
.updateDt(LocalDateTime.now()) |
||||
.build(); |
||||
|
||||
// comCdBas.setComCdGroupBas(saveComCdGroupBas);
|
||||
ComCdBas saveComCdBas = comCdBasRepository.save(comCdBas); |
||||
|
||||
for (int k = 0; k < 2; k++) { |
||||
ComCdLangCtg comCdLangCtg = ComCdLangCtg.builder() |
||||
.groupCd("TEST" + i) |
||||
.cdId("TEST" + j) |
||||
.langDivCd(k != 1 ? "ko_KR" : "en_US") |
||||
.cdNm("테스트") |
||||
.createUserId("INIT_CREATE_USER") |
||||
.createDt(LocalDateTime.now()) |
||||
.updateUserId("INIT_UPDATE_USER") |
||||
.updateDt(LocalDateTime.now()) |
||||
.build(); |
||||
|
||||
// comCdLangCtg.setComCdBas(saveComCdBas);
|
||||
comCdLangCtgRepository.save(comCdLangCtg); |
||||
} |
||||
} |
||||
|
||||
|
||||
} |
||||
|
||||
|
||||
log.info("before end"); |
||||
} |
||||
|
||||
@DisplayName("before...") |
||||
@Test |
||||
void testBefore() { |
||||
log.info("before..."); |
||||
} |
||||
|
||||
@DisplayName("그룹 조회 - 목록") |
||||
@Test |
||||
void getComCdGroupBasList() { |
||||
comCodeDomainService.getComCdGroupBasList(null).forEach(comCdGroupBas -> log.info("{}", comCdGroupBas)); |
||||
} |
||||
|
||||
@DisplayName("그룹 조회 - 단건") |
||||
@Test |
||||
void getComCdGroupBas() { |
||||
var comCdGroupBas = comCodeDomainService.getComCdGroupBas("TEST"); |
||||
log.info("{}", comCdGroupBas); |
||||
} |
||||
|
||||
@DisplayName("코드 조회 - 목록") |
||||
@Test |
||||
void getComCdBasList() { |
||||
comCodeDomainService.getComCdBasList("TEST").forEach(bas -> log.info("{}", bas)); |
||||
} |
||||
|
||||
@DisplayName("코드 조회 - 단건") |
||||
@Test |
||||
void getComCdBas() { |
||||
var comCdBas = comCodeDomainService.getComCdBas("TEST", "TEST"); |
||||
log.info("{}", comCdBas); |
||||
} |
||||
|
||||
@DisplayName("언어 조회 - 목록") |
||||
@Test |
||||
void getComCdLangCtgList() { |
||||
comCodeDomainService.getComCdLangCtgList("TEST", "TEST").forEach(lang -> log.info("{}", lang)); |
||||
} |
||||
|
||||
@DisplayName("언어 조회 - 단건") |
||||
@Test |
||||
void getComCdLangCtg() { |
||||
ComCdLangCtg comCdLangCtg = comCodeDomainService.getComCdLangCtg("TEST", "TEST", "ko_KR"); |
||||
log.info("{}", comCdLangCtg); |
||||
} |
||||
|
||||
|
||||
@DisplayName("그룹 등록 - 단건") |
||||
@Test |
||||
void createComCdGroupBas() { |
||||
ComCdGroupBas entity = ComCdGroupBas.builder() |
||||
.groupCd("TEST100") |
||||
.siteCd("KAC") |
||||
.groupCdNm("테스트") |
||||
.rm("비고") |
||||
.build(); |
||||
comCodeDomainService.createComCdGroupBas(entity); |
||||
} |
||||
|
||||
@DisplayName("코드 등록 - 단건") |
||||
@Test |
||||
void createComCdBas() { |
||||
ComCdBas entity = ComCdBas.builder() |
||||
.groupCd("TEST1") |
||||
.cdId("TEST100") |
||||
.addInfoValue("add infomation.") |
||||
.sortOrdr(0) |
||||
.useYn("Y") |
||||
.build(); |
||||
comCodeDomainService.createComCdBas(entity); |
||||
} |
||||
|
||||
@DisplayName("언어 등록 - 단건") |
||||
@Test |
||||
void createComCdLangCtg() { |
||||
|
||||
|
||||
ComCdLangCtg entity = ComCdLangCtg.builder() |
||||
.groupCd("TEST1") |
||||
.cdId("TEST1") |
||||
.langDivCd("zh_CN") |
||||
.cdNm("테스트1") |
||||
.build(); |
||||
ComCdLangCtg comCdLangCtg = comCodeDomainService.createComCdLangCtg(entity); |
||||
log.info("{}", comCdLangCtg); |
||||
} |
||||
|
||||
@DisplayName("그룹 수정 - 단건") |
||||
@Test |
||||
void updateComCdGroupBas() { |
||||
ComCdGroupBas entity = ComCdGroupBas.builder() |
||||
.groupCd("TEST0") |
||||
.siteCd("KAC") |
||||
.groupCdNm("테스트") |
||||
.rm("비고-update") |
||||
.build(); |
||||
ComCdGroupBas comCdGroupBas = comCodeDomainService.updateComCdGroupBas(entity); |
||||
log.info("{}", comCdGroupBas); |
||||
} |
||||
|
||||
@DisplayName("코드 수정 - 단건") |
||||
@Test |
||||
void updateComCdBas() { |
||||
ComCdBas entity = ComCdBas.builder() |
||||
.groupCd("TEST0") |
||||
.cdId("TEST7") |
||||
.addInfoValue("add infomation - update.") |
||||
.build(); |
||||
comCodeDomainService.updateComCdBas(entity); |
||||
} |
||||
|
||||
@DisplayName("언어 수정 - 단건") |
||||
@Test |
||||
void updateComCdLangCtg() { |
||||
ComCdLangCtg entity = ComCdLangCtg.builder() |
||||
.groupCd("TEST0") |
||||
.cdId("TEST7") |
||||
.langDivCd("ko_KR") |
||||
.cdNm("테스트1 - update") |
||||
.build(); |
||||
comCodeDomainService.updateComCdLangCtg(entity); |
||||
} |
||||
|
||||
@DisplayName("그룹 삭제 - 단건") |
||||
@Test |
||||
void deleteComCdGroupBas() { |
||||
comCodeDomainService.deleteComCdGroupBas("TEST3"); |
||||
} |
||||
|
||||
@DisplayName("코드 삭제 - 단건") |
||||
@Test |
||||
void deleteComCdBas() { |
||||
comCodeDomainService.deleteComCdBas("TEST3", "TEST3"); |
||||
} |
||||
|
||||
@DisplayName("언어 삭제 - 단건") |
||||
@Test |
||||
void deleteComCdLangCtg() { |
||||
comCodeDomainService.deleteComCdLangCtg("TEST3", "TEST3", "en_US"); |
||||
} |
||||
} |
@ -0,0 +1,27 @@
|
||||
|
||||
dependencies { |
||||
implementation "$boot:spring-boot-starter-data-jpa" |
||||
|
||||
implementation "com.querydsl:querydsl-jpa:5.0.0:jakarta" |
||||
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" |
||||
annotationProcessor "jakarta.annotation:jakarta.annotation-api" |
||||
annotationProcessor "jakarta.persistence:jakarta.persistence-api" |
||||
|
||||
|
||||
|
||||
testRuntimeOnly("com.h2database:h2") |
||||
} |
||||
|
||||
def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile |
||||
|
||||
sourceSets { |
||||
main.java.srcDir(querydslDir) |
||||
} |
||||
|
||||
tasks.withType(JavaCompile) { |
||||
options.getGeneratedSourceOutputDirectory().set(file(querydslDir)) |
||||
} |
||||
|
||||
clean { |
||||
delete file(querydslDir) |
||||
} |
@ -0,0 +1,99 @@
|
||||
package kr.co.palnet.kac.data.ctr.model; |
||||
|
||||
import jakarta.persistence.*; |
||||
import lombok.*; |
||||
|
||||
import java.time.Instant; |
||||
import java.util.List; |
||||
|
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
@ToString(exclude = {"ctrCntrlHstryList"}) |
||||
@Entity |
||||
@Table(name = "CTR_CNTRL_BAS") |
||||
public class CtrCntrlBas { |
||||
|
||||
// 관제ID
|
||||
@Id |
||||
@Column(name = "CNTRL_ID", length = 60) |
||||
private String cntrlId; |
||||
|
||||
// 식별번호
|
||||
@Column(name = "IDNTF_NUM", length = 30, nullable = false) |
||||
private String idntfNum; |
||||
|
||||
// 상태코드
|
||||
@Column(name = "STATUS_CD", length = 20, nullable = false) |
||||
private String statusCd; |
||||
|
||||
// 처리상태여부
|
||||
@Column(name = "PROC_STATUS_YN", columnDefinition = "char(1) default 'N'", nullable = false) |
||||
private String procStatusYn; |
||||
|
||||
// 물체타입코드
|
||||
@Column(name = "OBJECT_TYPE_CD", length = 20, nullable = false) |
||||
private String objectTypeCd; |
||||
|
||||
// 비행시작일시
|
||||
@Column(name = "FLGHT_ST_DT", columnDefinition = "datetime(6)") |
||||
private Instant flghtStDt; |
||||
|
||||
// 비행종료일시
|
||||
@Column(name = "FLGHT_END_DT", columnDefinition = "datetime(6)") |
||||
private Instant flghtEndDt; |
||||
|
||||
// 관제시작일시
|
||||
@Column(name = "CNTRL_ST_DT", columnDefinition = "datetime(6)", nullable = false) |
||||
private Instant cntrlStDt; |
||||
|
||||
// 관제종료일시
|
||||
@Column(name = "CNTRL_END_DT", columnDefinition = "datetime(6)") |
||||
private Instant cntrlEndDt; |
||||
|
||||
// 총비행시간
|
||||
@Column(name = "TTL_TIME", columnDefinition = "double default 0.0") |
||||
private Double ttlTime; |
||||
|
||||
// 총비행시간단위
|
||||
@Column(name = "TTL_TIME_TYPE", length = 20) |
||||
private String ttlTimeType; |
||||
|
||||
// 총비행거리
|
||||
@Column(name = "TTL_DSTNC", columnDefinition = "double default 0.0") |
||||
private Double ttlDstnc; |
||||
|
||||
// 총비행거리단위
|
||||
@Column(name = "TTL_DSTNC_TYPE", length = 20) |
||||
private String ttlDstncType; |
||||
|
||||
// 평균속도
|
||||
@Column(name = "AVRG_SPEED", columnDefinition = "double default 0.0") |
||||
private Double avrgSpeed; |
||||
|
||||
// 평균속도단위
|
||||
@Column(name = "AVRG_SPEED_TYPE", length = 20) |
||||
private String avrgSpeedType; |
||||
|
||||
// 배터리소모량
|
||||
@Column(name = "BTTR_CNSMPTN", columnDefinition = "double default 0.0") |
||||
private Double bttrCnsmptn; |
||||
|
||||
// 종료타입코드
|
||||
@Column(name = "END_TYPE_CD", length = 20) |
||||
private String endTypeCd; |
||||
|
||||
// 생성일시
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) |
||||
private Instant createDt; |
||||
|
||||
// 수정일시
|
||||
@Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) |
||||
private Instant updateDt; |
||||
|
||||
@OneToMany(mappedBy = "ctrCntrlBas", fetch = FetchType.LAZY) |
||||
private List<CtrCntrlHstry> ctrCntrlHstryList; |
||||
|
||||
} |
@ -0,0 +1,123 @@
|
||||
package kr.co.palnet.kac.data.ctr.model; |
||||
|
||||
import jakarta.persistence.*; |
||||
import lombok.*; |
||||
|
||||
import java.time.Instant; |
||||
import java.util.List; |
||||
|
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
@ToString(exclude = {"ctrCntrlHstryAreaList", "ctrCntrlBas"}) |
||||
@Entity |
||||
@Table(name = "CTR_CNTRL_HSTRY") |
||||
public class CtrCntrlHstry { |
||||
|
||||
// 이력일련번호
|
||||
@Id |
||||
@GeneratedValue(strategy = GenerationType.IDENTITY) |
||||
@Column(name = "HSTRY_SNO", columnDefinition = "int unsigned") |
||||
private Long hstrySno; |
||||
|
||||
// 관제ID
|
||||
@Column(name = "CNTRL_ID", length = 60, nullable = false) |
||||
private String cntrlId; |
||||
|
||||
// 터미널ID
|
||||
@Column(name = "TRMNL_ID", length = 100, nullable = false) |
||||
private String trmnlId; |
||||
|
||||
// 메시지코드
|
||||
@Column(name = "MSSG_TYPE_CD", length = 20, nullable = false) |
||||
private String mssgTypeCd; |
||||
|
||||
// 상태코드
|
||||
@Column(name = "STATUS_CD", length = 20) |
||||
private String statusCd; |
||||
|
||||
// 위도
|
||||
@Column(name = "LAT", columnDefinition = "double(18,10)", nullable = false) |
||||
private Double lat; |
||||
|
||||
// 경도
|
||||
@Column(name = "LON", columnDefinition = "double(18,10)", nullable = false) |
||||
private Double lon; |
||||
|
||||
// 속도
|
||||
@Column(name = "SPEED", columnDefinition = "double") |
||||
private Double speed; |
||||
|
||||
// 속도단위
|
||||
@Column(name = "SPEED_TYPE", length = 20) |
||||
private String speedType; |
||||
|
||||
// 방향
|
||||
@Column(name = "HEADING", columnDefinition = "double") |
||||
private Double heading; |
||||
|
||||
// 고도단위
|
||||
@Column(name = "ELEV_TYPE", length = 20) |
||||
private String elevType; |
||||
|
||||
// 고도
|
||||
@Column(name = "ELEV", columnDefinition = "double") |
||||
private Double elev; |
||||
|
||||
// 이동거리
|
||||
@Column(name = "MV_DSTNC", columnDefinition = "double") |
||||
private Double mvDstnc; |
||||
|
||||
// 이동거리단위
|
||||
@Column(name = "MV_DSTNC_TYPE", length = 20) |
||||
private String mvDstncType; |
||||
|
||||
// 배터리잔량
|
||||
@Column(name = "BTTR_LVL", columnDefinition = "double") |
||||
private Double bttrLvl; |
||||
|
||||
// 배터리전압
|
||||
@Column(name = "BTTR_VLTG", columnDefinition = "double") |
||||
private Double bttrVltg; |
||||
|
||||
// 단말기수신시간
|
||||
@Column(name = "TRMNL_RCV_DT", columnDefinition = "datetime(6)") |
||||
private Instant trmnlRcvDt; |
||||
|
||||
// 서버수신시간
|
||||
@Column(name = "SRVR_RCV_DT", columnDefinition = "datetime(6)", nullable = false) |
||||
private Instant srvrRcvDt; |
||||
|
||||
// 환경센서 필드
|
||||
// 일산화탄소
|
||||
@Column(name = "SENSOR_CO", columnDefinition = "double") |
||||
private Double sensorCo; |
||||
|
||||
// 아황산가스
|
||||
@Column(name = "SENSOR_SO2", columnDefinition = "double") |
||||
private Double sensorSo2; |
||||
|
||||
// 이산화질소
|
||||
@Column(name = "SENSOR_NO2", columnDefinition = "double") |
||||
private Double sensorNo2; |
||||
|
||||
// 오존
|
||||
@Column(name = "SENSOR_O3", columnDefinition = "double") |
||||
private Double sensorO3; |
||||
|
||||
// 미세먼지
|
||||
@Column(name = "SENSOR_DUST", columnDefinition = "double") |
||||
private Double sensorDust; |
||||
|
||||
@JoinColumn( |
||||
name = "CNTRL_ID", insertable = false, updatable = false, |
||||
foreignKey = @ForeignKey(name = "FK_CTR_CNTRL_HSTRY_CTR_CNTRL_BAS") |
||||
) |
||||
@ManyToOne(fetch = FetchType.LAZY) |
||||
private CtrCntrlBas ctrCntrlBas; |
||||
|
||||
@OneToMany(mappedBy = "ctrCntrlHstry", fetch = FetchType.LAZY) |
||||
private List<CtrCntrlHstryArea> ctrCntrlHstryAreaList; |
||||
} |
@ -0,0 +1,96 @@
|
||||
package kr.co.palnet.kac.data.ctr.model; |
||||
|
||||
import jakarta.persistence.*; |
||||
import lombok.*; |
||||
|
||||
import java.time.Instant; |
||||
|
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
@ToString(exclude = {"ctrCntrlHstry"}) |
||||
@Entity |
||||
@Table(name = "CTR_CNTRL_HSTRY_AREA") |
||||
public class CtrCntrlHstryArea { |
||||
|
||||
// 이력지역일련번호
|
||||
@Id |
||||
@GeneratedValue(strategy = GenerationType.IDENTITY) |
||||
@Column(name = "HSTRY_AREA_SNO", columnDefinition = "int unsigned") |
||||
private Long hstryAreaSno; |
||||
|
||||
// 이력일련번호
|
||||
@Column(name = "HSTRY_SNO", columnDefinition = "int unsigned", nullable = false) |
||||
private int hstrySno; |
||||
|
||||
// 관제ID
|
||||
@Column(name = "CNTRL_ID", length = 60, nullable = false) |
||||
private String cntrlId; |
||||
|
||||
// 행동구분
|
||||
@Column(name = "ACTN_TYPE", length = 20, nullable = false) |
||||
private String actnType; |
||||
|
||||
// 처리여부
|
||||
@Column(name = "PRCS_YN", columnDefinition = "char(1) default 'N'", nullable = false) |
||||
private String prcsYn; |
||||
|
||||
|
||||
// 위도
|
||||
@Column(name = "LAT", columnDefinition = "double(18,10)") |
||||
private Double lat; |
||||
|
||||
// 경도
|
||||
@Column(name = "LON", columnDefinition = "double(18,10)") |
||||
private Double lon; |
||||
|
||||
// 시도명
|
||||
@Column(name = "AREA1", length = 20) |
||||
private String area1; |
||||
|
||||
// 시군구명
|
||||
@Column(name = "AREA2", length = 20) |
||||
private String area2; |
||||
|
||||
// 읍면동명
|
||||
@Column(name = "AREA3", length = 20) |
||||
private String area3; |
||||
|
||||
// 우편번호
|
||||
@Column(name = "ZIP_CD", length = 6) |
||||
private String zipCd; |
||||
|
||||
// 도로명
|
||||
@Column(name = "LAND_NM", length = 30) |
||||
private String landNm; |
||||
|
||||
// 도로번호
|
||||
@Column(name = "LAND_NUM", length = 10) |
||||
private String landNum; |
||||
|
||||
// 지역타입
|
||||
@Column(name = "AREA_TYPE", length = 20) |
||||
private String areaType; |
||||
|
||||
// 지역명
|
||||
@Column(name = "AREA_NM", length = 100) |
||||
private String areaNm; |
||||
|
||||
// 등록일시
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) |
||||
private Instant createDt; |
||||
|
||||
// 수정일시
|
||||
@Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) |
||||
private Instant updateDt; |
||||
|
||||
@JoinColumn( |
||||
name = "HSTRY_SNO", updatable = false, insertable = false, |
||||
foreignKey = @ForeignKey(name = "FK_CTR_CNTRL_HSTRY_AREA_CTR_CNTRL_HSTRY") |
||||
) |
||||
@ManyToOne(fetch = FetchType.LAZY) |
||||
private CtrCntrlHstry ctrCntrlHstry; |
||||
|
||||
} |
@ -0,0 +1,61 @@
|
||||
package kr.co.palnet.kac.data.ctr.model; |
||||
|
||||
import jakarta.persistence.*; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Builder; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
|
||||
import java.time.Instant; |
||||
|
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
@Builder |
||||
@Entity |
||||
@Table(name = "CTR_CNTRL_WARN_LOG") |
||||
public class CtrCntrlWarnLog { |
||||
|
||||
// 로그일련번호
|
||||
@Id |
||||
@GeneratedValue(strategy = GenerationType.IDENTITY) |
||||
@Column(name = "WARN_LOG_SNO", columnDefinition = "int unsigned") |
||||
private Integer warnLogSno; |
||||
|
||||
// 관제ID
|
||||
@Column(name = "CNTRL_ID", length = 60, nullable = false) |
||||
private String cntrlId; |
||||
|
||||
// 상황종류
|
||||
@Column(name = "WARN_TYPE", length = 30, nullable = false) |
||||
private String warnType; |
||||
|
||||
// 식별번호
|
||||
@Column(name = "IDNTF_NUM", length = 30, nullable = false) |
||||
private String idntfNum; |
||||
|
||||
// 발생시간
|
||||
@Column(name = "OCCUR_DT", columnDefinition = "datetime(6)", nullable = false) |
||||
private Instant occurDt; |
||||
|
||||
// 위도
|
||||
@Column(name = "LAT", columnDefinition = "double(18,10)") |
||||
private Double lat; |
||||
|
||||
// 경도
|
||||
@Column(name = "LON", columnDefinition = "double(18,10)") |
||||
private Double lon; |
||||
|
||||
// 고도
|
||||
@Column(name = "ELEV", columnDefinition = "double") |
||||
private Double elev; |
||||
|
||||
// 등록일자
|
||||
@Column(name = "CREATE_DT", columnDefinition = "datetime", updatable = false, nullable = false) |
||||
private Instant createDt; |
||||
|
||||
// 등록사용자ID
|
||||
@Column(name = "CREATE_USER_ID", length = 30, updatable = false, nullable = false) |
||||
private String createUserId; |
||||
|
||||
} |
@ -0,0 +1,8 @@
|
||||
package kr.co.palnet.kac.data.ctr.repository; |
||||
|
||||
import kr.co.palnet.kac.data.ctr.model.CtrCntrlBas; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface CtrCntrlBasRepository extends JpaRepository<CtrCntrlBas, String> { |
||||
|
||||
} |
@ -0,0 +1,8 @@
|
||||
package kr.co.palnet.kac.data.ctr.repository; |
||||
|
||||
import kr.co.palnet.kac.data.ctr.model.CtrCntrlHstryArea; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface CtrCntrlHstryAreaRepository extends JpaRepository<CtrCntrlHstryArea, Integer> { |
||||
|
||||
} |
@ -0,0 +1,9 @@
|
||||
package kr.co.palnet.kac.data.ctr.repository; |
||||
|
||||
import kr.co.palnet.kac.data.ctr.model.CtrCntrlHstry; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface CtrCntrlHstryRepository extends JpaRepository<CtrCntrlHstry, Integer> { |
||||
|
||||
|
||||
} |
@ -0,0 +1,7 @@
|
||||
package kr.co.palnet.kac.data.ctr.repository; |
||||
|
||||
import kr.co.palnet.kac.data.ctr.model.CtrCntrlWarnLog; |
||||
import org.springframework.data.jpa.repository.JpaRepository; |
||||
|
||||
public interface CtrCntrlWarnLogRepository extends JpaRepository<CtrCntrlWarnLog, Integer> { |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue