From a6ace9a047e53e9c254aee65a27f1aee529157e9 Mon Sep 17 00:00:00 2001 From: mjkhan21 Date: Thu, 29 Jun 2023 10:01:09 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B5=9C=EC=B4=88=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 275 +++++++++++++ .../tool/crudgen/service/CrudgenService.java | 164 ++++++++ .../crudgen/service/bean/BeanFactory.java | 69 ++++ .../crudgen/service/bean/CodeFactory.java | 87 ++++ .../service/bean/ControllerFactory.java | 57 +++ .../crudgen/service/bean/EntityFactory.java | 87 ++++ .../tool/crudgen/service/bean/EntityInfo.java | 108 +++++ .../tool/crudgen/service/bean/FieldInfo.java | 106 +++++ .../crudgen/service/bean/JavadocSupport.java | 104 +++++ .../crudgen/service/bean/MapperFactory.java | 69 ++++ .../service/bean/MapperXmlFactory.java | 154 +++++++ .../crudgen/service/bean/QueryFactory.java | 67 +++ .../service/bean/ServiceBeanFactory.java | 65 +++ .../crudgen/service/bean/ServiceFactory.java | 67 +++ .../bean/TemplateBasedCodeFactory.java | 7 + .../crudgen/service/bean/TestFactory.java | 53 +++ .../tool/crudgen/web/CrudgenController.java | 47 +++ src/main/resources/template/bean.tmpl | 80 ++++ src/main/resources/template/controller.tmpl | 103 +++++ src/main/resources/template/mapper-xml.tmpl | 48 +++ src/main/resources/template/mapper.tmpl | 97 +++++ .../resources/template/query-request.tmpl | 17 + src/main/resources/template/service-bean.tmpl | 56 +++ .../resources/template/service-interface.tmpl | 59 +++ src/main/resources/template/service-test.tmpl | 49 +++ .../xit/tool/crudgen/test/CRUDGenTest.java | 121 ++++++ src/test/resources/log4jdbc.log4j2.properties | 4 + src/test/resources/logback.xml | 94 +++++ src/test/resources/lombok.config | 2 + .../message/message-common.properties | 385 ++++++++++++++++++ .../message/message-common_en.properties | 287 +++++++++++++ .../message/message-common_ko.properties | 385 ++++++++++++++++++ src/test/resources/spring/context-common.xml | 69 ++++ .../resources/spring/context-datasource.xml | 45 ++ .../resources/sql/mapper/base/test-mapper.xml | 13 + .../resources/sql/mapper/base/utility.xml | 29 ++ src/test/resources/sql/mybatis-config.xml | 25 ++ 37 files changed, 3554 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/CrudgenService.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/bean/BeanFactory.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/bean/CodeFactory.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/bean/ControllerFactory.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/bean/EntityFactory.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/bean/EntityInfo.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/bean/FieldInfo.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/bean/JavadocSupport.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/bean/MapperFactory.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/bean/MapperXmlFactory.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/bean/QueryFactory.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/bean/ServiceBeanFactory.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/bean/ServiceFactory.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/bean/TemplateBasedCodeFactory.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/service/bean/TestFactory.java create mode 100644 src/main/java/cokr/xit/tool/crudgen/web/CrudgenController.java create mode 100644 src/main/resources/template/bean.tmpl create mode 100644 src/main/resources/template/controller.tmpl create mode 100644 src/main/resources/template/mapper-xml.tmpl create mode 100644 src/main/resources/template/mapper.tmpl create mode 100644 src/main/resources/template/query-request.tmpl create mode 100644 src/main/resources/template/service-bean.tmpl create mode 100644 src/main/resources/template/service-interface.tmpl create mode 100644 src/main/resources/template/service-test.tmpl create mode 100644 src/test/java/cokr/xit/tool/crudgen/test/CRUDGenTest.java create mode 100644 src/test/resources/log4jdbc.log4j2.properties create mode 100644 src/test/resources/logback.xml create mode 100644 src/test/resources/lombok.config create mode 100644 src/test/resources/message/message-common.properties create mode 100644 src/test/resources/message/message-common_en.properties create mode 100644 src/test/resources/message/message-common_ko.properties create mode 100644 src/test/resources/spring/context-common.xml create mode 100644 src/test/resources/spring/context-datasource.xml create mode 100644 src/test/resources/sql/mapper/base/test-mapper.xml create mode 100644 src/test/resources/sql/mapper/base/utility.xml create mode 100644 src/test/resources/sql/mybatis-config.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..3ff4e6c --- /dev/null +++ b/pom.xml @@ -0,0 +1,275 @@ + + 4.0.0 + + cokr.xit.tool + xit-crudgen + 23.04.01-SNAPSHOT + jar + + xit-crudgen + http://maven.apache.org + + + UTF-8 + + 17 + ${java.version} + ${java.version} + + 5.3.20 + 4.1.0 + + + + + mvn2s + https://repo1.maven.org/maven2/ + + true + + + true + + + + egovframe + http://maven.egovframe.kr:8080/maven/ + + true + + + false + + + + egovframe2 + https://www.egovframe.go.kr/maven/ + + true + + + false + + + + + + + + cokr.xit.tool + xit-codegen + 23.04.01-SNAPSHOT + + + + org.mariadb.jdbc + mariadb-java-client + 2.7.2 + test + + + + + install + ${basedir}/target + ${project.artifactId}-${project.version} + + + ${basedir}/src/main/resources + + + + ${basedir}/src/test/resources + ${basedir}/src/main/resources + + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.2 + + 80 + / + + -Xms256m -Xmx768m -XX:MaxPermSize=256m + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + UTF-8 + + + --add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED + + + + org.projectlombok + lombok + 1.18.28 + + + + + + org.codehaus.mojo + hibernate3-maven-plugin + 2.1 + + + + hbm2ddl + annotationconfiguration + + + + + + org.hsqldb + hsqldb + 2.3.2 + + + + + + org.codehaus.mojo + emma-maven-plugin + 1.0-alpha-3 + + + + org.apache.maven.plugins + maven-pmd-plugin + 3.1 + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + **/*.class + **/*.tmpl + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + true + xml + + **/Abstract*.java + **/*Suite.java + + + **/*Test.java + + + --add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED + --add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED + + + + org.projectlombok + lombok + 1.18.28 + + + + + + org.codehaus.mojo + emma-maven-plugin + true + + + org.apache.maven.plugins + maven-source-plugin + 2.2 + + + attach-sources + + jar + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9.1 + + + + + + + + + maven-snapshot + http://xit.xit-nexus.com:8081/repository/maven-snapshots/ + + + + maven-release + http://xit.xit-nexus.com:8081/repository/maven-releases/ + + + + + \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/CrudgenService.java b/src/main/java/cokr/xit/tool/crudgen/service/CrudgenService.java new file mode 100644 index 0000000..21252b4 --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/CrudgenService.java @@ -0,0 +1,164 @@ +package cokr.xit.tool.crudgen.service; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.annotation.Resource; +import javax.sql.DataSource; + +import org.springframework.stereotype.Service; + +import cokr.xit.foundation.component.AbstractServiceBean; +import cokr.xit.foundation.data.StringMap; +import cokr.xit.tool.codegen.SourceWriter; +import cokr.xit.tool.codegen.table.TableInfo; +import cokr.xit.tool.codegen.table.TableInfoFactory; +import cokr.xit.tool.crudgen.service.bean.BeanFactory; +import cokr.xit.tool.crudgen.service.bean.CodeFactory; +import cokr.xit.tool.crudgen.service.bean.ControllerFactory; +import cokr.xit.tool.crudgen.service.bean.EntityFactory; +import cokr.xit.tool.crudgen.service.bean.EntityInfo; +import cokr.xit.tool.crudgen.service.bean.MapperFactory; +import cokr.xit.tool.crudgen.service.bean.MapperXmlFactory; +import cokr.xit.tool.crudgen.service.bean.QueryFactory; +import cokr.xit.tool.crudgen.service.bean.ServiceBeanFactory; +import cokr.xit.tool.crudgen.service.bean.ServiceFactory; +import cokr.xit.tool.crudgen.service.bean.TestFactory; + +@Service("crudgenService") +public class CrudgenService extends AbstractServiceBean { + public static final String ENTITY = "entity"; + public static final String QUERY = "query"; + public static final String MAPPER = "mapper"; + public static final String MAPPER_XML = "mapperXml"; + public static final String BEAN = "bean"; + public static final String SERVICE = "serviceInterface"; + public static final String SERVICE_BEAN = "serviceBean"; + public static final String CONTROLLER = "controller"; + public static final String TEST = "test"; + + private DataSource dataSource; + + private SourceWriter + javaWriter = new SourceWriter(), + xmlWriter = new SourceWriter(), + testWriter = new SourceWriter(); + + private TableInfoFactory tableInfoFactory = new TableInfoFactory(); + private EntityFactory entityFactory = new EntityFactory(); + private QueryFactory queryFactory = new QueryFactory(); + private MapperFactory mapperFactory = new MapperFactory(); + private MapperXmlFactory mapperXmlFactory = new MapperXmlFactory(); + private BeanFactory beanFactory = new BeanFactory(); + private ServiceFactory serviceFactory = new ServiceFactory(); + private ServiceBeanFactory serviceBeanFactory = new ServiceBeanFactory(); + private ControllerFactory controllerFactory = new ControllerFactory(); + private TestFactory testFactory = new TestFactory(); + + private LinkedHashMap factories = new LinkedHashMap<>(); + + public CrudgenService() { + factories.put(ENTITY, entityFactory); + factories.put(QUERY, queryFactory); + factories.put(MAPPER, mapperFactory); + factories.put(MAPPER_XML, mapperXmlFactory); + factories.put(BEAN, beanFactory); + factories.put(SERVICE, serviceFactory); + factories.put(SERVICE_BEAN, serviceBeanFactory); + factories.put(CONTROLLER, controllerFactory); + factories.put(TEST, testFactory); + } + + @Resource(name = "dataSource") + public void setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + + String prj = property("project.target"); + javaWriter + .targetProject(prj) + .srcDir(property("dir.source")); + xmlWriter + .targetProject(prj) + .srcDir(property("dir.mapperXml")); + testWriter + .targetProject(prj) + .srcDir(property("dir.testSource")); + } + + String property(String key) { + return properties.getString("crudgen." + key); + } + + public EntityInfo getEntityInfo(String tableName) { + tableInfoFactory.setDatasource(dataSource); + TableInfo tableInfo = tableInfoFactory.create(tableName); + if (tableInfo != null) { + EntityInfo entityInfo = new EntityInfo(); + entityInfo.setTableInfo(tableInfo); + entityInfo.setAuthor(property("source.author")); + return entityInfo; + } else + return null; + } + + private EntityInfo setEntityInfo(EntityInfo entityInfo) { + factories.values().forEach(factory -> factory.setEntityInfo(entityInfo)); + return entityInfo; + } + + public Map generateCodes(EntityInfo entityInfo, String... keys) { + return createCodes(entityInfo, false, keys); + } + + private StringMap createCodes(EntityInfo entityInfo, boolean build, String... keys) { + StringMap result = new StringMap<>(); + try { + setEntityInfo(entityInfo); + if (entityFactory.getEntityInfo() == null) + throw new RuntimeException("No EntityInfo found to create codes"); + + entityFactory.getEntityInfo().setAuthor(property("source.author")); + Set targetKeys = isEmpty(keys) ? + factories.keySet() : + Stream.of(keys).collect(Collectors.toSet()); + + Map sourceCodes = factories.entrySet().stream() + .filter(entry -> targetKeys.contains(entry.getKey())) + .collect(Collectors.toMap( + entry -> entry.getKey(), + entry -> { + CodeFactory factory = entry.getValue(); + Object code = factory.create(); + if (build) { + if (factory == mapperXmlFactory) + xmlWriter.write(code); + else if (factory == testFactory) + testWriter.write(code); + else + javaWriter.write(code); + } + return factory.generate(); + }, + (o1, o2) -> o1, + LinkedHashMap::new + ) + ); + return result + .set("success", true) + .set("sourceCodes", sourceCodes); + } catch (Exception e) { + return result + .set("success", false) + .set("cause", rootCause(e).getMessage()); + } finally { + setEntityInfo(null); + } + } + + public Map createCodes(EntityInfo entityInfo, String... keys) { + return createCodes(entityInfo, true, keys); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/bean/BeanFactory.java b/src/main/java/cokr/xit/tool/crudgen/service/bean/BeanFactory.java new file mode 100644 index 0000000..59290a7 --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/bean/BeanFactory.java @@ -0,0 +1,69 @@ +package cokr.xit.tool.crudgen.service.bean; + +import java.util.List; +import java.util.Map; + +import cokr.xit.tool.codegen.NameSupport; +import cokr.xit.tool.codegen.SourceWriter; +import cokr.xit.tool.codegen.template.JavaTemplate; + +public class BeanFactory extends TemplateBasedCodeFactory { + public BeanFactory() { + javaTemplate = new JavaTemplate("classpath:template/bean.tmpl"); + } + + @Override + protected boolean targetExists() { + return targetExists(beanClassFullname(entityInfo)); + } + + @Override + public String generate() { + return javaTemplate + .configure(this::configure) + .generate(); + } + + private void configure(JavaTemplate.Config conf) { + javaTemplate + .setPackageName(beanPackage(entityInfo)) + .setClassName(beanClassName(entityInfo)); + + configure(conf, List.of( + getNames(entityInfo), + QueryFactory.getNames(entityInfo), + MapperFactory.getNames(entityInfo) + )); + } + + @Override + public SourceWriter.Info create() { + javaTemplate.configure(this::configure); + return javaTemplate.toSourceInfo(); + } + + public static Map getNames(EntityInfo entityInfo) { + return Map.of( + "beanPackage", beanPackage(entityInfo), + "beanClass", beanClassName(entityInfo), + "beanFullname", beanClassFullname(entityInfo), + "beanName", beanName(entityInfo) + ); + } + + private static String beanPackage(EntityInfo entityInfo) { + return entityInfo.getPackageName() + ".service.bean"; + } + + private static String beanClassName(EntityInfo entityInfo) { + return entityInfo.getEntityName() + "Bean"; + } + + private static String beanClassFullname(EntityInfo entityInfo) { + return String.join(".", beanPackage(entityInfo), beanClassName(entityInfo)); + } + + private static String beanName(EntityInfo entityInfo) { + return NameSupport.lowerCaseFirst(beanClassName(entityInfo)); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/bean/CodeFactory.java b/src/main/java/cokr/xit/tool/crudgen/service/bean/CodeFactory.java new file mode 100644 index 0000000..88d3534 --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/bean/CodeFactory.java @@ -0,0 +1,87 @@ +package cokr.xit.tool.crudgen.service.bean; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; + +import cokr.xit.foundation.Assert; +import cokr.xit.tool.codegen.Klass; +import cokr.xit.tool.codegen.NameSupport; +import cokr.xit.tool.codegen.poet.Parameter; +import cokr.xit.tool.codegen.template.FileTemplate; + +public abstract class CodeFactory { + protected EntityInfo entityInfo; + + @SuppressWarnings("unchecked") + public T setEntityInfo(EntityInfo entityInfo) { + this.entityInfo = entityInfo; + return (T)this; + } + + protected boolean targetExists(String classFullname) { + return Klass.exists(classFullname); + } + + protected boolean targetExists() { + return false; + } + + protected String entityClassName() { + return entityInfo.getEntityName(); + } + + protected String entityName() { + return NameSupport.lowerCaseFirst(entityClassName()); + } + + protected String entityClassFullname() { + return String.join(".", entityInfo.getPackageName(), entityInfo.getEntityName()); + } + + protected Map getNames() { + return Map.of( + "entityPackage", entityInfo.getPackageName(), + "entityClass", entityClassName(), + "entityName", entityName(), + "entityFullname", entityClassFullname(), + "entityComment", entityComment() + ); + } + + protected Parameter entityParameter() { + return new Parameter( + Klass.forName(entityClassFullname()), + entityName() + ); + } + + protected String entityComment() { + return entityInfo.getComment(); +// return entityInfo.getTableInfo().getComment(); + } + + protected String author() { + return entityInfo.getAuthor(); + } + + protected String today() { + return new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + } + + protected void configure(FileTemplate.Config conf, Iterable> maps) { + conf.set("author", author()) + .set("today", today()); + + getNames().forEach(conf::put); + + if (Assert.isEmpty(maps)) return; + + for (Map map: maps) + map.forEach(conf::put); + } + + public abstract String generate(); + + public abstract Object create(); +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/bean/ControllerFactory.java b/src/main/java/cokr/xit/tool/crudgen/service/bean/ControllerFactory.java new file mode 100644 index 0000000..4ab90f7 --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/bean/ControllerFactory.java @@ -0,0 +1,57 @@ +package cokr.xit.tool.crudgen.service.bean; + +import java.util.List; +import java.util.Map; + +import cokr.xit.tool.codegen.SourceWriter; +import cokr.xit.tool.codegen.template.JavaTemplate; + +public class ControllerFactory extends TemplateBasedCodeFactory { + public ControllerFactory() { + javaTemplate = new JavaTemplate("classpath:template/controller.tmpl"); + } + + @Override + protected boolean targetExists() { + return targetExists(String.join(".", controllerPackage(entityInfo), controllerClassName(entityInfo))); + } + + @Override + public String generate() { + return javaTemplate + .configure(this::configure) + .generate(); + } + + private void configure(JavaTemplate.Config conf) { + javaTemplate + .setPackageName(controllerPackage(entityInfo)) + .setClassName(controllerClassName(entityInfo)); + + configure(conf, List.of( + getNames(entityInfo), + ServiceFactory.getNames(entityInfo), + QueryFactory.getNames(entityInfo) + )); + } + + public SourceWriter.Info create() { + javaTemplate.configure(this::configure); + return javaTemplate.toSourceInfo(); + } + + public static Map getNames(EntityInfo entityInfo) { + return Map.of( + "controllerPackage", controllerPackage(entityInfo), + "controllerClass", controllerClassName(entityInfo) + ); + } + + private static String controllerPackage(EntityInfo entityInfo) { + return entityInfo.getPackageName() + ".web"; + } + + private static String controllerClassName(EntityInfo entityInfo) { + return entityInfo.getEntityName() + "Controller"; + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/bean/EntityFactory.java b/src/main/java/cokr/xit/tool/crudgen/service/bean/EntityFactory.java new file mode 100644 index 0000000..e45e335 --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/bean/EntityFactory.java @@ -0,0 +1,87 @@ +package cokr.xit.tool.crudgen.service.bean; + +import java.util.List; + +import cokr.xit.foundation.AbstractEntity; +import cokr.xit.tool.codegen.Klass; +import cokr.xit.tool.codegen.poet.Annotation; +import cokr.xit.tool.codegen.poet.Field; +import cokr.xit.tool.codegen.poet.JavaType; +import cokr.xit.tool.codegen.poet.Javadoc; +import cokr.xit.tool.codegen.poet.Property; +import lombok.Getter; +import lombok.Setter; + +public class EntityFactory extends CodeFactory { + @Override + public boolean targetExists() { + return targetExists(entityClassFullname()); + } + + public EntityInfo getEntityInfo() { + return entityInfo; + } + + public EntityFactory setEntityName(String name) { + entityInfo.setEntityName(name); + return this; + } + + public EntityFactory setPackageName(String packageName) { + entityInfo.setPackageName(packageName); + return this; + } + + public EntityFactory setAuthor(String author) { + entityInfo.setAuthor(author); + return this; + } + + public EntityFactory setAnnotateGetterSetter(boolean annotateGetterSetter) { + entityInfo.setAnnotateGetterSetter(annotateGetterSetter); + return this; + } + + public List getFields() { + return entityInfo.getFields(); + } + + @Override + public String generate() { + return create().spec().toString(); + } + + @Override + public JavaType create() { + JavaType entity = new JavaType("class", entityClassName()) + .packageName(entityInfo.getPackageName()) + .modifiers("public") + .superclass(AbstractEntity.class) + .javodoc(new Javadoc() + .add(entityComment()) + .add("@author $L", author()) + ); + + if (entityInfo.isAnnotateGetterSetter()) { + entity.annotations(new Annotation(Getter.class), new Annotation(Setter.class)); + List fields = getFields().stream() + .filter(field -> !field.isExclude()) + .map(field -> field.createField()) + .toList(); + entity.fields(fields.toArray(new Field[fields.size()])); + } else { + List properties = getFields().stream() + .filter(field -> !field.isExclude()) + .map(field -> field.createProperty()) + .toList(); + entity.properties(properties.toArray(new Property[properties.size()])); + } + + return entity; + } + + public static void main(String[] args) { + Class klass = Klass.forName("String"); + System.out.println(klass.getName()); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/bean/EntityInfo.java b/src/main/java/cokr/xit/tool/crudgen/service/bean/EntityInfo.java new file mode 100644 index 0000000..3253124 --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/bean/EntityInfo.java @@ -0,0 +1,108 @@ +package cokr.xit.tool.crudgen.service.bean; + +import java.util.List; + +import cokr.xit.tool.codegen.NameSupport; +import cokr.xit.tool.codegen.table.TableInfo; + +public class EntityInfo { + private String + entityName, + packageName, + tableName, + comment, + author; + private boolean annotateGetterSetter; + private List fields; + + public EntityInfo setTableInfo(TableInfo tableInfo) { + tableName = tableInfo.getName(); + comment = tableInfo.getComment(); + fields = tableInfo.getColumns().values().stream() + .map(column -> new FieldInfo().setColumn(column)) + .toList(); + fields.forEach(field -> field.setIndex(fields.indexOf(field))); + return this; + } + + public String getEntityName() { + if (entityName != null) + return entityName; + + String str = tableName + .replace("TB_", "") + .replace("tb_", ""); + str = NameSupport.camelCase(str); + + return entityName = NameSupport.upperCaseFirst(str); + } + + public EntityInfo setEntityName(String name) { + this.entityName = name; + return this; + } + + public String getPackageName() { + return packageName; + } + + public EntityInfo setPackageName(String packageName) { + this.packageName = packageName; + return this; + } + + public String getTableName() { + return tableName; + } + + public EntityInfo setTableName(String tableName) { + this.tableName = tableName; + return this; + } + + public String getComment() { + return comment; + } + + public EntityInfo setComment(String comment) { + this.comment = comment; + return this; + } + + public String getAuthor() { + return author; + } + + public EntityInfo setAuthor(String author) { + this.author = author; + return this; + } + + + public boolean isAnnotateGetterSetter() { + return annotateGetterSetter; + } + + public EntityInfo setAnnotateGetterSetter(boolean annotateGetterSetter) { + this.annotateGetterSetter = annotateGetterSetter; + return this; + } + + public List getFields() { + return fields; + } + + public EntityInfo setFields(List fields) { + this.fields = fields; + return this; + } + + public EntityInfo clear() { + entityName = packageName = author = null; + annotateGetterSetter = false; + if (fields != null) + fields.clear(); + fields = null; + return this; + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/bean/FieldInfo.java b/src/main/java/cokr/xit/tool/crudgen/service/bean/FieldInfo.java new file mode 100644 index 0000000..dfb6384 --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/bean/FieldInfo.java @@ -0,0 +1,106 @@ +package cokr.xit.tool.crudgen.service.bean; + +import java.util.Map; + +import cokr.xit.tool.codegen.Klass; +import cokr.xit.tool.codegen.NameSupport; +import cokr.xit.tool.codegen.poet.Field; +import cokr.xit.tool.codegen.poet.Method; +import cokr.xit.tool.codegen.poet.Property; +import cokr.xit.tool.codegen.table.ColumnInfo; + +public class FieldInfo { + private int index; + private String name; + private ColumnInfo columnInfo; + private boolean exclude; + + private static final Map inherited = Map.of( + "REG_DT", "createdAt", + "RGTR", "createdBy", + "MDFCN_DT", "lastModified", + "MDFR", "modifiedBy", + "USE_YN", "useYN" + ); + + public static boolean isColumnInherited(String name) { + return inherited.keySet().contains(name); + } + + public static boolean isFieldInherited(String name) { + return inherited.values().contains(name); + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public String getName() { + if (name != null) + return name; + + name = inherited.get(columnInfo.getName()); + if (name == null) + name = NameSupport.camelCase(columnInfo.getName()); + + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ColumnInfo getColumn() { + return columnInfo; + } + + public FieldInfo setColumn(ColumnInfo columnInfo) { + this.columnInfo = columnInfo; + return this; + } + + public boolean isExclude() { + return exclude || inherited.keySet().contains(columnInfo.getName()); + } + + public void setExclude(boolean exclude) { + this.exclude = exclude; + } + + private Class fieldClass() { + return Klass.forName(getColumn().getClassName()); + } + + public Field createField() { + Field field = new Field(fieldClass(), getName()) + .modifiers("private"); +/* + String defaultValue = getColumn().getDefaultValue(); + + if (!Assert.isEmpty(defaultValue) && !"null".equalsIgnoreCase(defaultValue)) { + if (defaultValue.startsWith("'") && defaultValue.endsWith("'")) + field.initialize("\"$L\"", defaultValue.replace("'", "")); + else + field.initialize(defaultValue); + } +*/ + return field.javadoc(getColumn().getComment()); + } + + public Method createGetter() { + return Method.getter(fieldClass(), getName(), getColumn().getComment()); + } + + public Method createSetter() { + return Method.setter(fieldClass(), getName(), getColumn().getComment()); + } + + public Property createProperty() { + return new Property(fieldClass(), getName()) + .description(getColumn().getComment()); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/bean/JavadocSupport.java b/src/main/java/cokr/xit/tool/crudgen/service/bean/JavadocSupport.java new file mode 100644 index 0000000..92d2f8b --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/bean/JavadocSupport.java @@ -0,0 +1,104 @@ +package cokr.xit.tool.crudgen.service.bean; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import cokr.xit.tool.codegen.poet.Javadoc; + +public class JavadocSupport { + public static Javadoc forClass(String classComment, String description, String author) { + boolean hasDescription = description != null && !description.isEmpty(); + return new Javadoc().add( + "$L\n" + + (hasDescription ? "$L\n" : "") + + "\n
\n" +
+			"============ 변경 이력 ============\n" +
+			"$L\t$L 최초 작성\n" +
+			"================================\n" +
+			"
", + hasDescription ? + new String[] {classComment, description, new SimpleDateFormat("yyyy-MM-dd").format(new Date()), author} : + new String[] {classComment, new SimpleDateFormat("yyyy-MM-dd").format(new Date()), author} + ); + } + + public static Javadoc forSelect(String entityComment) { + return new Javadoc().add( + "주어진 조건으로 $L 정보를 조회하여 목록으로 반환한다.\n" + + "@param req $L 조회 조건\n" + + "@return $L 목록", + entityComment, entityComment, entityComment + ); + } + + public static Javadoc forInsert(String entityComment, String paramName) { + return new Javadoc().add( + "$L 정보를 등록한다.
\n" + + "@param params 파라미터\n" + + "
  • \"$L\" - $L
  • \n" + + "
  • \"currentUser\" - 현재 접근한 사용자
  • \n" + + "
\n" + + "@return 저장된 정보수", + entityComment, paramName, entityComment + ); + } + + public static Javadoc forDefaultInsert(String entityComment, String paramName) { + return new Javadoc().add( + "$L 정보를 등록한다.\n" + + "@param $L $L\n" + + "@return 저장 여부\n" + + "
  • 저장됐으면 true
  • \n" + + "
  • 그렇지 않으면 false
  • \n" + + "
", + entityComment, paramName, entityComment + ); + } + + public static Javadoc forUpdate(String entityComment, String paramName) { + return new Javadoc().add( + "$L 정보를 수정한다.
\n" + + "@param params 파라미터\n" + + "
  • \"$L\" - $L
  • \n" + + "
  • \"currentUser\" - 현재 접근한 사용자
  • \n" + + "
\n" + + "@return 저장된 정보수", + entityComment, paramName, entityComment + ); + } + public static Javadoc forDefaultUpdate(String entityComment, String paramName) { + return new Javadoc().add( + "$L 정보를 수정한다.\n" + + "@param $L $L\n" + + "@return 저장 여부\n" + + "
  • 저장됐으면 true
  • \n" + + "
  • 그렇지 않으면 false
  • \n" + + "
", + entityComment, paramName, entityComment + ); + } + + public static Javadoc forDelete(String entityComment, String paramName) { + return new Javadoc().add( + "$L 정보를 삭제한다.
\n" + + "@param params 파라미터\n" + + "
  • \"$L\" - $L
  • \n" + + "
  • \"currentUser\" - 현재 접근한 사용자
  • \n" + + "
\n" + + "@return 저장된 정보수", + entityComment, paramName, entityComment + ); + } + + public static Javadoc forDefaultDelete(String entityComment, String paramName) { + return new Javadoc().add( + "$L 정보를 삭제한다.\n" + + "@param $L $L\n" + + "@return 저장 여부\n" + + "
  • 저장됐으면 true
  • \n" + + "
  • 그렇지 않으면 false
  • \n" + + "
", + entityComment, paramName, entityComment + ); + }; +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/bean/MapperFactory.java b/src/main/java/cokr/xit/tool/crudgen/service/bean/MapperFactory.java new file mode 100644 index 0000000..635f422 --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/bean/MapperFactory.java @@ -0,0 +1,69 @@ +package cokr.xit.tool.crudgen.service.bean; + +import java.util.List; +import java.util.Map; + +import cokr.xit.tool.codegen.NameSupport; +import cokr.xit.tool.codegen.SourceWriter; +import cokr.xit.tool.codegen.template.JavaTemplate; + +public class MapperFactory extends TemplateBasedCodeFactory { + public MapperFactory() { + javaTemplate = new JavaTemplate("classpath:template/mapper.tmpl"); + } + + @Override + public boolean targetExists() { + return targetExists(mapperClassFullname(entityInfo)); + } + + protected void configure(JavaTemplate.Config conf) { + javaTemplate + .setPackageName(mapperPackage(entityInfo)) + .setClassName(mapperClassName(entityInfo)); + + configure(conf, List.of( + getNames(entityInfo), + QueryFactory.getNames(entityInfo) + )); + + } + + @Override + public String generate() { + return javaTemplate + .configure(this::configure) + .generate(); + } + + @Override + public SourceWriter.Info create() { + javaTemplate.configure(this::configure); + return javaTemplate.toSourceInfo(); + } + + public static Map getNames(EntityInfo entityInfo) { + return Map.of( + "mapperPackage", mapperPackage(entityInfo), + "mapperClass", mapperClassName(entityInfo), + "mapperName", mapperName(entityInfo), + "mapperFullname", mapperClassFullname(entityInfo) + ); + } + + private static String mapperPackage(EntityInfo entityInfo) { + return entityInfo.getPackageName() + ".dao"; + } + + private static String mapperClassName(EntityInfo entityInfo) { + return entityInfo.getEntityName() + "Mapper"; + } + + private static String mapperName(EntityInfo entityInfo) { + return NameSupport.lowerCaseFirst(mapperClassName(entityInfo)); + } + + private static String mapperClassFullname(EntityInfo entityInfo) { + return String.join(".", mapperPackage(entityInfo), mapperClassName(entityInfo)); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/bean/MapperXmlFactory.java b/src/main/java/cokr/xit/tool/crudgen/service/bean/MapperXmlFactory.java new file mode 100644 index 0000000..3b67c94 --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/bean/MapperXmlFactory.java @@ -0,0 +1,154 @@ +package cokr.xit.tool.crudgen.service.bean; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.StringUtils; + +import cokr.xit.tool.codegen.SourceWriter; +import cokr.xit.tool.codegen.template.FileTemplate; + +public class MapperXmlFactory extends CodeFactory { + private FileTemplate template = new FileTemplate("classpath:template/mapper-xml.tmpl"); + + @Override + public String generate() { + return template + .configure(this::configure) + .generate(); + } + + @Override + public SourceWriter.Info create() { + String filename = entityName() + "-mapper.xml"; + String sourceCode = generate(); + return new SourceWriter.Info(filename, sourceCode); + } + + private void configure(FileTemplate.Config conf) { + configure(conf, List.of( + MapperFactory.getNames(entityInfo), + Map.of( + "tableName", entityInfo.getTableName(), + "property-column-mapping", propertyColumnMappings(), + "columns", allColumns(), + "insertParams", insertParams(), + "updateParams", updateParams(), + "keys", where() + ) + )); + } + + private String propertyColumnMappings() { + List fields = entityInfo.getFields(); + + return join( + "\n ", + format(fields, field -> String.format(" String.format("column=\"%s\" />", field.getColumn().getName())), + comments(fields) + ); + } + + private List comments(List fields) { + return fields.stream() + .map(field -> { + String comment = field.getColumn().getComment(); + return comment != null && !comment.isEmpty() ? String.format("", comment) : ""; + }) + .toList(); + } + + private List format(List fields, Function format) { + List formatted = fields.stream() + .map(format) + .toList(); + + int maxLength = formatted.stream().max(Comparator.comparingInt(String::length)).get().length(); + + return formatted.stream() + .map(str -> StringUtils.rightPad(str, maxLength + 1)) + .toList(); + } + + @SafeVarargs + private String join(String separator, List... stringLists) { + int rows = stringLists[0].size(); + ArrayList joined = new ArrayList<>(); + + for (int i = 0; i < rows; ++i) { + String row = ""; + for (List strs: stringLists) { + row += strs.get(i); + } + joined.add(row); + + } + + return String.join(separator, joined); + } + + private String allColumns() { + return join( + "\n , ", + format(entityInfo.getFields(), field -> field.getColumn().getName()), + comments(entityInfo.getFields()) + ); + } + + private String insertParams() { + String entityName = entityName(); + return join( + "\n , ", + format(entityInfo.getFields(), field -> { + String name = field.getName(); + switch (name) { + case "createdBy": + case "modifiedBy": return "#{currentUser.id}"; + case "createdAt": + case "lastModified": return ""; + default: return String.format("#{%s.%s}", entityName, name); + } + }), + comments(entityInfo.getFields()) + ); + } + + private String updateParams() { + String entityName = entityName(); + List exclude = List.of("createdAt", "createdBy"); + List fields = entityInfo.getFields().stream() + .filter(field -> !field.getColumn().isKey() && !exclude.contains(field.getName())) + .toList(); + + return join( + "\n , ", + format( + fields, + field -> { + String name = field.getName(); + String param = ""; + switch (name) { + case "modifiedBy": param = "#{currentUser.id}"; break; + case "lastModified": param = ""; break; + default: param = String.format("#{%s.%s}", entityName, name); break; + } + return String.format("%s = %s", field.getColumn().getName(), param); + } + ), + comments(fields) + ); + } + + private String where() { + String entityName = entityName(); + return entityInfo.getFields().stream() + .filter(field -> field.getColumn().isKey()) + .map(field -> String.format("%s = #{%s.%s}", field.getColumn().getName(), entityName, field.getName())) + .collect(Collectors.joining("\n AND ")); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/bean/QueryFactory.java b/src/main/java/cokr/xit/tool/crudgen/service/bean/QueryFactory.java new file mode 100644 index 0000000..d1803f8 --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/bean/QueryFactory.java @@ -0,0 +1,67 @@ +package cokr.xit.tool.crudgen.service.bean; + +import java.util.List; +import java.util.Map; + +import cokr.xit.tool.codegen.SourceWriter; +import cokr.xit.tool.codegen.template.JavaTemplate; + +public class QueryFactory extends TemplateBasedCodeFactory { + public QueryFactory() { + javaTemplate = new JavaTemplate("classpath:template/query-request.tmpl"); + } + + @Override + protected boolean targetExists() { + return targetExists(queryClassFullName(entityInfo)); + } + + @Override + public String generate() { + return javaTemplate + .configure(this::configure) + .generate(); + } + + private void configure(JavaTemplate.Config conf) { + String + packageName = queryPackage(entityInfo), + className = queryClassName(entityInfo); + javaTemplate + .setPackageName(packageName) + .setClassName(className); + + configure( + conf.set("queryPackage", packageName), + List.of( + getNames(entityInfo) + ) + ); + + } + + @Override + public SourceWriter.Info create() { + javaTemplate.configure(this::configure); + return javaTemplate.toSourceInfo(); + } + + public static Map getNames(EntityInfo entityInfo) { + return Map.of( + "queryFullname", queryClassFullName(entityInfo), + "queryClass", queryClassName(entityInfo) + ); + } + + private static String queryPackage(EntityInfo entityInfo) { + return entityInfo.getPackageName(); + } + + private static String queryClassName(EntityInfo entityInfo) { + return entityInfo.getEntityName() + "Query"; + } + + private static String queryClassFullName(EntityInfo entityInfo) { + return queryPackage(entityInfo) + "." + queryClassName(entityInfo); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/bean/ServiceBeanFactory.java b/src/main/java/cokr/xit/tool/crudgen/service/bean/ServiceBeanFactory.java new file mode 100644 index 0000000..064c5e0 --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/bean/ServiceBeanFactory.java @@ -0,0 +1,65 @@ +package cokr.xit.tool.crudgen.service.bean; + +import java.util.List; +import java.util.Map; + +import cokr.xit.tool.codegen.SourceWriter; +import cokr.xit.tool.codegen.template.JavaTemplate; + +public class ServiceBeanFactory extends TemplateBasedCodeFactory { + public ServiceBeanFactory() { + javaTemplate = new JavaTemplate("classpath:template/service-bean.tmpl"); + } + + @Override + protected boolean targetExists() { + return targetExists(String.join(".", serviceBeanPackage(entityInfo), serviceBeanClass(entityInfo))); + } + + @Override + public String generate() { + return javaTemplate + .configure(this::configure) + .generate(); + } + + private void configure(JavaTemplate.Config conf) { + String + packageName = serviceBeanPackage(entityInfo), + className = serviceBeanClass(entityInfo); + + javaTemplate + .setPackageName(packageName) + .setClassName(className); + + conf.set("serviceBeanPackage", packageName) + .set("serviceBeanClass", className); + + configure(conf, List.of( + getNames(entityInfo), + ServiceFactory.getNames(entityInfo), + QueryFactory.getNames(entityInfo), + BeanFactory.getNames(entityInfo) + )); + } + + public SourceWriter.Info create() { + javaTemplate.configure(this::configure); + return javaTemplate.toSourceInfo(); + } + + public static Map getNames(EntityInfo entityInfo) { + return Map.of( + "serviceBeanPackage", serviceBeanPackage(entityInfo), + "serviceBeanClass", serviceBeanClass(entityInfo) + ); + } + + private static String serviceBeanPackage(EntityInfo entityInfo) { + return ServiceFactory.servicePackage(entityInfo) + ".bean"; + } + + private static String serviceBeanClass(EntityInfo entityInfo) { + return ServiceFactory.serviceClassName(entityInfo) + "Bean"; + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/bean/ServiceFactory.java b/src/main/java/cokr/xit/tool/crudgen/service/bean/ServiceFactory.java new file mode 100644 index 0000000..a8dd963 --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/bean/ServiceFactory.java @@ -0,0 +1,67 @@ +package cokr.xit.tool.crudgen.service.bean; + +import java.util.List; +import java.util.Map; + +import cokr.xit.tool.codegen.NameSupport; +import cokr.xit.tool.codegen.SourceWriter; +import cokr.xit.tool.codegen.template.JavaTemplate; + +public class ServiceFactory extends TemplateBasedCodeFactory { + public ServiceFactory() { + javaTemplate = new JavaTemplate("classpath:template/service-interface.tmpl"); + } + + @Override + protected boolean targetExists() { + return targetExists(serviceClassFullname(entityInfo)); + } + + @Override + public String generate() { + return javaTemplate + .configure(this::configure) + .generate(); + } + + private void configure(JavaTemplate.Config conf) { + javaTemplate + .setPackageName(servicePackage(entityInfo)) + .setClassName(serviceClassName(entityInfo)); + + configure(conf, List.of( + QueryFactory.getNames(entityInfo), + getNames(entityInfo) + )); + } + + public SourceWriter.Info create() { + javaTemplate.configure(this::configure); + return javaTemplate.toSourceInfo(); + } + + public static Map getNames(EntityInfo entityInfo) { + return Map.of( + "servicePackage", servicePackage(entityInfo), + "serviceClass", serviceClassName(entityInfo), + "serviceName", serviceName(entityInfo), + "serviceFullname", serviceClassFullname(entityInfo) + ); + } + + public static String servicePackage(EntityInfo entityInfo) { + return entityInfo.getPackageName() + ".service"; + } + + public static String serviceClassName(EntityInfo entityInfo) { + return entityInfo.getEntityName() + "Service"; + } + + private static String serviceClassFullname(EntityInfo entityInfo) { + return String.join(".", servicePackage(entityInfo), serviceClassName(entityInfo)); + } + + private static String serviceName(EntityInfo entityInfo) { + return NameSupport.lowerCaseFirst(serviceClassName(entityInfo)); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/bean/TemplateBasedCodeFactory.java b/src/main/java/cokr/xit/tool/crudgen/service/bean/TemplateBasedCodeFactory.java new file mode 100644 index 0000000..ff65a9e --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/bean/TemplateBasedCodeFactory.java @@ -0,0 +1,7 @@ +package cokr.xit.tool.crudgen.service.bean; + +import cokr.xit.tool.codegen.template.JavaTemplate; + +public abstract class TemplateBasedCodeFactory extends CodeFactory { + protected JavaTemplate javaTemplate; +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/service/bean/TestFactory.java b/src/main/java/cokr/xit/tool/crudgen/service/bean/TestFactory.java new file mode 100644 index 0000000..e47b8a9 --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/service/bean/TestFactory.java @@ -0,0 +1,53 @@ +package cokr.xit.tool.crudgen.service.bean; + +import java.util.List; + +import cokr.xit.tool.codegen.SourceWriter; +import cokr.xit.tool.codegen.template.JavaTemplate; + +public class TestFactory extends TemplateBasedCodeFactory { + public static String testPackage(EntityInfo entityInfo) { + return ServiceFactory.servicePackage(entityInfo); + } + + public static String testClassName(EntityInfo entityInfo) { + return ServiceFactory.serviceClassName(entityInfo) + "Test"; + } + + public static String serviceClassFullname(EntityInfo entityInfo) { + return String.join(".", testPackage(entityInfo), testClassName(entityInfo)); + } + + public TestFactory() { + javaTemplate = new JavaTemplate("classpath:template/service-test.tmpl"); + } + + public String generate() { + return javaTemplate + .configure(this::configure) + .generate(); + } + + private void configure(JavaTemplate.Config conf) { + String + packageName = ServiceFactory.servicePackage(entityInfo), + className = testClassName(entityInfo); + + javaTemplate + .setPackageName(packageName) + .setClassName(className); + + conf.set("package", packageName) + .set("testClass", className); + + configure(conf, List.of( + ServiceFactory.getNames(entityInfo), + QueryFactory.getNames(entityInfo) + )); + } + + public SourceWriter.Info create() { + javaTemplate.configure(this::configure); + return javaTemplate.toSourceInfo(); + } +} \ No newline at end of file diff --git a/src/main/java/cokr/xit/tool/crudgen/web/CrudgenController.java b/src/main/java/cokr/xit/tool/crudgen/web/CrudgenController.java new file mode 100644 index 0000000..ce266cb --- /dev/null +++ b/src/main/java/cokr/xit/tool/crudgen/web/CrudgenController.java @@ -0,0 +1,47 @@ +package cokr.xit.tool.crudgen.web; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.servlet.ModelAndView; + +import cokr.xit.foundation.web.AbstractController; +import cokr.xit.tool.crudgen.service.CrudgenService; +import cokr.xit.tool.crudgen.service.bean.EntityInfo; + +@Controller +public class CrudgenController extends AbstractController { + @Resource(name = "crudgenService") + private CrudgenService service; + + @GetMapping({"/", "/index.do"}) + public ModelAndView mainPage() { + return new ModelAndView("index"); + } + + @GetMapping("/preview.do") + public ModelAndView preview() { + return new ModelAndView("preview"); + } + + @GetMapping("/entityInfo.do") + public ModelAndView entityInfo(String tableName) { + return new ModelAndView("jsonView") + .addObject("entityInfo", service.getEntityInfo(tableName)); + } + + @PostMapping("/generate.do") + public ModelAndView generate(@RequestBody EntityInfo entityInfo) { + return new ModelAndView("jsonView") + .addAllObjects(service.generateCodes(entityInfo)); + } + + @PostMapping("/create.do") + public ModelAndView create(@RequestBody EntityInfo entityInfo) { + return new ModelAndView("jsonView") + .addAllObjects(service.createCodes(entityInfo)); + } +} \ No newline at end of file diff --git a/src/main/resources/template/bean.tmpl b/src/main/resources/template/bean.tmpl new file mode 100644 index 0000000..3363481 --- /dev/null +++ b/src/main/resources/template/bean.tmpl @@ -0,0 +1,80 @@ +package {beanPackage}; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Component; + +import cokr.xit.foundation.AbstractComponent; +import cokr.xit.foundation.data.DataObject; + +import {entityFullname}; +import {queryFullname}; +import {mapperFullname}; + +/**{entityComment} 정보 관리 Bean + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * {today}	{author} 최초 작성
+ * ================================
+ * 
+ */ +@Component("{beanName}") +public class {beanClass} extends AbstractComponent { + /** {entityComment} 정보 DAO */ + @Resource(name = "{mapperName}") + private {mapperClass} {mapperName}; + + /**지정한 조건에 따라 {entityComment} 목록을 조회하여 반환한다. + * @param req {entityComment} 조회 조건 + * @return {entityComment} 목록 + */ + public List get{entityClass}List({queryClass} req) { + return {mapperName}.select{entityClass}List(req); + } + + /**지정한 조건에 따라 {entityComment} 객체들을 반환한다. + * @param req {entityComment} 조회 조건 + * @return {entityComment} 객체 목록 + */ + public List<{entityClass}> get{entityClass}s({queryClass} req) { + return {mapperName}.select{entityClass}s(req); + } + + /**{entityComment} 정보를 등록한다. + * @param {entityName} {entityComment} + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + public boolean create({entityClass} {entityName}) { + return {mapperName}.insert({entityName}); + } + + /**{entityComment} 정보를 수정한다. + * @param {entityName} {entityComment} + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + public boolean update({entityClass} {entityName}) { + return {mapperName}.update({entityName}); + } + + /**{entityComment} 정보를 삭제한다. + * @param {entityName} {entityComment} + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + public boolean remove({entityClass} {entityName}) { + return {mapperName}.delete({entityName}); + } +} \ No newline at end of file diff --git a/src/main/resources/template/controller.tmpl b/src/main/resources/template/controller.tmpl new file mode 100644 index 0000000..12c8a5e --- /dev/null +++ b/src/main/resources/template/controller.tmpl @@ -0,0 +1,103 @@ +package {controllerPackage}; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import cokr.xit.foundation.web.AbstractController; + +import {entityFullname}; +import {queryFullname}; +import {serviceFullname}; + +/**{entityComment} 서비스의 웹 컨트롤러 + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * {today}	{author} 최초 작성
+ * ================================
+ * 
+ */ +@RequestMapping(name = "{entityComment}", value = "/{entityName}") +public class {controllerClass} extends AbstractController { + /**{entityComment} 서비스*/ + @Resource(name = "{serviceName}") + private {serviceClass} {serviceName}; + + /**{entityComment} 관리 메인화면({entityName}/{entityName}-main)을 연다. + * 조건없는 {@link #get{entityClass}List({queryClass}) {entityComment} 조회 결과}를 포함시킨다. + * @return /{entityName}/{entityName}-main + */ + @RequestMapping(name = "{entityComment} 메인", value = "/main.do") + public ModelAndView main() { + ModelAndView mav = get{entityClass}List(new {queryClass}().setPageNum(1)); + mav.setViewName("/{entityName}/{entityName}-main"); + return mav.addObject("{entityName}List", toJson(mav.getModel().get("{entityName}List"))); + } + + /**{entityComment} 목록을 조회하여 반환한다.
+ * {@link {serviceClass}#get{entityClass}List({queryClass})} 참고 + * @param req {entityComment} 조회 조건 + * @return jsonView + *
 {
+	 *     "{entityName}List": [{entityComment} 목록]
+	 *     "{entityName}Start": {entityComment} 목록 시작 인덱스
+	 *     "{entityName}Fetch": 한 번에 가져오는 {entityComment} 목록 수
+	 *     "{entityName}Total": 조회 결과 찾은 전체 {entityComment} 수
+	 * }
+ */ + @RequestMapping(name = "{entityComment} 조회", value = "/list.do") + public ModelAndView get{entityClass}List({queryClass} req) { + List result = {serviceName}.get{entityClass}List(setFetchSize(req)); + return setCollectionInfo(new ModelAndView("jsonView"), result, "{entityName}"); + } + + /**{entityComment}를 등록한다. + * @param {entityName} {entityComment} 정보 + * @return jsonView + *
 {
+	 *     "saved": 등록되었으면 true, 그렇지 않으면 false
+	 * }
+ */ + @PostMapping(name = "{entityComment} 등록", value = "/create.do") + public ModelAndView create({entityClass} {entityName}) { + boolean saved = {serviceName}.create({entityName}); + return new ModelAndView("jsonView") + .addObject("saved", saved); + } + + /**{entityComment} 정보를 수정한다. + * @param {entityName} {entityComment} 정보 + * @return jsonView + *
 {
+	 *     "saved": 수정되었으면 true, 그렇지 않으면 false
+	 * }
+ */ + @PostMapping(name = "{entityComment} 수정", value = "/update.do") + public ModelAndView update({entityClass} {entityName}) { + boolean saved = {serviceName}.update({entityName}); + return new ModelAndView("jsonView") + .addObject("saved", saved); + } + + /**지정한 {entityComment}를 제거한다. + * @param {entityName}IDs {entityComment} 아이디 + * @return jsonView + *
 {
+	 *     "affected": 저장된 정보수
+	 *     "saved": 저장되었으면 true, 그렇지 않으면 false
+	 * }
+ */ + @PostMapping(name = "{entityComment} 제거", value = "/remove.do") + public ModelAndView remove({entityClass} {entityName}) { + boolean saved = {serviceName}.remove({entityName}); + return new ModelAndView("jsonView") + .addObject("saved", saved); + } +} \ No newline at end of file diff --git a/src/main/resources/template/mapper-xml.tmpl b/src/main/resources/template/mapper-xml.tmpl new file mode 100644 index 0000000..3ccdba7 --- /dev/null +++ b/src/main/resources/template/mapper-xml.tmpl @@ -0,0 +1,48 @@ + + + + + + + + {property-column-mapping} + + +SELECT {columns} + FROM {tableName} + + + + + +/* {entityComment} 등록({mapperName}.insert{entityClass}) */ +INSERT INTO {tableName} ( + {columns} +) VALUES ( + {insertParams} +) + +/* {entityComment} 수정({mapperName}.update{entityClass}) */ +UPDATE {tableName} SET + {updateParams} + WHERE {keys} + +/* {entityComment} 삭제({mapperName}.delete{entityClass}) */ +UPDATE {tableName} SET + USE_YN = 'N' + , MDFCN_DT = + , MDFR = #{currentUser.id} + WHERE {keys} + + \ No newline at end of file diff --git a/src/main/resources/template/mapper.tmpl b/src/main/resources/template/mapper.tmpl new file mode 100644 index 0000000..0e9adf1 --- /dev/null +++ b/src/main/resources/template/mapper.tmpl @@ -0,0 +1,97 @@ +package {mapperPackage}; + +import java.util.List; +import java.util.Map; + +import org.egovframe.rte.psl.dataaccess.mapper.Mapper; + +import cokr.xit.foundation.component.AbstractMapper; +import cokr.xit.foundation.data.DataObject; + +import {entityFullname}; +import {queryFullname}; + +/** {entityComment} 정보 DAO + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * {today}	{author} 최초 작성
+ * ================================
+ * 
+ */ +@Mapper("{mapperName}") +public interface {mapperClass} extends AbstractMapper { + /**지정한 조건에 따라 {entityComment} 목록을 조회하여 반환한다.
+ * @param req {entityComment} 조회 조건 + * @return {entityComment} 목록 + */ + List select{entityClass}List({queryClass} req); + + /**지정한 조건에 따라 {entityComment} 객체들을 반환한다. + * @param req {entityComment} 조회 조건 + * @return {entityComment} 객체 목록 + */ + List<{entityClass}> select{entityClass}s({queryClass} req); + + /**{entityComment} 정보를 등록한다. + * @param params 파라미터 + *
  • "{entityName}" - {entityComment}
  • + *
  • "currentUser" - 현재 접속한 사용자
  • + *
+ * @return 저장된 정보수 + */ + int insert{entityClass}(Map params); + + /**{entityComment} 정보를 등록한다. + * @param {entityName} {entityComment} + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + default boolean insert({entityClass} {entityName}) { + return {entityName} != null && insert{entityClass}(params().set("{entityName}", {entityName})) == 1; + } + + /**{entityComment} 정보를 수정한다. + * @param params 파라미터 + *
  • "{entityName}" - {entityComment}
  • + *
  • "currentUser" - 현재 접속한 사용자
  • + *
+ * @return 저장된 정보수 + */ + int update{entityClass}(Map params); + + /**{entityComment} 정보를 수정한다. + * @param {entityName} {entityComment} + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + default boolean update({entityClass} {entityName}) { + return {entityName} != null && update{entityClass}(params().set("{entityName}", {entityName})) == 1; + } + + /**지정한 {entityComment}을 삭제한다. + * @param params 파라미터 + *
  • "{entityName}" - {entityComment}
  • + *
  • "currentUser" - 현재 접속한 사용자
  • + *
+ * @return 저장된 정보수 + */ + int delete{entityClass}(Map params); + + /**{entityComment} 정보를 삭제한다. + * @param {entityName} {entityComment} + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + default boolean delete({entityClass} {entityName}) { + return {entityName} != null && delete{entityClass}(params().set("{entityName}", {entityName})) == 1; + } +} \ No newline at end of file diff --git a/src/main/resources/template/query-request.tmpl b/src/main/resources/template/query-request.tmpl new file mode 100644 index 0000000..808b5c4 --- /dev/null +++ b/src/main/resources/template/query-request.tmpl @@ -0,0 +1,17 @@ +package {queryPackage}; + +import cokr.xit.foundation.component.QueryRequest; + +/**{entityComment} 정보 조회 요청 + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * {today}	{author} 최초 작성
+ * ================================
+ * 
+ */ +public class {queryClass} extends QueryRequest { + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/src/main/resources/template/service-bean.tmpl b/src/main/resources/template/service-bean.tmpl new file mode 100644 index 0000000..a545032 --- /dev/null +++ b/src/main/resources/template/service-bean.tmpl @@ -0,0 +1,56 @@ +package {serviceBeanPackage}; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; + +import cokr.xit.foundation.component.AbstractServiceBean; +import cokr.xit.foundation.data.DataObject; + +import {entityFullname}; +import {queryFullname}; +import {serviceFullname}; + +/**{entityComment} 서비스 구현체. + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * {today}	{author} 최초 작성
+ * ================================
+ * 
+ */ +@Service("{serviceName}") +public class {serviceBeanClass} extends AbstractServiceBean implements {serviceClass} { + /** {entityComment} 정보 Bean */ + @Resource(name = "{beanName}") + private {beanClass} {beanName}; + + @Override + public List get{entityClass}List({queryClass} req) { + return {beanName}.get{entityClass}List(req); + } + + @Override + public List<{entityClass}> get{entityClass}s({queryClass} req) { + return {beanName}.get{entityClass}s(req); + } + + @Override + public boolean create({entityClass} {entityName}) { + return {beanName}.create({entityName}); + } + + @Override + public boolean update({entityClass} {entityName}) { + return {beanName}.update({entityName}); + } + + @Override + public boolean remove({entityClass} {entityName}) { + return {beanName}.remove({entityName}); + } +} \ No newline at end of file diff --git a/src/main/resources/template/service-interface.tmpl b/src/main/resources/template/service-interface.tmpl new file mode 100644 index 0000000..50a3c30 --- /dev/null +++ b/src/main/resources/template/service-interface.tmpl @@ -0,0 +1,59 @@ +package {servicePackage}; + +import java.util.List; + +import cokr.xit.foundation.data.DataObject; + +import {entityFullname}; +import {queryFullname}; + +/**{entityComment} 관리 서비스 인터페이스. + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * {today}	{author} 최초 작성
+ * ================================
+ * 
+ */ +public interface {serviceClass} { + /**지정한 조건에 따라 {entityComment} 목록을 조회하여 반환한다. + * @param req {entityComment} 조회 조건 + * @return {entityComment} 목록 + */ + List get{entityClass}List({queryClass} req); + + /**지정한 조건에 따라 {entityComment} 객체들을 반환한다. + * @param req {entityComment} 조회 조건 + * @return {entityComment} 객체 목록 + */ + List<{entityClass}> get{entityClass}s({queryClass} req); + + /**{entityComment} 정보를 등록한다. + * @param {entityName} {entityComment} + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + boolean create({entityClass} {entityName}); + + /**{entityComment} 정보를 수정한다. + * @param {entityName} {entityComment} + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + boolean update({entityClass} {entityName}); + + /**{entityComment} 정보를 삭제한다. + * @param {entityName} {entityComment} + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + boolean remove({entityClass} {entityName}); +} \ No newline at end of file diff --git a/src/main/resources/template/service-test.tmpl b/src/main/resources/template/service-test.tmpl new file mode 100644 index 0000000..5cbcd17 --- /dev/null +++ b/src/main/resources/template/service-test.tmpl @@ -0,0 +1,49 @@ +package {package}; + +import java.util.List; + +import javax.annotation.Resource; + +import org.junit.jupiter.api.Test; + +import cokr.xit.foundation.data.DataObject; +import cokr.xit.foundation.test.TestSupport; + +import {entityFullname}; +import {queryFullname}; + +/**{serviceClass} 테스트. + * + *

상세 설명: + * + *

+ * ============ 변경 이력 ============
+ * {today}	{author} 최초 작성
+ * ================================
+ * 
+ */ +public class {testClass} extends TestSupport { + @Resource(name = "{serviceName}") + private {serviceClass} {serviceName}; + + @Test + void get{entityClass}List() { + List {entityName}List = {serviceName}.get{entityClass}List(new {queryClass}()); + {entityName}List.forEach(System.out::println); + } + + @Test + void get{entityClass}s() { + List<{entityClass}> {entityName}s = {serviceName}.get{entityClass}s(new {queryClass}()); + {entityName}s.forEach(System.out::println); + } + + @Test + void create() {} + + @Test + void update() {} + + @Test + void remove() {} +} \ No newline at end of file diff --git a/src/test/java/cokr/xit/tool/crudgen/test/CRUDGenTest.java b/src/test/java/cokr/xit/tool/crudgen/test/CRUDGenTest.java new file mode 100644 index 0000000..4dbb1a5 --- /dev/null +++ b/src/test/java/cokr/xit/tool/crudgen/test/CRUDGenTest.java @@ -0,0 +1,121 @@ +package cokr.xit.tool.crudgen.test; + +import javax.annotation.Resource; +import javax.sql.DataSource; + +import org.junit.jupiter.api.Test; + +import cokr.xit.foundation.test.TestSupport; +import cokr.xit.tool.codegen.SourceWriter; +import cokr.xit.tool.codegen.poet.JavaType; +import cokr.xit.tool.codegen.table.TableInfo; +import cokr.xit.tool.codegen.table.TableInfoFactory; +import cokr.xit.tool.crudgen.service.bean.BeanFactory; +import cokr.xit.tool.crudgen.service.bean.ControllerFactory; +import cokr.xit.tool.crudgen.service.bean.EntityFactory; +import cokr.xit.tool.crudgen.service.bean.EntityInfo; +import cokr.xit.tool.crudgen.service.bean.MapperFactory; +import cokr.xit.tool.crudgen.service.bean.MapperXmlFactory; +import cokr.xit.tool.crudgen.service.bean.QueryFactory; +import cokr.xit.tool.crudgen.service.bean.ServiceBeanFactory; +import cokr.xit.tool.crudgen.service.bean.ServiceFactory; +import cokr.xit.tool.crudgen.service.bean.TestFactory; + +public class CRUDGenTest extends TestSupport { + String author = "mjkhan"; + + String project = "../xit-testbed"; + String srcMain = project + "/src/main/java"; + String outputMain = project + "/target/classes"; + + String srcTest = project + "/src/test/java"; + String outputTest = project + "/target/test-classes"; + + String tableName = "TB_USER"; + String entityPackage = "cokr.xit.tool.testbed.user"; + String entityName = "User"; + String mapperXmlOutput = project + "/src/main/resources/sql/mapper/test"; + + SourceWriter + javaWriter = new SourceWriter().srcDir(srcMain), + mapperWriter = new SourceWriter().srcDir(mapperXmlOutput); + + @Resource(name = "dataSource") + private DataSource datasource; + + @Test + void entities() { + TableInfo table = new TableInfoFactory() + .setDatasource(datasource) + .create(tableName); + + EntityInfo entityInfo = new EntityInfo(); + entityInfo.setTableInfo(table); + entityInfo.setEntityName(entityName); + + EntityFactory entityFactory = new EntityFactory() + .setAuthor(author) + .setPackageName(entityPackage) + .setAnnotateGetterSetter(false); + entityFactory.setEntityInfo(entityInfo); + + JavaType entity = entityFactory.create(); + System.out.println(entity.spec()); + javaWriter.write(entity); + + QueryFactory queryFactory = new QueryFactory().setEntityInfo(entityInfo); + System.out.println(queryFactory.generate()); + javaWriter.write(queryFactory.create()); + + MapperFactory mapperFactory = new MapperFactory().setEntityInfo(entityInfo); + System.out.println(mapperFactory.generate()); + javaWriter.write(mapperFactory.create()); + + MapperXmlFactory mapperXmlFactory = new MapperXmlFactory().setEntityInfo(entityInfo); + String mapperXml = mapperXmlFactory.generate(); + System.out.println(mapperXml); + mapperWriter.write(mapperXmlFactory.create()); + + BeanFactory beanFactory = new BeanFactory().setEntityInfo(entityInfo); + System.out.println(beanFactory.generate()); + javaWriter.write(beanFactory.create()); + + ServiceFactory serviceFactory = new ServiceFactory().setEntityInfo(entityInfo); + System.out.println(serviceFactory.generate()); + javaWriter.write(serviceFactory.create()); + + ServiceBeanFactory serviceBeanFactory = new ServiceBeanFactory().setEntityInfo(entityInfo); + System.out.println(serviceBeanFactory.generate()); + javaWriter.write(serviceBeanFactory.create()); + + ControllerFactory controllerFactory = new ControllerFactory().setEntityInfo(entityInfo); + System.out.println(controllerFactory.generate()); + javaWriter.write(controllerFactory.create()); + + javaWriter.srcDir(srcTest); + + TestFactory testFactory = new TestFactory().setEntityInfo(entityInfo); + System.out.println(testFactory.generate()); + javaWriter.write(testFactory.create()); + } + + @Test + void mapperXml() { + TableInfo table = new TableInfoFactory() + .setDatasource(datasource) + .create("TB_USER"); + EntityInfo entityInfo = new EntityInfo(); + entityInfo.setTableInfo(table); + + EntityFactory entityFactory = new EntityFactory() + .setPackageName("cokr.xit.tool.testbed.user") + .setAuthor("mjkhan"); + entityFactory.setEntityInfo(entityInfo); + + MapperXmlFactory mapperXmlFactory = new MapperXmlFactory().setEntityInfo(entityInfo); + String mapperXml = mapperXmlFactory.generate(); + System.out.println(mapperXml); + mapperWriter.write(mapperXmlFactory.create()); + + } +} \ No newline at end of file diff --git a/src/test/resources/log4jdbc.log4j2.properties b/src/test/resources/log4jdbc.log4j2.properties new file mode 100644 index 0000000..3b8ff2b --- /dev/null +++ b/src/test/resources/log4jdbc.log4j2.properties @@ -0,0 +1,4 @@ +log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator + +log4jdbc.dump.sql.maxlinelength=0 +log4jdbc.drivers=org.mariadb.jdbc.Driver diff --git a/src/test/resources/logback.xml b/src/test/resources/logback.xml new file mode 100644 index 0000000..9314571 --- /dev/null +++ b/src/test/resources/logback.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + ${LOG_PATTERN} + + + + + ${LOG_PATH}/${LOG_FILE_NAME}.log + + ${LOG_PATTERN} + + + + + ${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log + + 10MB + + + 30 + + + + + + + error + ACCEPT + DENY + + + ${LOG_PATH}/${ERR_LOG_FILE_NAME}.log + + ${LOG_PATTERN} + + + + + ${LOG_PATH}/${ERR_LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log + + + 10MB + + + 60 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/lombok.config b/src/test/resources/lombok.config new file mode 100644 index 0000000..0a8874c --- /dev/null +++ b/src/test/resources/lombok.config @@ -0,0 +1,2 @@ +# see https://projectlombok.org/features/constructor lombok.copyableAnnotations +lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier diff --git a/src/test/resources/message/message-common.properties b/src/test/resources/message/message-common.properties new file mode 100644 index 0000000..169eab4 --- /dev/null +++ b/src/test/resources/message/message-common.properties @@ -0,0 +1,385 @@ +valueRequired={0}\uac00 \uc124\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. + +pageNotFound=\uc694\uccad\ud558\uc2e0 \ud398\uc774\uc9c0\ub97c \ucc3e\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. +sessionExpired=\ub300\uae30 \uc2dc\uac04\uc774 \uc624\ub798\ub418\uc5b4 \uc138\uc158\uc774 \ub9cc\ub8cc\ub410\uc2b5\ub2c8\ub2e4. +invalidSession=\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc138\uc158\uc73c\ub85c \uc811\uadfc\ud588\uc2b5\ub2c8\ub2e4. +accessDenied=\uc694\uccad\ud558\uc2e0 \uc791\uc5c5\uc5d0 \ub300\ud55c \uad8c\ud55c\uc774 \uc5c6\uc5b4\uc11c \uc811\uadfc\uc774 \uac70\ubd80\ub410\uc2b5\ub2c8\ub2e4.
\uad00\ub9ac\uc790\uc5d0\uac8c \ubb38\uc758 \ubc14\ub78d\ub2c8\ub2e4. +serverError=\uc694\uccad\ud558\uc2e0 \uc791\uc5c5\uc744 \uc218\ud589 \uc911 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.
\uad00\ub9ac\uc790\uc5d0\uac8c \ubb38\uc758 \ubc14\ub78d\ub2c8\ub2e4. + +duplicate.object=\uc774\ubbf8 \ub4f1\ub85d\ub41c {0}\uc785\ub2c8\ub2e4. + +fail.common.msg=\uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4! +fail.common.sql=sql \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4! error code: {0}, error msg: {1} +info.nodata.msg=\ud574\ub2f9 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. + +#UI Common resource# +table.num=\ubc88\ud638 +table.regdate=\ub4f1\ub85d\uc77c +table.reger=\ub4f1\ub85d\uc790 +table.select=\uc120\ud0dd +title.html=egovframe common component +title.detail=\uc0c1\uc138\uc870\ud68c +title.inquire=\uc870\ud68c +title.update=\uc218\uc815 +title.create=\ub4f1\ub85d +title.delete=\uc0ad\uc81c +title.save=\uc800\uc7a5 +title.list=\ubaa9\ub85d +title.searchCondition=\uac80\uc0c9\uc870\uac74 +title.search=\uac80\uc0c9\uc5b4 +title.reply=\ub2f5\uae00 +title.scrap=\uc2a4\ud06c\ub7a9 +title.comment=\ub313\uae00 +title.attachedFileSelect=\ud30c\uc77c\uc120\ud0dd +title.attachedFileDelete=\ud30c\uc77c\uc0ad\uc81c +title.link=\ub9c1\ud06c +title.management=\uad00\ub9ac +title.all=\uc804\uccb4 + +input.select=\uc120\ud0dd\ud558\uc138\uc694 +input.cSelect=\uc120\ud0dd +input.input=\uc785\ub825 +input.button=\ubc84\ud2bc +input.selectAll.title=\uc804\uccb4\uc120\ud0dd\uccb4\ud06c\ubc15\uc2a4 +input.yes=\uc608 +input.no=\uc544\ub2c8\uc624 + +select.searchCondition=\uc870\ud68c\uc870\uac74 \uc120\ud0dd + +button.select=\uc120\ud0dd +button.search=\uac80\uc0c9 +button.use=\uc0ac\uc6a9 +button.notUsed=\uc0ac\uc6a9\uc911\uc9c0 +button.inquire=\uc870\ud68c +button.update=\uc218\uc815 +button.create=\ub4f1\ub85d +button.delete=\uc0ad\uc81c +button.deleteDatabase=\uc644\uc804\uc0ad\uc81c +button.close=\ub2eb\uae30 +button.save=\uc800\uc7a5 +button.list=\ubaa9\ub85d +button.reset=\ucde8\uc18c +button.passwordUpdate=\uc554\ud638\ubcc0\uacbd +button.subscribe=\uac00\uc785\uc2e0\uccad +button.realname=\uc2e4\uba85\ud655\uc778 +button.moveToGpin=GPIN\uc2e4\uba85\ud655\uc778\uc73c\ub85c \uc774\ub3d9 +button.moveToIhidnum=\uc8fc\ubbfc\ub4f1\ub85d\ubc88\ud638 \uc2e4\uba85\ud655\uc778\uc73c\ub85c \uc774\ub3d9 +button.agree=\ub3d9\uc758 +button.disagree=\ube44\ub3d9\uc758 +button.possible=\uac00\ub2a5 +button.impossible=\ubd88\uac00\ub2a5 +button.qnaregist=Q&A\ub4f1\ub85d +button.cnsltregist=\uc0c1\ub2f4\ub4f1\ub85d +button.preview=\ubbf8\ub9ac\ubcf4\uae30 +button.next=\ub2e4\uc74c +button.add=\ubc14\ub85c\ucd94\uac00 +button.confirm=\ud655\uc778 +button.back = \ub4a4\ub85c +button.yes = \uc608 +button.no = \uc544\ub2c8\uc624 +button.home = \ud648 +button.user = \uc0ac\uc6a9\uc790\uc9c0\uc6d0 +button.cop = \ud611\uc5c5 +button.wrkstart = \ucd9c\uadfc +button.wrkend = \ud1f4\uadfc +button.reply = \ub2f5\uae00 +button.scrap = \uc2a4\ud06c\ub7a9 +button.comment = \ub313\uae00 +button.excel = \uc5d1\uc140 +button.init=\ucd08\uae30\ud654 +button.acknowledgment=\uc2b9\uc778 +button.cancelAcknowledgment=\uc2b9\uc778\ucde8\uc18c +button.bulkUpload=\uc77c\uad04\ub4f1\ub85d +button.log = \ub85c\uadf8 +button.set = \uc124\uc815 +button.move = \uc774\ub3d9 + + +#UI Common Message# +common.noScriptTitle.msg=\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294 \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c\ub294 \uc77c\ubd80 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\uc2e4 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +common.searchCondition.msg=\uc774 \ub808\uc774\uc544\uc6c3\uc740 \ud558\ub2e8 \uc815\ubcf4\ub97c \ub300\ud55c \uac80\uc0c9 \uc815\ubcf4\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. + +common.summary.list={0}\uc758 \ub0b4\uc5ed\uc5d0 \ub300\ud55c \ubaa9\ub85d\uc744 \ucd9c\ub825\ud569\ub2c8\ub2e4. +common.summary.regist={0}\uc758 \ub4f1\ub85d \uac00\ub2a5\ud55c \ub0b4\uc6a9\uc744 \uc785\ub825\ud558\uc5ec \ub4f1\ub85d \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \ub4f1\ub85d\ud55c\ub2e4. +common.summary.update={0}\uc758 \ub4f1\ub85d \uac00\ub2a5\ud55c \ub0b4\uc6a9\uc744 \uc785\ub825\ud558\uc5ec \ub4f1\ub85d \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \uc218\uc815\ud55c\ub2e4. +common.summary.inqire={0}\uc758 \ub0b4\uc5ed\uc5d0 \ub300\ud55c \uc0c1\uc138\uc870\ud68c \ub0b4\uc5ed\uc744 \ucd9c\ub825\ud569\ub2c8\ub2e4. + +common.save.msg=\uc800\uc7a5\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +common.regist.msg=\ub4f1\ub85d\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +common.delete.msg=\uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +common.update.msg=\uc218\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +common.nodata.msg=\uc790\ub8cc\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2e4\ub978 \uac80\uc0c9\uc870\uac74\uc744 \uc120\ud0dd\ud574\uc8fc\uc138\uc694 +common.required.msg=(\uc740)\ub294 \ud544\uc218\uc785\ub825\ud56d\ubaa9\uc785\ub2c8\ub2e4. +common.acknowledgement.msg=\uc2b9\uc778\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +common.acknowledgementcancel.msg=\uc2b9\uc778\ucde8\uc18c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +common.nocomment.msg=\ub313\uae00\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. +common.noguest.msg=\uc791\uc131\ub41c \ubc29\uba85\ub85d\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. + +success.request.msg = \uc694\uccad\ucc98\ub9ac\uac00 \uc131\uacf5\uc801\uc73c\ub85c \uc218\ud589\ub418\uc5c8\uc2b5\ub2c8\ub2e4. +success.common.select=\uc815\uc0c1\uc801\uc73c\ub85c \uc870\ud68c\ub418\uc5c8\uc2b5\ub2c8\ub2e4. +success.common.insert=\uc815\uc0c1\uc801\uc73c\ub85c \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4. +success.common.update=\uc815\uc0c1\uc801\uc73c\ub85c \uc218\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4. +success.common.delete=\uc815\uc0c1\uc801\uc73c\ub85c \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4. + +common.imposbl.fileupload = \ub354 \uc774\uc0c1 \ud30c\uc77c\uc744 \ucca8\ubd80\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +common.isConfmDe.msg=\uc2b9\uc778\uc77c\uc790\ub97c \ud655\uc778 \ubc14\ub78d\ub2c8\ub2e4. +common.isExist.msg = \uc774\ubbf8 \uc874\uc7ac\ud558\uac70\ub098 \uacfc\uac70\uc5d0 \ub4f1\ub85d\uc774 \ub418\uc5c8\ub358 \uc0c1\ud0dc\uc785\ub2c8\ub2e4. + +fail.common.insert = \uc0dd\uc131\uc774 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. +fail.common.update = \uc218\uc815\uc774 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. +fail.common.delete = \uc0ad\uc81c\uac00 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. +fail.common.delete.upperMenuExist = \ucc38\uc870\ub418\ub294 \uba54\ub274\uac00 \uc788\uc5b4 \uc0ad\uc81c\uac00 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. +fail.common.select = \uc870\ud68c\uc5d0 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. +fail.common.login = \ub85c\uadf8\uc778 \uc815\ubcf4\uac00 \uc62c\ubc14\ub974\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. +fail.common.loginIncorrect = {0}\ud68c \uc774\uc0c1 \ub85c\uadf8\uc778 \uc811\uc18d\uc774 \uc2dc\ub3c4 \ub418\uc5b4 \uacc4\uc815\uc774 \uc7a0\uaca8\uc2b5\ub2c8\ub2e4! +fail.common.login.password = \ud328\uc2a4\uc6cc\ub4dc \uc790\ub9ac \uc218\uac00 \uc77c\uce58 \ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.(8\uc790\ub9ac \uc774\uc0c1 20\uc790\ub9ac \uc774\ud558) +fail.common.idsearch = \uc544\uc774\ub514\ub97c \ucc3e\uc744\uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +fail.common.pwsearch = \ube44\ubc00\ubc88\ud638\ub97c \ucc3e\uc744\uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +fail.request.msg = \uc694\uccad\ucc98\ub9ac\ub97c \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. +fail.common.login.ip = \ub4f1\ub85d\ub41c IP\uac00 \uc544\ub2c8\ubbc0\ub85c \ub85c\uadf8\uc778\uc774 \uac70\ubd80\ub418\uc5c8\uc2b5\ub2c8\ub2e4. + +#UI User Message# +fail.user.passwordUpdate1=\ud604\uc7ac \ube44\ubc00\ubc88\ud638\uac00 \ub9de\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. +fail.user.passwordUpdate2=\ube44\ubc00\ubc88\ud638\uc640 \ube44\ubc00\ubc88\ud638 \ud655\uc778\uc774 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. +info.user.rlnmCnfirm=\uc8fc\ubbfc\ub4f1\ub85d\ubc88\ud638\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc2e4\uba85\ud655\uc778\uc744 \ud558\uc2ed\uc2dc\uc624. +success.user.rlnmCnfirm=\ud589\uc815\uc548\uc804\ubd80\uc758 \uc8fc\ubbfc\ub4f1\ub85d\uc790\ub8cc\uc640 \uc77c\uce58\ud569\ub2c8\ub2e4. +fail.user.rlnmCnfirm=\ud589\uc815\uc548\uc804\ubd80\uc758 \uc8fc\ubbfc\ub4f1\ub85d\uc790\ub8cc\uc640 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. +fail.user.connectFail=\uc2dc\uc2a4\ud15c \uc7a5\uc560\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.(\uc778\uc99d\uc11c\ubc84 \uc5f0\uacb0 \uc2e4\ud328) +info.user.rlnmPinCnfirm=\uacf5\uacf5 \uc544\uc774\ud540 \uc544\uc774\ub514\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc2e4\uba85\ud655\uc778\uc744 \ud558\uc2ed\uc2dc\uc624. +success.user.rlnmPinCnfirm=\uacf5\uacf5\uc544\uc774\ud540\uc758 \ub4f1\ub85d\uc790\ub8cc\uc640 \uc77c\uce58\ud569\ub2c8\ub2e4. +fail.user.rlnmPinCnfirm=\uacf5\uacf5\uc544\uc774\ud540\uc758 \ub4f1\ub85d\uc790\ub8cc\uc640 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. + + +#UI Cop Message# +cop.extrlUser = \uc678\ubd80\uc0ac\uc6a9\uc790 +cop.intrlUser = \ub0b4\ubd80\uc0ac\uc6a9\uc790 +cop.private = \ube44\uacf5\uac1c +cop.public = \uacf5\uac1c + +cop.adbkNm = \uc8fc\uc18c\ub85d\uba85 +cop.othbcScope = \uacf5\uac1c\ubc94\uc704 +cop.company = \ud68c\uc0ac +cop.part = \ubd80\uc11c +cop.man = \uac1c\uc778 +cop.adbkUser = \uad6c\uc131\uc6d0 +cop.bbsNm = \uac8c\uc2dc\ud310\uba85 +cop.bbsIntrcn = \uac8c\uc2dc\ud310\uc18c\uac1c +cop.bbsTyCode = \uac8c\uc2dc\ud310 \uc720\ud615 +cop.bbsAttrbCode = \uac8c\uc2dc\ud310 \uc18d\uc131 +cop.replyPosblAt = \ub2f5\uc7a5\uac00\ub2a5\uc5ec\ubd80 +cop.fileAtchPosblAt = \ud30c\uc77c\ucca8\ubd80\uac00\ub2a5\uc5ec\ubd80 +cop.posblAtchFileNumber = \ucca8\ubd80\uac00\ub2a5\ud30c\uc77c \uc22b\uc790 +cop.tmplatId = \ud15c\ud50c\ub9bf \uc815\ubcf4 +cop.guestList.subject = \ubc29\uba85\ub85d \uac8c\uc2dc\uae00\uc785\ub2c8\ub2e4. +cop.nttSj = \uc81c\ubaa9 +cop.nttCn = \uae00\ub0b4\uc6a9 +cop.ntceBgnde = \uac8c\uc2dc\uc2dc\uc791\uc77c +cop.ntceEndde = \uac8c\uc2dc\uc885\ub8cc\uc77c +cop.ntcrNm = \uc791\uc131\uc790 +cop.password = \ud328\uc2a4\uc6cc\ub4dc +cop.atchFile = \ud30c\uc77c\ucca8\ubd80 +cop.guestList = \ubc29\uba85\ub85d +cop.guestListCn = \ubc29\uba85\ub85d \ub0b4\uc6a9 +cop.noticeTerm = \uac8c\uc2dc\uae30\uac04 +cop.atchFileList = \ucca8\ubd80\ud30c\uc77c\ubaa9\ub85d +cop.cmmntyNm = \ucee4\ubba4\ub2c8\ud2f0\uba85 +cop.cmmntyIntrcn = \ucee4\ubba4\ub2c8\ud2f0 \uc18c\uac1c +cop.cmmntyMngr = \ucee4\ubba4\ub2c8\ud2f0 \uad00\ub9ac\uc790 +cop.clbOprtr = \ub3d9\ud638\ud68c \uc6b4\uc601\uc790 +cop.clbIntrcn = \ub3d9\ud638\ud68c \uc18c\uac1c +cop.clbNm = \ub3d9\ud638\ud68c \uba85 +cop.tmplatNm = \ud15c\ud50c\ub9bf\uba85 +cop.tmplatSeCode = \ud15c\ud50c\ub9bf \uad6c\ubd84 +cop.tmplatCours = \ud15c\ud50c\ub9bf\uacbd\ub85c +cop.useAt = \uc0ac\uc6a9\uc5ec\ubd80 +cop.ncrdNm = \uc774\ub984 +cop.cmpnyNm = \ud68c\uc0ac\uba85 +cop.deptNm = \ubd80\uc11c\uba85 +cop.ofcpsNm = \uc9c1\uc704 +cop.clsfNm = \uc9c1\uae09 +cop.emailAdres = \uc774\uba54\uc77c\uc8fc\uc18c +cop.telNo = \uc804\ud654\ubc88\ud638 +cop.mbtlNum = \ud734\ub300\ud3f0\ubc88\ud638 +cop.adres = \uc8fc\uc18c +cop.extrlUserAt = \uc678\ubd80\uc0ac\uc6a9\uc790\uc5ec\ubd80 +cop.publicAt = \uacf5\uac1c\uc5ec\ubd80 +cop.remark = \ube44\uace0 +cop.trgetNm = \ucee4\ubba4\ub2c8\ud2f0/\ub3d9\ud638\ud68c \uc815\ubcf4 +cop.preview = \ubbf8\ub9ac\ubcf4\uae30 + +cop.withdraw.msg=\ud0c8\ud1f4\ucc98\ub9ac \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +cop.reregist.msg=\uc7ac\uac00\uc785 \ucc98\ub9ac\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +cop.registmanager.msg=\uc6b4\uc601\uc9c4\uc73c\ub85c \ub4f1\ub85d\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +cop.use.msg=\uc0ac\uc6a9 \ucc98\ub9ac\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +cop.unuse.msg=\uc0ac\uc6a9\uc911\uc9c0 \ucc98\ub9ac\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +cop.delete.confirm.msg=\uc0ac\uc6a9\uc911\uc9c0\ub97c \uc120\ud0dd\ud558\uc2e4 \uacbd\uc6b0 \ub2e4\uc2dc \uc0ac\uc6a9\uc73c\ub85c \ubcc0\uacbd\uc774 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4. +cop.ing.msg=\uc2b9\uc778\uc694\uccad \uc911\uc785\ub2c8\ub2e4. +cop.request.msg=\uac00\uc785\uc2e0\uccad\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc694\uccad\ub418\uc5c8\uc2b5\ub2c8\ub2e4 +cop.password.msg=\ud328\uc2a4\uc6cc\ub4dc\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. +cop.password.not.same.msg=\ud328\uc2a4\uc6cc\ub4dc\uac00 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. + +cop.comment.wrterNm = \uc791\uc131\uc790 +cop.comment.commentCn = \ub0b4\uc6a9 +cop.comment.commentPassword = \ud328\uc2a4\uc6cc\ub4dc + +cop.satisfaction.wrterNm = \uc791\uc131\uc790 +cop.satisfaction.stsfdgCn = \ub0b4\uc6a9 +cop.satisfaction.stsfdg = \ub9cc\uc871\ub3c4 +cop.satisfaction.stsfdgPassword = \ud328\uc2a4\uc6cc\ub4dc + +cop.scrap.scrapNm = \uc2a4\ud06c\ub7a9\uba85 + +#UI USS Message# +uss.ion.noi.ntfcSj=\uc81c\ubaa9 +uss.ion.noi.ntfcCn=\ub0b4\uc6a9 +uss.ion.noi.ntfcDate=\uc54c\ub9bc\uc77c\uc790 +uss.ion.noi.ntfcTime=\uc54c\ub9bc\uc2dc\uac04 +uss.ion.noi.ntfcHH=\uc54c\ub9bc\uc2dc\uac04 +uss.ion.noi.ntfcMM=\uc54c\ub9bc\ubd84 +uss.ion.noi.bhNtfcIntrvl=\uc0ac\uc804\uc54c\ub9bc\uac04\uaca9 +uss.ion.noi.bhNtfcIntrvl.msg=\uc0ac\uc804\uc54c\ub9bc\uac04\uaca9 \uc9c0\uc815\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. +uss.ion.noi.alertNtfcTime=\uc54c\ub9bc\uc77c\uc790 \ubc0f \uc2dc\uac04\uc774 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. + +#UI COP Message# +cop.sms.trnsmitTelno=\ubc1c\uc2e0\uc804\ud654\ubc88\ud638 +cop.sms.trnsmitCn=\uc804\uc1a1\ub0b4\uc6a9 +cop.sms.recptnTelno=\uc218\uc2e0\uc804\ud654\ubc88\ud638 +cop.sms.send=\uc804\uc1a1 +cop.sms.addRecptn=\ucd94\uac00 +cop.sms.recptnTelno.msg=\uc218\uc2e0\uc804\ud654\ubc88\ud638 \uc9c0\uc815\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. + +#UI sym.log Message# +sym.log.histSeCode = \uc774\ub825\uad6c\ubd84 +sym.log.sysNm = \uc2dc\uc2a4\ud15c\uba85 +sym.log.histCn = \uc774\ub825\ub0b4\uc6a9 +sym.log.atchFile = \ucca8\ubd80\ud30c\uc77c +sym.log.atchFileList = \ucca8\ubd80\ud30c\uc77c\ubaa9\ub85d +sym.ems.receiver = \ubc1b\ub294\uc0ac\ub78c +sym.ems.title = \uc81c\ubaa9 +sym.ems.content = \ubc1c\uc2e0\ub0b4\uc6a9 + +#Vlidator Errors# +errors.prefix=
+errors.suffix=

+ +errors.required={0}\uc740(\ub294) \ud544\uc218 \uc785\ub825\uac12\uc785\ub2c8\ub2e4. +errors.minlength={0}\uc740(\ub294) {1}\uc790 \uc774\uc0c1 \uc785\ub825\ud574\uc57c \ud569\ub2c8\ub2e4. +errors.maxlength={0}\uc740(\ub294) {1}\uc790 \uc774\uc0c1 \uc785\ub825\ud560\uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +errors.invalid={0}\uc740(\ub294) \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uac12\uc785\ub2c8\ub2e4. +errors.minInteger={0}\uc740(\ub294) \uc720\ud6a8\ud55c \uac12\uc774 \uc544\ub2d9\ub2c8\ub2e4. 1 \uc774\uc0c1\uc758 \uac12\uc744 \uc785\ub825\ud574\uc57c \ud569\ub2c8\ub2e4. +errors.byte={0}\uc740(\ub294) byte\ud0c0\uc785\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. +errors.short={0}\uc740(\ub294) short\ud0c0\uc785\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. +errors.integer={0}\uc740(\ub294) \uc815\uc218 \ud0c0\uc785\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. +errors.long={0}\uc740(\ub294) long \ud0c0\uc785\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. +errors.float={0}\uc740(\ub294) \uc2e4\uc218 \ud0c0\uc785\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. +errors.double={0}\uc740(\ub294) double \ud0c0\uc785\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. + +errors.date={0}\uc740(\ub294) \ub0a0\uc9dc \uc720\ud615\uc774 \uc544\ub2d9\ub2c8\ub2e4. +errors.range={0}\uc740(\ub294) {1}\uacfc {2} \uc0ac\uc774\uc758 \uac12\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. +errors.creditcard={0}\uc740(\ub294) \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc2e0\uc6a9\uce74\ub4dc \ubc88\ud638\uc785\ub2c8\ub2e4. +errors.email={0}\uc740(\ub294) \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc774\uba54\uc77c \uc8fc\uc18c\uc785\ub2c8\ub2e4. + +errors.ihidnum=\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc8fc\ubbfc\ub4f1\ub85d\ubc88\ud638\uc785\ub2c8\ub2e4. +errors.korean={0}\uc740(\ub294) \ud55c\uae00\uc744 \uc785\ub825\ud558\uc154\uc57c \ud569\ub2c8\ub2e4. +errors.ip=\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 IP\uc8fc\uc18c\uc785\ub2c8\ub2e4. + +errors.password1={0}\uc740(\ub294) 8~20\uc790 \ub0b4\uc5d0\uc11c \uc785\ub825\ud574\uc57c \ud569\ub2c8\ub2e4. +errors.password2={0}\uc740(\ub294) \ud55c\uae00,\ud2b9\uc218\ubb38\uc790,\ub744\uc5b4\uc4f0\uae30\ub294 \ud5c8\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. +errors.password3={0}\uc740(\ub294) \uc21c\ucc28\uc801\uc778 \uc22b\uc790\ub97c 4\uac1c\uc774\uc0c1 \uc5f0\uc18d\ud574\uc11c \uc0ac\uc6a9\ud560\uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +errors.password4={0}\uc740(\ub294) \ubc18\ubcf5\ub418\ub294 \ubb38\uc790\ub098 \uc22b\uc790\ub97c 4\uac1c\uc774\uc0c1 \uc5f0\uc18d\ud574\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. + +errors.notKorean={0}\uc740(\ub294) \ud55c\uae00\uc744 \uc0ac\uc6a9\ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +error.security.runtime.error = error + +#Xss Errors# +errors.xss.checkerUser=\ud574\ub2f9 \uae30\ub2a5\uc5d0 \ub300\ud55c \uc0ac\uc6a9 \ubc0f \ucc98\ub9ac \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. + +#File Upload / Download +errors.file.extension=\uc9c0\uc6d0\ub418\ub294 \ud30c\uc77c\uc720\ud615\uc774 \uc544\ub2d9\ub2c8\ub2e4. +errors.file.transfer=\ud30c\uc77c\uc804\uc1a1\uc911 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. +success.file.transfer=\ud30c\uc77c\uc804\uc1a1\uc774 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. + +#Vlidator Errors- wordDicaryVO# +wordDicaryVO.wordNm=\uc6a9\uc5b4\uba85 +wordDicaryVO.engNm=\uc601\ubb38\uba85 +wordDicaryVO.wordDc=\uc6a9\uc5b4\uc124\uba85 +wordDicaryVO.synonm=\ub3d9\uc758\uc5b4 + +#Vlidator Errors- cnsltManageVO# +cnsltManageVO.cnsltSj=\uc0c1\ub2f4\uc81c\ubaa9 +cnsltManageVO.cnsltCn=\uc0c1\ub2f4\ub0b4\uc6a9 +cnsltManageVO.writngPassword=\uc791\uc131\ube44\ubc00\ubc88\ud638 +cnsltManageVO.areaNo=\uc9c0\uc5ed\ubc88\ud638 +cnsltManageVO.middleTelno=\uc911\uac04\uc804\ud654\ubc88\ud638 +cnsltManageVO.endTelno=\ub05d\uc804\ud654\ubc88\ud638 +cnsltManageVO.wrterNm=\uc791\uc131\uc790\uba85 +cnsltManageVO.managtCn=\ub2f5\ubcc0\ub0b4\uc6a9 + +#Vlidator Errors- siteManageVO# +siteManageVO.siteNm=\uc0ac\uc774\ud2b8\uba85 +siteManageVO.siteUrl=\uc0ac\uc774\ud2b8 URL +siteManageVO.siteDc=\uc0ac\uc774\ud2b8\uc124\uba85 +siteManageVO.siteThemaClCode=\uc0ac\uc774\ud2b8\uc8fc\uc81c\ubd84\ub958 +siteManageVO.actvtyAt=\ud65c\uc131\uc5ec\ubd80 +siteManageVO.useAt=\uc0ac\uc6a9\uc5ec\ubd80 + +#Vlidator Errors- recomendSiteManageVO# +recomendSiteManageVO.recomendSiteNm=\ucd94\ucc9c\uc0ac\uc774\ud2b8\uba85 +recomendSiteManageVO.recomendSiteUrl=\ucd94\ucc9c\uc0ac\uc774\ud2b8 URL +recomendSiteManageVO.recomendSiteDc=\ucd94\ucc9c\uc0ac\uc774\ud2b8\uc124\uba85 +recomendSiteManageVO.recomendResnCn=\ucd94\ucc9c\uc0ac\uc774\ud2b8\uc2b9\uc778\uc0ac\uc720 +recomendSiteManageVO.confmDe=\uc2b9\uc778\uc77c\uc790 + +#Vlidator Errors- hpcmManageVO# +hpcmManageVO.hpcmSeCode=\ub3c4\uc6c0\ub9d0\uad6c\ubd84 +hpcmManageVO.hpcmDf=\ub3c4\uc6c0\ub9d0\uc815\uc758 +hpcmManageVO.hpcmDc=\ub3c4\uc6c0\ub9d0\uc124\uba85 + +#Vlidator Errors- newsManageVO# +newsManageVO.newsSj=\ub274\uc2a4\uc81c\ubaa9 +newsManageVO.newsCn=\ub274\uc2a4\ub0b4\uc6a9 +newsManageVO.ntceDe=\uac8c\uc2dc\uc77c\uc790 + +#Vlidator Errors- faqManageVO# +faqManageVO.qestnSj=\uc9c8\ubb38\uc81c\ubaa9 +faqManageVO.qestnCn=\uc9c8\ubb38\ub0b4\uc6a9 +faqManageVO.answerCn=\ub2f5\ubcc0\ub0b4\uc6a9 + +#Vlidator Errors- stplatManageVO# +stplatManageVO.useStplatNm=\uc774\uc6a9\uc57d\uad00\uba85 +stplatManageVO.useStplatCn=\uc774\uc6a9\uc57d\uad00\ub0b4\uc6a9 +stplatManageVO.infoProvdAgreCn=\uc815\ubcf4\uc81c\uacf5\ub3d9\uc758\ub0b4\uc6a9 + +#Vlidator Errors- cpyrhtPrtcPolicyVO# +cpyrhtPrtcPolicyVO.cpyrhtPrtcPolicyCn=\uc800\uc791\uad8c\ubcf4\ud638\uc815\ucc45\ub0b4\uc6a9 + +#Vlidator Errors- qnaManageVO# +qnaManageVO.qestnSj=\uc9c8\ubb38\uc81c\ubaa9 +qnaManageVO.qestnCn=\uc9c8\ubb38\ub0b4\uc6a9 +qnaManageVO.writngPassword=\uc791\uc131\ube44\ubc00\ubc88\ud638 +qnaManageVO.areaNo=\uc9c0\uc5ed\ubc88\ud638 +qnaManageVO.middleTelno=\uc911\uac04\uc804\ud654\ubc88\ud638 +qnaManageVO.endTelno=\ub05d\uc804\ud654\ubc88\ud638 +qnaManageVO.wrterNm=\uc791\uc131\uc790\uba85 +qnaManageVO.answerCn=\ub2f5\ubcc0\ub0b4\uc6a9 + +#Vlidator Errors- ReprtStatsVO# +sts.reprtId = \ubcf4\uace0\uc11cID +sts.title = \ubcf4\uace0\uc11c\uba85 +sts.category = \ubcf4\uace0\uc11c\uc720\ud615 +sts.status = \uc9c4\ud589\uc0c1\ud0dc +sts.regDate = \ub4f1\ub85d\uc77c\uc2dc + +#Rest day messages# +sym.cal.restDay = \ud734\uc77c\uc77c\uc790 +sym.cal.restName = \ud734\uc77c\uba85 +sym.cal.restDetail = \ud734\uc77c\uc124\uba85 +sym.cal.restCategory = \ud734\uc77c\uad6c\ubd84 + +image.errorBg = \uc624\ub958\uc774\ubbf8\uc9c0 + + +#Custom message# +custom.fail.access=\uc815\uc0c1\uc801\uc778 \uc811\uadfc\uc774 \uc544\ub2d9\ub2c8\ub2e4. \ub85c\uadf8\uc778 \ud6c4 \uc774\uc6a9\ud558\uc138\uc694. +custom.fail.accessDenied=\uc694\uccad\uc5d0 \ub300\ud55c \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. +custom.isNotExist.msg=\ucc98\ub9ac\uc5d0 \ud544\uc694\ud55c \uc790\ub8cc\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. diff --git a/src/test/resources/message/message-common_en.properties b/src/test/resources/message/message-common_en.properties new file mode 100644 index 0000000..9f23ef1 --- /dev/null +++ b/src/test/resources/message/message-common_en.properties @@ -0,0 +1,287 @@ +valueRequired={0} is required. + +pageNotFound=The requested page is not found. +sessionExpired=The session is expired due to excessive idle time. +invalidSession=You attempted to access the system via an invalid session. +accessDenied=You do not have the permission for the operation.
Please contact the administrator. +serverError=An error has occurred while performing the requested operation.
Please contact the administrator. + +duplicate.object=\uc774\ubbf8 \ub4f1\ub85d\ub41c {0}\uc785\ub2c8\ub2e4. + +fail.common.msg=error ocurred! +fail.common.sql=sql error ocurred! error code: {0}, error msg: {1} +info.nodata.msg=no data found. + +#UI Common resource# +table.num=num. +table.regdate=reg.date +table.reger=registrant +table.select=select +title.html=egovframe common component +title.detail=Detail Inquiry +title.inquire=Inquire +title.update=Modify +title.create=Create +title.delete=Delete +title.save=Save +title.list=List +title.searchCondition=search condition +title.search=keyword +title.reply=reply +title.scrap=scrap +title.comment=comment +title.attachedFileSelect=attached file +title.attachedFileDelete=attached file delete +title.link=link +title.management=Management +title.all=All + +input.select=Select +input.cSelect=Select +input.input=input +input.button=button +input.selectAll.title=Checkbox select all +input.yes=Yes +input.no=No + +select.searchCondition=select condition select + +button.select=select +button.search=Search +button.use=use +button.notUsed=Not used +button.inquire=inquire +button.update=update +button.create=create +button.delete=delete +button.deleteDatabase=Wiping +button.close=close +button.save=save +button.list=list +button.reset=reset +button.passwordUpdate=password update +button.subscribe=subscribe +button.realname=realname confirm +button.moveToGpin=move to gpin confirm +button.moveToIhidnum=move to ihidnum confirm +button.agree=agree +button.disagree=disagree +button.possible=possible +button.impossible=impossible +button.qnaregist=Q&A create +button.cnsltregist=Counsel create +button.preview=preview +button.next=nexut +button.add=add it now +button.confirm=confirm +button.back =back +button.yes =yes +button.no =no +button.home =home +button.user =user support +button.cop =cooperation +button.wrkstart = work start +button.wrkend = work end +button.reply = reply +button.scrap = scrap +button.comment = comment +button.excel = excel +button.init=init +button.acknowledgment=acknowledgment +button.cancelAcknowledgment=cancel acknowledgment +button.bulkUpload=bulk upload +button.log = log +button.set = set +button.move = move + + +#UI Common Message# +common.noScriptTitle.msg=I can't use all functions in browser JavaScript is not supported. +common.searchCondition.msg=This layout is a lower information searches made up of information. + +common.summary.list={0} A list of the details of the output. +common.summary.regist={0} Registered by typing the possible contents of registers by clicking the button. +common.summary.update={0} Registered by typing the possible content of modification by clicking the button. +common.summary.inqire={0} Full inquiry details about the details of the output. + +common.save.msg=confirm save? +common.regist.msg=confirm regist? +common.delete.msg=confirm delete? +common.update.msg=confirm update? +common.nodata.msg=There is no data. please choose another seach keyword +common.required.msg=is required field +common.acknowledgement.msg=confirm acknowledgement? +common.acknowledgementcancel.msg=confirm acknowledgement cancel? +common.nocomment.msg=There is no comment. +common.noguest.msg=There is no guest notice. + +success.request.msg=you're request successfully done +success.common.select=successfully selected +success.common.insert=successfully inserted +success.common.update=successfully updated +success.common.delete=successfully deleted + +common.imposbl.fileupload = cannot upload files +common.isConfmDe.msg=Please check the approval date box +common.isExist.msg = already exist + +fail.common.insert = fail to insert. +fail.common.update = fail to update +fail.common.delete = fail to delete +fail.common.delete.upperMenuExist = fail to delete[upperMenuId foreign key error] +fail.common.select = fail to select +fail.common.login = login information is not correct +fail.common.loginIncorrect = login in more than {0} account will be locked! +fail.common.login.password = password information is not correct(password digit should be 8 to 20) +fail.common.idsearch = can not find id +fail.common.pwsearch = can not find password +fail.request.msg = Failed to handle the request +fail.common.login.ip = Login is refused because it is not a registered IP. + + +#UI User Message# +fail.user.passwordUpdate1=current password is not correct +fail.user.passwordUpdate2=password confirm is not correct +info.user.rlnmCnfirm=realname confirm ready +success.user.rlnmCnfirm=it is realname +fail.user.rlnmCnfirm=it is not realname +fail.user.connectFail=connection fail + +#UI Cop Message# +cop.extrlUser = External User +cop.intrlUser = Internal User +cop.private = private +cop.public = public + +cop.bbsNm = BBS Name +cop.bbsIntrcn = BBS Introduction +cop.bbsTyCode = BBS Type +cop.bbsAttrbCode = BBS Attribute +cop.replyPosblAt = Reply Possible Alternative +cop.fileAtchPosblAt = File Attach Possible Alternative +cop.posblAtchFileNumber = Possible Attach File Number +cop.tmplatId = Template Information +cop.guestList.subject = This article registered by Guest List +cop.nttSj = Notice Subject +cop.nttCn = Notice Contents +cop.ntceBgnde = Notice Start Date +cop.ntceEndde = Notice End Date +cop.ntcrNm = Noticer Name +cop.password = PassWord +cop.atchFile = Attach Files +cop.guestList = Guest List +cop.guestListCn = Guest List Contents +cop.noticeTerm = Notice term +cop.atchFileList = Attached File List +cop.cmmntyNm = Community Name +cop.cmmntyIntrcn = Community Introduction +cop.cmmntyMngr = Community Manager +cop.clbOprtr = Club Operator +cop.clbIntrcn = Club Introduction +cop.clbNm = Club Name +cop.tmplatNm = Template Name +cop.tmplatSeCode = Template Se Code +cop.tmplatCours = Template Cours +cop.useAt = Use Alternative +cop.ncrdNm = NameCard user name +cop.cmpnyNm = Company name +cop.deptNm = Department name +cop.ofcpsNm = OFCPS name +cop.clsfNm = Class Name +cop.emailAdres = E-mail +cop.telNo = Tel No. +cop.mbtlNum = Mobile +cop.adres = Address +cop.extrlUserAt = External User alternative +cop.publicAt = Public open alternative +cop.remark = Remark +cop.trgetNm = Company/Club Information +cop.preview = preview + +cop.withdraw.msg=confirm withdrawal memebership? +cop.reregist.msg=confirm re-registration? +cop.registmanager.msg=confirm registration of manager? +cop.use.msg=confirm use? +cop.unuse.msg=confirm stop using? +cop.delete.confirm.msg=If you choose to disable the re-use change is impossible. +cop.ing.msg=Approval is being requested. +cop.request.msg=Signup is normally requested. +cop.password.msg=Please enter your password. +cop.password.not.same.msg=Password do not match. + +cop.comment.wrterNm = Writer Name +cop.comment.commentCn = Comment +cop.comment.commentPassword = Password + +cop.satisfaction.wrterNm = Writer Name +cop.satisfaction.stsfdgCn = Satisfaction +cop.satisfaction.stsfdg = Satisfaction Degree +cop.satisfaction.stsfdgPassword = Password + +cop.scrap.scrapNm = Scrap Name + +#UI USS Message# +uss.ion.noi.ntfcSj=Subject +uss.ion.noi.ntfcCn=Contents +uss.ion.noi.ntfcDate=Notification Date +uss.ion.noi.ntfcTime=Notification Time +uss.ion.noi.ntfcHH=Notification Hour +uss.ion.noi.ntfcMM=Notification Minute +uss.ion.noi.bhNtfcIntrvl=Beforehand Interval +uss.ion.noi.bhNtfcIntrvl.msg=Beforehand Interval is required. +uss.ion.noi.alertNtfcTime=Date and time of notification is not valid. + +#UI COP Message# +cop.sms.trnsmitTelno=Sender +cop.sms.trnsmitCn=Contents +cop.sms.recptnTelno=Receiver(s) +cop.sms.send=Send +cop.sms.addRecptn=Add +cop.sms.recptnTelno.msg=The phone number of receiver is required. + +#UI sym.log Message# +sym.log.histSeCode = History Code +sym.log.sysNm = System Name +sym.log.histCn = History Contents +sym.log.atchFile = Attached File +sym.log.atchFileList = Attached File List +sym.ems.receiver = Receiver +sym.ems.title = Title +sym.ems.content = Content + +#Vlidator Errors# +errors.required={0} is required. +errors.minlength={0} can not be less than {1} characters. +errors.maxlength={0} can not be greater than {1} characters. +errors.invalid={0} is invalid. + +errors.byte={0} must be a byte. +errors.short={0} must be a short. +errors.integer={0} must be an integer. +errors.long={0} must be a long. +errors.float={0} must be a float. +errors.double={0} must be a double. + +errors.date={0} is not a date. +errors.range={0} is not in the range {1} through {2}. +errors.creditcard={0} is an invalid credit card number. +errors.email={0} is an invalid e-mail address. + +#Vlidator Errors- ReprtStatsVO# +sts.reprtId = Report ID +sts.title = Report Title +sts.category = Report Category +sts.status = Report Status +sts.regDate = Registration Date + +#Rest day messages# +sym.cal.restDay = Holiday Date +sym.cal.restName = Holiday Name +sym.cal.restDetail = Holiday Detail +sym.cal.restCategory = Holiday Category + + +#Custom message# +custom.fail.access=It's not a normal approach. Log in and use it. +custom.fail.accessDenied=You do not have permission to request. +custom.isNotExist.msg=Data required for processing does not exist. diff --git a/src/test/resources/message/message-common_ko.properties b/src/test/resources/message/message-common_ko.properties new file mode 100644 index 0000000..169eab4 --- /dev/null +++ b/src/test/resources/message/message-common_ko.properties @@ -0,0 +1,385 @@ +valueRequired={0}\uac00 \uc124\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. + +pageNotFound=\uc694\uccad\ud558\uc2e0 \ud398\uc774\uc9c0\ub97c \ucc3e\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. +sessionExpired=\ub300\uae30 \uc2dc\uac04\uc774 \uc624\ub798\ub418\uc5b4 \uc138\uc158\uc774 \ub9cc\ub8cc\ub410\uc2b5\ub2c8\ub2e4. +invalidSession=\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc138\uc158\uc73c\ub85c \uc811\uadfc\ud588\uc2b5\ub2c8\ub2e4. +accessDenied=\uc694\uccad\ud558\uc2e0 \uc791\uc5c5\uc5d0 \ub300\ud55c \uad8c\ud55c\uc774 \uc5c6\uc5b4\uc11c \uc811\uadfc\uc774 \uac70\ubd80\ub410\uc2b5\ub2c8\ub2e4.
\uad00\ub9ac\uc790\uc5d0\uac8c \ubb38\uc758 \ubc14\ub78d\ub2c8\ub2e4. +serverError=\uc694\uccad\ud558\uc2e0 \uc791\uc5c5\uc744 \uc218\ud589 \uc911 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.
\uad00\ub9ac\uc790\uc5d0\uac8c \ubb38\uc758 \ubc14\ub78d\ub2c8\ub2e4. + +duplicate.object=\uc774\ubbf8 \ub4f1\ub85d\ub41c {0}\uc785\ub2c8\ub2e4. + +fail.common.msg=\uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4! +fail.common.sql=sql \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4! error code: {0}, error msg: {1} +info.nodata.msg=\ud574\ub2f9 \ub370\uc774\ud130\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. + +#UI Common resource# +table.num=\ubc88\ud638 +table.regdate=\ub4f1\ub85d\uc77c +table.reger=\ub4f1\ub85d\uc790 +table.select=\uc120\ud0dd +title.html=egovframe common component +title.detail=\uc0c1\uc138\uc870\ud68c +title.inquire=\uc870\ud68c +title.update=\uc218\uc815 +title.create=\ub4f1\ub85d +title.delete=\uc0ad\uc81c +title.save=\uc800\uc7a5 +title.list=\ubaa9\ub85d +title.searchCondition=\uac80\uc0c9\uc870\uac74 +title.search=\uac80\uc0c9\uc5b4 +title.reply=\ub2f5\uae00 +title.scrap=\uc2a4\ud06c\ub7a9 +title.comment=\ub313\uae00 +title.attachedFileSelect=\ud30c\uc77c\uc120\ud0dd +title.attachedFileDelete=\ud30c\uc77c\uc0ad\uc81c +title.link=\ub9c1\ud06c +title.management=\uad00\ub9ac +title.all=\uc804\uccb4 + +input.select=\uc120\ud0dd\ud558\uc138\uc694 +input.cSelect=\uc120\ud0dd +input.input=\uc785\ub825 +input.button=\ubc84\ud2bc +input.selectAll.title=\uc804\uccb4\uc120\ud0dd\uccb4\ud06c\ubc15\uc2a4 +input.yes=\uc608 +input.no=\uc544\ub2c8\uc624 + +select.searchCondition=\uc870\ud68c\uc870\uac74 \uc120\ud0dd + +button.select=\uc120\ud0dd +button.search=\uac80\uc0c9 +button.use=\uc0ac\uc6a9 +button.notUsed=\uc0ac\uc6a9\uc911\uc9c0 +button.inquire=\uc870\ud68c +button.update=\uc218\uc815 +button.create=\ub4f1\ub85d +button.delete=\uc0ad\uc81c +button.deleteDatabase=\uc644\uc804\uc0ad\uc81c +button.close=\ub2eb\uae30 +button.save=\uc800\uc7a5 +button.list=\ubaa9\ub85d +button.reset=\ucde8\uc18c +button.passwordUpdate=\uc554\ud638\ubcc0\uacbd +button.subscribe=\uac00\uc785\uc2e0\uccad +button.realname=\uc2e4\uba85\ud655\uc778 +button.moveToGpin=GPIN\uc2e4\uba85\ud655\uc778\uc73c\ub85c \uc774\ub3d9 +button.moveToIhidnum=\uc8fc\ubbfc\ub4f1\ub85d\ubc88\ud638 \uc2e4\uba85\ud655\uc778\uc73c\ub85c \uc774\ub3d9 +button.agree=\ub3d9\uc758 +button.disagree=\ube44\ub3d9\uc758 +button.possible=\uac00\ub2a5 +button.impossible=\ubd88\uac00\ub2a5 +button.qnaregist=Q&A\ub4f1\ub85d +button.cnsltregist=\uc0c1\ub2f4\ub4f1\ub85d +button.preview=\ubbf8\ub9ac\ubcf4\uae30 +button.next=\ub2e4\uc74c +button.add=\ubc14\ub85c\ucd94\uac00 +button.confirm=\ud655\uc778 +button.back = \ub4a4\ub85c +button.yes = \uc608 +button.no = \uc544\ub2c8\uc624 +button.home = \ud648 +button.user = \uc0ac\uc6a9\uc790\uc9c0\uc6d0 +button.cop = \ud611\uc5c5 +button.wrkstart = \ucd9c\uadfc +button.wrkend = \ud1f4\uadfc +button.reply = \ub2f5\uae00 +button.scrap = \uc2a4\ud06c\ub7a9 +button.comment = \ub313\uae00 +button.excel = \uc5d1\uc140 +button.init=\ucd08\uae30\ud654 +button.acknowledgment=\uc2b9\uc778 +button.cancelAcknowledgment=\uc2b9\uc778\ucde8\uc18c +button.bulkUpload=\uc77c\uad04\ub4f1\ub85d +button.log = \ub85c\uadf8 +button.set = \uc124\uc815 +button.move = \uc774\ub3d9 + + +#UI Common Message# +common.noScriptTitle.msg=\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294 \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c\ub294 \uc77c\ubd80 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\uc2e4 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +common.searchCondition.msg=\uc774 \ub808\uc774\uc544\uc6c3\uc740 \ud558\ub2e8 \uc815\ubcf4\ub97c \ub300\ud55c \uac80\uc0c9 \uc815\ubcf4\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. + +common.summary.list={0}\uc758 \ub0b4\uc5ed\uc5d0 \ub300\ud55c \ubaa9\ub85d\uc744 \ucd9c\ub825\ud569\ub2c8\ub2e4. +common.summary.regist={0}\uc758 \ub4f1\ub85d \uac00\ub2a5\ud55c \ub0b4\uc6a9\uc744 \uc785\ub825\ud558\uc5ec \ub4f1\ub85d \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \ub4f1\ub85d\ud55c\ub2e4. +common.summary.update={0}\uc758 \ub4f1\ub85d \uac00\ub2a5\ud55c \ub0b4\uc6a9\uc744 \uc785\ub825\ud558\uc5ec \ub4f1\ub85d \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \uc218\uc815\ud55c\ub2e4. +common.summary.inqire={0}\uc758 \ub0b4\uc5ed\uc5d0 \ub300\ud55c \uc0c1\uc138\uc870\ud68c \ub0b4\uc5ed\uc744 \ucd9c\ub825\ud569\ub2c8\ub2e4. + +common.save.msg=\uc800\uc7a5\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +common.regist.msg=\ub4f1\ub85d\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +common.delete.msg=\uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +common.update.msg=\uc218\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +common.nodata.msg=\uc790\ub8cc\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2e4\ub978 \uac80\uc0c9\uc870\uac74\uc744 \uc120\ud0dd\ud574\uc8fc\uc138\uc694 +common.required.msg=(\uc740)\ub294 \ud544\uc218\uc785\ub825\ud56d\ubaa9\uc785\ub2c8\ub2e4. +common.acknowledgement.msg=\uc2b9\uc778\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +common.acknowledgementcancel.msg=\uc2b9\uc778\ucde8\uc18c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +common.nocomment.msg=\ub313\uae00\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. +common.noguest.msg=\uc791\uc131\ub41c \ubc29\uba85\ub85d\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. + +success.request.msg = \uc694\uccad\ucc98\ub9ac\uac00 \uc131\uacf5\uc801\uc73c\ub85c \uc218\ud589\ub418\uc5c8\uc2b5\ub2c8\ub2e4. +success.common.select=\uc815\uc0c1\uc801\uc73c\ub85c \uc870\ud68c\ub418\uc5c8\uc2b5\ub2c8\ub2e4. +success.common.insert=\uc815\uc0c1\uc801\uc73c\ub85c \ub4f1\ub85d\ub418\uc5c8\uc2b5\ub2c8\ub2e4. +success.common.update=\uc815\uc0c1\uc801\uc73c\ub85c \uc218\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4. +success.common.delete=\uc815\uc0c1\uc801\uc73c\ub85c \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4. + +common.imposbl.fileupload = \ub354 \uc774\uc0c1 \ud30c\uc77c\uc744 \ucca8\ubd80\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +common.isConfmDe.msg=\uc2b9\uc778\uc77c\uc790\ub97c \ud655\uc778 \ubc14\ub78d\ub2c8\ub2e4. +common.isExist.msg = \uc774\ubbf8 \uc874\uc7ac\ud558\uac70\ub098 \uacfc\uac70\uc5d0 \ub4f1\ub85d\uc774 \ub418\uc5c8\ub358 \uc0c1\ud0dc\uc785\ub2c8\ub2e4. + +fail.common.insert = \uc0dd\uc131\uc774 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. +fail.common.update = \uc218\uc815\uc774 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. +fail.common.delete = \uc0ad\uc81c\uac00 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. +fail.common.delete.upperMenuExist = \ucc38\uc870\ub418\ub294 \uba54\ub274\uac00 \uc788\uc5b4 \uc0ad\uc81c\uac00 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. +fail.common.select = \uc870\ud68c\uc5d0 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. +fail.common.login = \ub85c\uadf8\uc778 \uc815\ubcf4\uac00 \uc62c\ubc14\ub974\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. +fail.common.loginIncorrect = {0}\ud68c \uc774\uc0c1 \ub85c\uadf8\uc778 \uc811\uc18d\uc774 \uc2dc\ub3c4 \ub418\uc5b4 \uacc4\uc815\uc774 \uc7a0\uaca8\uc2b5\ub2c8\ub2e4! +fail.common.login.password = \ud328\uc2a4\uc6cc\ub4dc \uc790\ub9ac \uc218\uac00 \uc77c\uce58 \ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.(8\uc790\ub9ac \uc774\uc0c1 20\uc790\ub9ac \uc774\ud558) +fail.common.idsearch = \uc544\uc774\ub514\ub97c \ucc3e\uc744\uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +fail.common.pwsearch = \ube44\ubc00\ubc88\ud638\ub97c \ucc3e\uc744\uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +fail.request.msg = \uc694\uccad\ucc98\ub9ac\ub97c \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. +fail.common.login.ip = \ub4f1\ub85d\ub41c IP\uac00 \uc544\ub2c8\ubbc0\ub85c \ub85c\uadf8\uc778\uc774 \uac70\ubd80\ub418\uc5c8\uc2b5\ub2c8\ub2e4. + +#UI User Message# +fail.user.passwordUpdate1=\ud604\uc7ac \ube44\ubc00\ubc88\ud638\uac00 \ub9de\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. +fail.user.passwordUpdate2=\ube44\ubc00\ubc88\ud638\uc640 \ube44\ubc00\ubc88\ud638 \ud655\uc778\uc774 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. +info.user.rlnmCnfirm=\uc8fc\ubbfc\ub4f1\ub85d\ubc88\ud638\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc2e4\uba85\ud655\uc778\uc744 \ud558\uc2ed\uc2dc\uc624. +success.user.rlnmCnfirm=\ud589\uc815\uc548\uc804\ubd80\uc758 \uc8fc\ubbfc\ub4f1\ub85d\uc790\ub8cc\uc640 \uc77c\uce58\ud569\ub2c8\ub2e4. +fail.user.rlnmCnfirm=\ud589\uc815\uc548\uc804\ubd80\uc758 \uc8fc\ubbfc\ub4f1\ub85d\uc790\ub8cc\uc640 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. +fail.user.connectFail=\uc2dc\uc2a4\ud15c \uc7a5\uc560\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.(\uc778\uc99d\uc11c\ubc84 \uc5f0\uacb0 \uc2e4\ud328) +info.user.rlnmPinCnfirm=\uacf5\uacf5 \uc544\uc774\ud540 \uc544\uc774\ub514\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc2e4\uba85\ud655\uc778\uc744 \ud558\uc2ed\uc2dc\uc624. +success.user.rlnmPinCnfirm=\uacf5\uacf5\uc544\uc774\ud540\uc758 \ub4f1\ub85d\uc790\ub8cc\uc640 \uc77c\uce58\ud569\ub2c8\ub2e4. +fail.user.rlnmPinCnfirm=\uacf5\uacf5\uc544\uc774\ud540\uc758 \ub4f1\ub85d\uc790\ub8cc\uc640 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. + + +#UI Cop Message# +cop.extrlUser = \uc678\ubd80\uc0ac\uc6a9\uc790 +cop.intrlUser = \ub0b4\ubd80\uc0ac\uc6a9\uc790 +cop.private = \ube44\uacf5\uac1c +cop.public = \uacf5\uac1c + +cop.adbkNm = \uc8fc\uc18c\ub85d\uba85 +cop.othbcScope = \uacf5\uac1c\ubc94\uc704 +cop.company = \ud68c\uc0ac +cop.part = \ubd80\uc11c +cop.man = \uac1c\uc778 +cop.adbkUser = \uad6c\uc131\uc6d0 +cop.bbsNm = \uac8c\uc2dc\ud310\uba85 +cop.bbsIntrcn = \uac8c\uc2dc\ud310\uc18c\uac1c +cop.bbsTyCode = \uac8c\uc2dc\ud310 \uc720\ud615 +cop.bbsAttrbCode = \uac8c\uc2dc\ud310 \uc18d\uc131 +cop.replyPosblAt = \ub2f5\uc7a5\uac00\ub2a5\uc5ec\ubd80 +cop.fileAtchPosblAt = \ud30c\uc77c\ucca8\ubd80\uac00\ub2a5\uc5ec\ubd80 +cop.posblAtchFileNumber = \ucca8\ubd80\uac00\ub2a5\ud30c\uc77c \uc22b\uc790 +cop.tmplatId = \ud15c\ud50c\ub9bf \uc815\ubcf4 +cop.guestList.subject = \ubc29\uba85\ub85d \uac8c\uc2dc\uae00\uc785\ub2c8\ub2e4. +cop.nttSj = \uc81c\ubaa9 +cop.nttCn = \uae00\ub0b4\uc6a9 +cop.ntceBgnde = \uac8c\uc2dc\uc2dc\uc791\uc77c +cop.ntceEndde = \uac8c\uc2dc\uc885\ub8cc\uc77c +cop.ntcrNm = \uc791\uc131\uc790 +cop.password = \ud328\uc2a4\uc6cc\ub4dc +cop.atchFile = \ud30c\uc77c\ucca8\ubd80 +cop.guestList = \ubc29\uba85\ub85d +cop.guestListCn = \ubc29\uba85\ub85d \ub0b4\uc6a9 +cop.noticeTerm = \uac8c\uc2dc\uae30\uac04 +cop.atchFileList = \ucca8\ubd80\ud30c\uc77c\ubaa9\ub85d +cop.cmmntyNm = \ucee4\ubba4\ub2c8\ud2f0\uba85 +cop.cmmntyIntrcn = \ucee4\ubba4\ub2c8\ud2f0 \uc18c\uac1c +cop.cmmntyMngr = \ucee4\ubba4\ub2c8\ud2f0 \uad00\ub9ac\uc790 +cop.clbOprtr = \ub3d9\ud638\ud68c \uc6b4\uc601\uc790 +cop.clbIntrcn = \ub3d9\ud638\ud68c \uc18c\uac1c +cop.clbNm = \ub3d9\ud638\ud68c \uba85 +cop.tmplatNm = \ud15c\ud50c\ub9bf\uba85 +cop.tmplatSeCode = \ud15c\ud50c\ub9bf \uad6c\ubd84 +cop.tmplatCours = \ud15c\ud50c\ub9bf\uacbd\ub85c +cop.useAt = \uc0ac\uc6a9\uc5ec\ubd80 +cop.ncrdNm = \uc774\ub984 +cop.cmpnyNm = \ud68c\uc0ac\uba85 +cop.deptNm = \ubd80\uc11c\uba85 +cop.ofcpsNm = \uc9c1\uc704 +cop.clsfNm = \uc9c1\uae09 +cop.emailAdres = \uc774\uba54\uc77c\uc8fc\uc18c +cop.telNo = \uc804\ud654\ubc88\ud638 +cop.mbtlNum = \ud734\ub300\ud3f0\ubc88\ud638 +cop.adres = \uc8fc\uc18c +cop.extrlUserAt = \uc678\ubd80\uc0ac\uc6a9\uc790\uc5ec\ubd80 +cop.publicAt = \uacf5\uac1c\uc5ec\ubd80 +cop.remark = \ube44\uace0 +cop.trgetNm = \ucee4\ubba4\ub2c8\ud2f0/\ub3d9\ud638\ud68c \uc815\ubcf4 +cop.preview = \ubbf8\ub9ac\ubcf4\uae30 + +cop.withdraw.msg=\ud0c8\ud1f4\ucc98\ub9ac \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +cop.reregist.msg=\uc7ac\uac00\uc785 \ucc98\ub9ac\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +cop.registmanager.msg=\uc6b4\uc601\uc9c4\uc73c\ub85c \ub4f1\ub85d\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +cop.use.msg=\uc0ac\uc6a9 \ucc98\ub9ac\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +cop.unuse.msg=\uc0ac\uc6a9\uc911\uc9c0 \ucc98\ub9ac\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +cop.delete.confirm.msg=\uc0ac\uc6a9\uc911\uc9c0\ub97c \uc120\ud0dd\ud558\uc2e4 \uacbd\uc6b0 \ub2e4\uc2dc \uc0ac\uc6a9\uc73c\ub85c \ubcc0\uacbd\uc774 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4. +cop.ing.msg=\uc2b9\uc778\uc694\uccad \uc911\uc785\ub2c8\ub2e4. +cop.request.msg=\uac00\uc785\uc2e0\uccad\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc694\uccad\ub418\uc5c8\uc2b5\ub2c8\ub2e4 +cop.password.msg=\ud328\uc2a4\uc6cc\ub4dc\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. +cop.password.not.same.msg=\ud328\uc2a4\uc6cc\ub4dc\uac00 \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. + +cop.comment.wrterNm = \uc791\uc131\uc790 +cop.comment.commentCn = \ub0b4\uc6a9 +cop.comment.commentPassword = \ud328\uc2a4\uc6cc\ub4dc + +cop.satisfaction.wrterNm = \uc791\uc131\uc790 +cop.satisfaction.stsfdgCn = \ub0b4\uc6a9 +cop.satisfaction.stsfdg = \ub9cc\uc871\ub3c4 +cop.satisfaction.stsfdgPassword = \ud328\uc2a4\uc6cc\ub4dc + +cop.scrap.scrapNm = \uc2a4\ud06c\ub7a9\uba85 + +#UI USS Message# +uss.ion.noi.ntfcSj=\uc81c\ubaa9 +uss.ion.noi.ntfcCn=\ub0b4\uc6a9 +uss.ion.noi.ntfcDate=\uc54c\ub9bc\uc77c\uc790 +uss.ion.noi.ntfcTime=\uc54c\ub9bc\uc2dc\uac04 +uss.ion.noi.ntfcHH=\uc54c\ub9bc\uc2dc\uac04 +uss.ion.noi.ntfcMM=\uc54c\ub9bc\ubd84 +uss.ion.noi.bhNtfcIntrvl=\uc0ac\uc804\uc54c\ub9bc\uac04\uaca9 +uss.ion.noi.bhNtfcIntrvl.msg=\uc0ac\uc804\uc54c\ub9bc\uac04\uaca9 \uc9c0\uc815\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. +uss.ion.noi.alertNtfcTime=\uc54c\ub9bc\uc77c\uc790 \ubc0f \uc2dc\uac04\uc774 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. + +#UI COP Message# +cop.sms.trnsmitTelno=\ubc1c\uc2e0\uc804\ud654\ubc88\ud638 +cop.sms.trnsmitCn=\uc804\uc1a1\ub0b4\uc6a9 +cop.sms.recptnTelno=\uc218\uc2e0\uc804\ud654\ubc88\ud638 +cop.sms.send=\uc804\uc1a1 +cop.sms.addRecptn=\ucd94\uac00 +cop.sms.recptnTelno.msg=\uc218\uc2e0\uc804\ud654\ubc88\ud638 \uc9c0\uc815\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. + +#UI sym.log Message# +sym.log.histSeCode = \uc774\ub825\uad6c\ubd84 +sym.log.sysNm = \uc2dc\uc2a4\ud15c\uba85 +sym.log.histCn = \uc774\ub825\ub0b4\uc6a9 +sym.log.atchFile = \ucca8\ubd80\ud30c\uc77c +sym.log.atchFileList = \ucca8\ubd80\ud30c\uc77c\ubaa9\ub85d +sym.ems.receiver = \ubc1b\ub294\uc0ac\ub78c +sym.ems.title = \uc81c\ubaa9 +sym.ems.content = \ubc1c\uc2e0\ub0b4\uc6a9 + +#Vlidator Errors# +errors.prefix=
+errors.suffix=

+ +errors.required={0}\uc740(\ub294) \ud544\uc218 \uc785\ub825\uac12\uc785\ub2c8\ub2e4. +errors.minlength={0}\uc740(\ub294) {1}\uc790 \uc774\uc0c1 \uc785\ub825\ud574\uc57c \ud569\ub2c8\ub2e4. +errors.maxlength={0}\uc740(\ub294) {1}\uc790 \uc774\uc0c1 \uc785\ub825\ud560\uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +errors.invalid={0}\uc740(\ub294) \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uac12\uc785\ub2c8\ub2e4. +errors.minInteger={0}\uc740(\ub294) \uc720\ud6a8\ud55c \uac12\uc774 \uc544\ub2d9\ub2c8\ub2e4. 1 \uc774\uc0c1\uc758 \uac12\uc744 \uc785\ub825\ud574\uc57c \ud569\ub2c8\ub2e4. +errors.byte={0}\uc740(\ub294) byte\ud0c0\uc785\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. +errors.short={0}\uc740(\ub294) short\ud0c0\uc785\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. +errors.integer={0}\uc740(\ub294) \uc815\uc218 \ud0c0\uc785\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. +errors.long={0}\uc740(\ub294) long \ud0c0\uc785\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. +errors.float={0}\uc740(\ub294) \uc2e4\uc218 \ud0c0\uc785\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. +errors.double={0}\uc740(\ub294) double \ud0c0\uc785\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. + +errors.date={0}\uc740(\ub294) \ub0a0\uc9dc \uc720\ud615\uc774 \uc544\ub2d9\ub2c8\ub2e4. +errors.range={0}\uc740(\ub294) {1}\uacfc {2} \uc0ac\uc774\uc758 \uac12\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. +errors.creditcard={0}\uc740(\ub294) \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc2e0\uc6a9\uce74\ub4dc \ubc88\ud638\uc785\ub2c8\ub2e4. +errors.email={0}\uc740(\ub294) \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc774\uba54\uc77c \uc8fc\uc18c\uc785\ub2c8\ub2e4. + +errors.ihidnum=\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc8fc\ubbfc\ub4f1\ub85d\ubc88\ud638\uc785\ub2c8\ub2e4. +errors.korean={0}\uc740(\ub294) \ud55c\uae00\uc744 \uc785\ub825\ud558\uc154\uc57c \ud569\ub2c8\ub2e4. +errors.ip=\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 IP\uc8fc\uc18c\uc785\ub2c8\ub2e4. + +errors.password1={0}\uc740(\ub294) 8~20\uc790 \ub0b4\uc5d0\uc11c \uc785\ub825\ud574\uc57c \ud569\ub2c8\ub2e4. +errors.password2={0}\uc740(\ub294) \ud55c\uae00,\ud2b9\uc218\ubb38\uc790,\ub744\uc5b4\uc4f0\uae30\ub294 \ud5c8\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. +errors.password3={0}\uc740(\ub294) \uc21c\ucc28\uc801\uc778 \uc22b\uc790\ub97c 4\uac1c\uc774\uc0c1 \uc5f0\uc18d\ud574\uc11c \uc0ac\uc6a9\ud560\uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +errors.password4={0}\uc740(\ub294) \ubc18\ubcf5\ub418\ub294 \ubb38\uc790\ub098 \uc22b\uc790\ub97c 4\uac1c\uc774\uc0c1 \uc5f0\uc18d\ud574\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. + +errors.notKorean={0}\uc740(\ub294) \ud55c\uae00\uc744 \uc0ac\uc6a9\ud558\uc2e4\uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +error.security.runtime.error = error + +#Xss Errors# +errors.xss.checkerUser=\ud574\ub2f9 \uae30\ub2a5\uc5d0 \ub300\ud55c \uc0ac\uc6a9 \ubc0f \ucc98\ub9ac \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. + +#File Upload / Download +errors.file.extension=\uc9c0\uc6d0\ub418\ub294 \ud30c\uc77c\uc720\ud615\uc774 \uc544\ub2d9\ub2c8\ub2e4. +errors.file.transfer=\ud30c\uc77c\uc804\uc1a1\uc911 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. +success.file.transfer=\ud30c\uc77c\uc804\uc1a1\uc774 \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. + +#Vlidator Errors- wordDicaryVO# +wordDicaryVO.wordNm=\uc6a9\uc5b4\uba85 +wordDicaryVO.engNm=\uc601\ubb38\uba85 +wordDicaryVO.wordDc=\uc6a9\uc5b4\uc124\uba85 +wordDicaryVO.synonm=\ub3d9\uc758\uc5b4 + +#Vlidator Errors- cnsltManageVO# +cnsltManageVO.cnsltSj=\uc0c1\ub2f4\uc81c\ubaa9 +cnsltManageVO.cnsltCn=\uc0c1\ub2f4\ub0b4\uc6a9 +cnsltManageVO.writngPassword=\uc791\uc131\ube44\ubc00\ubc88\ud638 +cnsltManageVO.areaNo=\uc9c0\uc5ed\ubc88\ud638 +cnsltManageVO.middleTelno=\uc911\uac04\uc804\ud654\ubc88\ud638 +cnsltManageVO.endTelno=\ub05d\uc804\ud654\ubc88\ud638 +cnsltManageVO.wrterNm=\uc791\uc131\uc790\uba85 +cnsltManageVO.managtCn=\ub2f5\ubcc0\ub0b4\uc6a9 + +#Vlidator Errors- siteManageVO# +siteManageVO.siteNm=\uc0ac\uc774\ud2b8\uba85 +siteManageVO.siteUrl=\uc0ac\uc774\ud2b8 URL +siteManageVO.siteDc=\uc0ac\uc774\ud2b8\uc124\uba85 +siteManageVO.siteThemaClCode=\uc0ac\uc774\ud2b8\uc8fc\uc81c\ubd84\ub958 +siteManageVO.actvtyAt=\ud65c\uc131\uc5ec\ubd80 +siteManageVO.useAt=\uc0ac\uc6a9\uc5ec\ubd80 + +#Vlidator Errors- recomendSiteManageVO# +recomendSiteManageVO.recomendSiteNm=\ucd94\ucc9c\uc0ac\uc774\ud2b8\uba85 +recomendSiteManageVO.recomendSiteUrl=\ucd94\ucc9c\uc0ac\uc774\ud2b8 URL +recomendSiteManageVO.recomendSiteDc=\ucd94\ucc9c\uc0ac\uc774\ud2b8\uc124\uba85 +recomendSiteManageVO.recomendResnCn=\ucd94\ucc9c\uc0ac\uc774\ud2b8\uc2b9\uc778\uc0ac\uc720 +recomendSiteManageVO.confmDe=\uc2b9\uc778\uc77c\uc790 + +#Vlidator Errors- hpcmManageVO# +hpcmManageVO.hpcmSeCode=\ub3c4\uc6c0\ub9d0\uad6c\ubd84 +hpcmManageVO.hpcmDf=\ub3c4\uc6c0\ub9d0\uc815\uc758 +hpcmManageVO.hpcmDc=\ub3c4\uc6c0\ub9d0\uc124\uba85 + +#Vlidator Errors- newsManageVO# +newsManageVO.newsSj=\ub274\uc2a4\uc81c\ubaa9 +newsManageVO.newsCn=\ub274\uc2a4\ub0b4\uc6a9 +newsManageVO.ntceDe=\uac8c\uc2dc\uc77c\uc790 + +#Vlidator Errors- faqManageVO# +faqManageVO.qestnSj=\uc9c8\ubb38\uc81c\ubaa9 +faqManageVO.qestnCn=\uc9c8\ubb38\ub0b4\uc6a9 +faqManageVO.answerCn=\ub2f5\ubcc0\ub0b4\uc6a9 + +#Vlidator Errors- stplatManageVO# +stplatManageVO.useStplatNm=\uc774\uc6a9\uc57d\uad00\uba85 +stplatManageVO.useStplatCn=\uc774\uc6a9\uc57d\uad00\ub0b4\uc6a9 +stplatManageVO.infoProvdAgreCn=\uc815\ubcf4\uc81c\uacf5\ub3d9\uc758\ub0b4\uc6a9 + +#Vlidator Errors- cpyrhtPrtcPolicyVO# +cpyrhtPrtcPolicyVO.cpyrhtPrtcPolicyCn=\uc800\uc791\uad8c\ubcf4\ud638\uc815\ucc45\ub0b4\uc6a9 + +#Vlidator Errors- qnaManageVO# +qnaManageVO.qestnSj=\uc9c8\ubb38\uc81c\ubaa9 +qnaManageVO.qestnCn=\uc9c8\ubb38\ub0b4\uc6a9 +qnaManageVO.writngPassword=\uc791\uc131\ube44\ubc00\ubc88\ud638 +qnaManageVO.areaNo=\uc9c0\uc5ed\ubc88\ud638 +qnaManageVO.middleTelno=\uc911\uac04\uc804\ud654\ubc88\ud638 +qnaManageVO.endTelno=\ub05d\uc804\ud654\ubc88\ud638 +qnaManageVO.wrterNm=\uc791\uc131\uc790\uba85 +qnaManageVO.answerCn=\ub2f5\ubcc0\ub0b4\uc6a9 + +#Vlidator Errors- ReprtStatsVO# +sts.reprtId = \ubcf4\uace0\uc11cID +sts.title = \ubcf4\uace0\uc11c\uba85 +sts.category = \ubcf4\uace0\uc11c\uc720\ud615 +sts.status = \uc9c4\ud589\uc0c1\ud0dc +sts.regDate = \ub4f1\ub85d\uc77c\uc2dc + +#Rest day messages# +sym.cal.restDay = \ud734\uc77c\uc77c\uc790 +sym.cal.restName = \ud734\uc77c\uba85 +sym.cal.restDetail = \ud734\uc77c\uc124\uba85 +sym.cal.restCategory = \ud734\uc77c\uad6c\ubd84 + +image.errorBg = \uc624\ub958\uc774\ubbf8\uc9c0 + + +#Custom message# +custom.fail.access=\uc815\uc0c1\uc801\uc778 \uc811\uadfc\uc774 \uc544\ub2d9\ub2c8\ub2e4. \ub85c\uadf8\uc778 \ud6c4 \uc774\uc6a9\ud558\uc138\uc694. +custom.fail.accessDenied=\uc694\uccad\uc5d0 \ub300\ud55c \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. +custom.isNotExist.msg=\ucc98\ub9ac\uc5d0 \ud544\uc694\ud55c \uc790\ub8cc\uac00 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. diff --git a/src/test/resources/spring/context-common.xml b/src/test/resources/spring/context-common.xml new file mode 100644 index 0000000..e2269c6 --- /dev/null +++ b/src/test/resources/spring/context-common.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + classpath:message/message-common + classpath:message/authentication-message + classpath:org/egovframe/rte/fdl/property/messages/properties + + + + + 60 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/spring/context-datasource.xml b/src/test/resources/spring/context-datasource.xml new file mode 100644 index 0000000..5c19087 --- /dev/null +++ b/src/test/resources/spring/context-datasource.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/sql/mapper/base/test-mapper.xml b/src/test/resources/sql/mapper/base/test-mapper.xml new file mode 100644 index 0000000..d674130 --- /dev/null +++ b/src/test/resources/sql/mapper/base/test-mapper.xml @@ -0,0 +1,13 @@ + + + + +${sql} + +${sql} + +${sql} + +COMMIT + + \ No newline at end of file diff --git a/src/test/resources/sql/mapper/base/utility.xml b/src/test/resources/sql/mapper/base/utility.xml new file mode 100644 index 0000000..7748817 --- /dev/null +++ b/src/test/resources/sql/mapper/base/utility.xml @@ -0,0 +1,29 @@ + + + + + + +SELECT QROWS.* FROM ( + SELECT ROW_NUMBER() OVER() ROW_NUM + , COUNT(*) OVER() TOT_CNT, QBODY.* + FROM ( + + ) QBODY + ) QROWS +WHERE ROW_NUM BETWEEN ((#{pageNum} - 1) * #{fetchSize}) + 1 AND (#{pageNum} * #{fetchSize}) + + + +ORDER BY ${orderBy} + + + +DATE_FORMAT(CURRENT_TIMESTAMP(), '%Y%m%d%H%i%s') + +IFNULL(#{thisDay}, DATE_FORMAT(CURRENT_DATE, '%Y%m%d')) + +SELECTTHIS_DAY + + \ No newline at end of file diff --git a/src/test/resources/sql/mybatis-config.xml b/src/test/resources/sql/mybatis-config.xml new file mode 100644 index 0000000..03ad4e8 --- /dev/null +++ b/src/test/resources/sql/mybatis-config.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file