diff --git a/pom.xml b/pom.xml index 91611b4..ad7cb6b 100644 --- a/pom.xml +++ b/pom.xml @@ -1,234 +1,234 @@ - - 4.0.0 - - cokr.xit - xit-file - 23.04.01 - jar - - xit-file - http://maven.apache.org - - - UTF-8 - - 1.8 - ${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 - xit-foundation - 23.04.01 - - - - 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 - - 1.8 - 1.8 - UTF-8 - - - - 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 - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 3.0.0 - - true - xml - - **/Abstract*.java - **/*Suite.java - - - **/*Test.java - - - - - 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/ - - - + + 4.0.0 + + cokr.xit + xit-file + 23.04.01 + jar + + xit-file + http://maven.apache.org + + + UTF-8 + + 1.8 + ${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 + xit-foundation + 23.04.01 + + + + 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 + + 1.8 + 1.8 + UTF-8 + + + + 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 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + true + xml + + **/Abstract*.java + **/*Suite.java + + + **/*Test.java + + + + + 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/base/file/FileInfo.java b/src/main/java/cokr/xit/base/file/FileInfo.java index fd885e4..2c55491 100644 --- a/src/main/java/cokr/xit/base/file/FileInfo.java +++ b/src/main/java/cokr/xit/base/file/FileInfo.java @@ -1,585 +1,585 @@ -package cokr.xit.base.file; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Base64; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.springframework.util.FileCopyUtils; - -import cokr.xit.foundation.AbstractComponent; -import cokr.xit.foundation.Assert; - -/**파일 정보 - * @author mjkhan - */ -public class FileInfo { - /**objs를 대시(-)로 연결하여 infoKey를 반환한다. - * @param objs 아이디로 쓰이는 필드값 - * @return infoKey - */ - public static String InfoKey(Object... objs) { - if (Assert.isEmpty(objs)) - return ""; - - return Stream.of(objs) - .filter(obj -> !Assert.isEmpty(obj)) - .map(obj -> obj.toString()) - .collect(Collectors.joining("-")); - } - - /**파일 데이터 홀더 - * @author mjkhan - */ - public static class DataHolder { - private String infoType; - private String infoKey; - private String filename; - private byte[] data; - - /**새 DataHolder를 생성한다. - * @param infoType 관계 정보 유형 - * @param infoKey 관계 정보 키 - * @param filename 파일 이름 - * @param data 파일 데이터 - */ - public DataHolder(String infoType, String infoKey, String filename, byte[] data) { - this.infoType = infoType; - this.infoKey = infoKey; - this.filename = filename; - this.data = data != null ? data : new byte[0]; - } - - /**새 DataHolder를 생성한다. - * @param infoType 관계 정보 유형 - * @param infoKey 관계 정보 키 - * @param filename 파일 이름 - * @param data 파일 데이터 - */ - public DataHolder(String infoType, String infoKey, String filename, String data) { - this(infoType, infoKey, filename, !Assert.isEmpty(data) ? Base64.getDecoder().decode(data.getBytes()) : null); - } - - /**관계 정보 유형을 반환한다. - * @return 관계 정보 유형 - */ - public String getInfoType() { - return infoType; - } - - /**관계 정보 키를 반환한다. - * @return 관계 정보 키 - */ - public String getInfoKey() { - return infoKey; - } - - /**파일이름을 반환한다. - * @return 파일이름 - */ - public String getFilename() { - return filename; - } - - /**데이터를 반환한다. - * @return 데이터 - */ - public byte[] getData() { - return data; - } - - /**데이터의 길이를 반환한다. - * @return 데이터의 길이 - */ - public long length() { - return data != null ? data.length : 0; - } - - /**데이터가 비어있는지 반환한다. - * @return - * - */ - public boolean isEmpty() { - return length() < 1; - } - } - - /**FileInfo 생성자 - * @author mjkhan - */ - public static class Factory extends AbstractComponent { - /**주어진 관계 정보 유형과 키, 그리고 파일로 FileInfo 목록을 생성한다. - * @param infoType 관계 정보 유형 - * @param infoKey 관계 정보 키 - * @param files 파일 - * @return FileInfo 목록 - */ - public List createFileInfos(String infoType, String infoKey, Iterable files) { - notEmpty(infoType, "infoType"); - notEmpty(infoKey, "infoKey"); - if (isEmpty(files)) - return Collections.emptyList(); - - ArrayList result = new ArrayList<>(); - for (File file: files) - try { - if (file == null) continue; - - FileInfo info = new FileInfo(); - info.setInfoType(infoType); - info.setInfoKey(infoKey); - String filename = file.getName(); - info.setName(filename); - InputStream input = new FileInputStream(file); - String mimeType = URLConnection.guessContentTypeFromName(filename); - if (isEmpty(mimeType)) - mimeType = URLConnection.guessContentTypeFromStream(input); - info.setMimeType(mimeType); - info.setInputStream(input); - info.setSize(file.length()); - info.setSortOrder(result.size()); - result.add(info); - } catch (Exception e) { - throw runtimeException(e); - } - return result; - } - - /**주어진 관계 정보 유형과 키, 그리고 파일로 FileInfo 목록을 생성한다. - * @param infoType 관계 정보 유형 - * @param infoKey 관계 정보 키 - * @param files 파일 - * @return FileInfo 목록 - */ - public List createFileInfos(String infoType, String infoKey, File... files) { - return createFileInfos(infoType, infoKey, Arrays.asList(files)); - } - - /**주어진 관계 정보 유형과 키, 그리고 파일로 FileInfo을 생성한다. - * @param infoType 관계 정보 유형 - * @param infoKey 관계 정보 키 - * @param file 파일 - * @return FileInfo - */ - public FileInfo create(String infoType, String infoKey, File file) { - List fileInfos = createFileInfos(infoType, infoKey, file); - return !fileInfos.isEmpty() ? fileInfos.get(0) : null; - } - - /**파일 DataHolder에서 FileInfo 목록을 생성한다. - * @return FileInfo 목록 - */ - public List createFileInfos(Iterable dataHolders) { - if (isEmpty(dataHolders)) - return Collections.emptyList(); - - ArrayList result = new ArrayList<>(); - for (DataHolder holder: dataHolders) - try { - if (holder == null) continue; - - FileInfo info = new FileInfo(); - info.setInfoType(holder.infoType); - info.setInfoKey(holder.infoKey); - String filename = holder.getFilename(); - info.setName(filename); - InputStream input = new ByteArrayInputStream(holder.data); - String mimeType = URLConnection.guessContentTypeFromName(filename); - if (isEmpty(mimeType)) - mimeType = URLConnection.guessContentTypeFromStream(input); - info.setMimeType(mimeType); - info.setInputStream(input); - info.setSize(holder.length()); - info.setSortOrder(result.size()); - result.add(info); - } catch (Exception e) { - throw runtimeException(e); - } - return result; - } - - /**파일 DataHolder에서 FileInfo 목록을 생성한다. - * @return FileInfo 목록 - */ - public List createFileInfos(DataHolder... dataHolders) { - return createFileInfos(Arrays.asList(dataHolders)); - } - - /**파일 DataHolder에서 FileInfo를 생성한다. - * @return FileInfo - */ - public FileInfo create(DataHolder dataHolder) { - List list = createFileInfos(dataHolder); - return !list.isEmpty() ? list.get(0) : null; - } - } - - private String - id, - infoType, - infoKey, - subType, - name, - path, - url, - mimeType, - extension, - createdBy, - inUse; - private long size; - private int downloadCount; - private int sortOrder; - private Date createdAt; - private InputStream input; - - /**주어진 경로에서 파일 이름을 추출한다. - * @param path 파일 경로 - * @return 파일 이름 - */ - public static final String name(String path) { - path = path.replace("\\", "/"); - return path.substring(path.lastIndexOf("/") + 1); - } - - /**주어진 경로에서 디렉토리 이름을 추출한다. - * @param path 파일 경로 - * @return 디렉토리 이름 - */ - public static final String dir(String path) { - path = path.replace("\\", "/"); - int pos = path.lastIndexOf("/"); - return pos < 0 ? "" : path.substring(0, pos); - } - - /**주어진 파일 이름에서 확장자를 추출한다. - * @param filename 파일 이름 - * @return 파일 확장자 - */ - public static final String extension(String filename) { - int pos = filename.lastIndexOf("."); - return pos < 0 ? "" : filename.substring(pos + 1); - } - - /**id를 반환한다. - * @return id - */ - public String getId() { - return id; - } - - /**id를 설정한다. - * @param id id - */ - public void setId(String id) { - this.id = id; - } - - /**관계 정보 유형을 반환한다. 프로그램에서 정의 - * @return 관계 정보 유형 - */ - public String getInfoType() { - return infoType; - } - - /**관계 정보 유형을 설정한다. 프로그램에서 정의 - * @param infoType 관계 정보 유형 - * @return 현재 FileInfo - */ - public FileInfo setInfoType(String infoType) { - this.infoType = infoType; - return this; - } - - /**관계 정보 키를 반환한다. 프로그램에서 정의 - * @return 관계 정보 키 - */ - public String getInfoKey() { - return infoKey; - } - - /**관계 정보 키를 설정한다. 프로그램에서 정의 - * @param infoKey 관계 정보 키 - * @return 현재 FileInfo - */ - public FileInfo setInfoKey(String infoKey) { - this.infoKey = infoKey; - return this; - } - - /**관계 정보 기준 하위분류를 반환한다. 프로그램에서 정의 - * @return 관계 정보 기준 하위분류 - */ - public String getSubType() { - return subType; - } - - /**관계 정보 기준 하위분류를 설정한다. 프로그램에서 정의 - * @param subType 관계 정보 기준 하위분류 - */ - public void setSubType(String subType) { - this.subType = subType; - } - - /**파일이름을 반환한다. - * @return 파일이름 - */ - public String getName() { - return name; - } - - /**파일이름을 설정한다. - * @param name 파일이름 - */ - public void setName(String name) { - this.name = name; - } - - /**저장경로를 반환한다. - * @return 저장경로 - */ - public String getPath() { - return path; - } - - /**저장경로를 설정한다. - * @param path 저장경로 - * @return 현재 FileInfo - */ - public FileInfo setPath(String path) { - this.path = path; - return this; - } - - /**url을 반환한다. - * @return url - */ - public String getUrl() { - return url; - } - - /**url을 설정한다. - * @param url url - */ - public void setUrl(String url) { - this.url = url; - } - - /**mime type을 반환한다. - * @return mime type - */ - public String getMimeType() { - return Assert.ifEmpty(mimeType, mimeType = "application/octet-stream"); - } - - /**mime type을 설정한다. - * @param mimeType mime type - */ - public void setMimeType(String mimeType) { - this.mimeType = mimeType; - } - - /**확장자를 반환한다. - * @return 확장자 - */ - public String getExtension() { - return Assert.ifEmpty(extension, extension = extension(name)); - } - - /**확장자를 설정한다. - * @param extension 확장자 - */ - public void setExtension(String extension) { - this.extension = extension; - } - - /**파일크기를 반환한다. - * @return 파일크기 - */ - public long getSize() { - return size; - } - - /**파일크기를 설정한다. - * @param size 파일크기 - */ - public void setSize(long size) { - this.size = size; - } - - /**다운로드 횟수를 반환한다. - * @return 다운로드 횟수 - */ - public int getDownloadCount() { - return downloadCount; - } - - /**다운로드 횟수를 설정한다. - * @param downloadCount 다운로드 횟수 - */ - public void setDownloadCount(int downloadCount) { - if (downloadCount < 0) - throw new IllegalArgumentException("downloadCount < 0"); - this.downloadCount = downloadCount; - } - - /**정렬순서를 반환한다. - * @return 정렬순서 - */ - public int getSortOrder() { - return sortOrder; - } - - /**정렬순서를 설정한다. - * @param sortOrder 정렬순서 - */ - public void setSortOrder(int sortOrder) { - this.sortOrder = sortOrder; - } - - /**등록자 ID를 반환한다. - * @return 등록자 ID - */ - public String getCreatedBy() { - return createdBy; - } - - /**등록자 ID를 설정한다. - * @param createdBy 등록자 ID - */ - public void setCreatedBy(String createdBy) { - this.createdBy = createdBy; - } - - /**등록 일시를 반환한다. - * @return 등록 일시 - */ - public Date getCreatedAt() { - return createdAt; - } - - /**등록 일시를 설정한다. - * @param createdAt 등록 일시 - */ - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - - /**사용여부를 반환한다. - * @return 삭제여부 - *
  • Y - 사용 중
  • - *
  • N - 삭제
  • - *
- */ - public String getInUse() { - return Assert.ifEmpty(inUse, "Y"); - } - - /**사용여부를 반환한다. - * @return 사용여부 - *
  • true - 사용 중
  • - *
  • false - 삭제
  • - *
- */ - public boolean inUse() { - return "Y".equals(getInUse()); - } - - /**사용여부를 설정한다. - * @param deleted 사용여부 - *
  • Y - 사용 중
  • - *
  • N - 삭제
  • - *
- */ - public void setInUse(String deleted) { - this.inUse = deleted; - } - - /**FileInfo 경로의 InputStream을 반환한다. - * @return InputStream - */ - public InputStream getInputStream() { - if (input != null) return input; - - if (Assert.isEmpty(path)) return null; - - try { - return new FileInputStream(path); - } catch (Exception e) { - throw Assert.runtimeException(e); - } - } - - /**InputStream을 설정한다. - * @param input InputStream - * @return FileInfo - */ - public FileInfo setInputStream(InputStream input) { - this.input = input; - return this; - } - - /**FileInfo의 경로로 File을 저장한다. - * @return 저장 여부 - *
  • 저장됐으면 true
  • - *
  • 그렇지 않으면 false
  • - *
- */ - public boolean write() { - if (Assert.isEmpty(path)) return false; - - try ( - InputStream in = input; - FileOutputStream out = new FileOutputStream(path); - ) { - FileCopyUtils.copy(in, out); - return true; - } catch (Exception e) { - throw Assert.runtimeException(e); - } - } - - /**FileInfo의 File을 삭제한다. - * @return 삭제 여부 - *
  • 삭제됐으면 true
  • - *
  • 그렇지 않으면 false
  • - *
- */ - public boolean delete() { - if (Assert.isEmpty(path)) return false; - - File file = new File(path); - return file.exists() ? file.delete() : false; - } - - /**InputStream을 비운다. - * @return FileInfo - */ - public FileInfo close() { - try { - if (input != null) - input.close(); - input = null; - return this; - } catch (Exception e) { - throw Assert.runtimeException(e); - } - } - - @Override - public String toString() { - String path = getPath(); - return getName() + (Assert.isEmpty(path) ? "" : " -> " + path); - } +package cokr.xit.base.file; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.springframework.util.FileCopyUtils; + +import cokr.xit.foundation.AbstractComponent; +import cokr.xit.foundation.Assert; + +/**파일 정보 + * @author mjkhan + */ +public class FileInfo { + /**objs를 대시(-)로 연결하여 infoKey를 반환한다. + * @param objs 아이디로 쓰이는 필드값 + * @return infoKey + */ + public static String InfoKey(Object... objs) { + if (Assert.isEmpty(objs)) + return ""; + + return Stream.of(objs) + .filter(obj -> !Assert.isEmpty(obj)) + .map(obj -> obj.toString()) + .collect(Collectors.joining("-")); + } + + /**파일 데이터 홀더 + * @author mjkhan + */ + public static class DataHolder { + private String infoType; + private String infoKey; + private String filename; + private byte[] data; + + /**새 DataHolder를 생성한다. + * @param infoType 관계 정보 유형 + * @param infoKey 관계 정보 키 + * @param filename 파일 이름 + * @param data 파일 데이터 + */ + public DataHolder(String infoType, String infoKey, String filename, byte[] data) { + this.infoType = infoType; + this.infoKey = infoKey; + this.filename = filename; + this.data = data != null ? data : new byte[0]; + } + + /**새 DataHolder를 생성한다. + * @param infoType 관계 정보 유형 + * @param infoKey 관계 정보 키 + * @param filename 파일 이름 + * @param data 파일 데이터 + */ + public DataHolder(String infoType, String infoKey, String filename, String data) { + this(infoType, infoKey, filename, !Assert.isEmpty(data) ? Base64.getDecoder().decode(data.getBytes()) : null); + } + + /**관계 정보 유형을 반환한다. + * @return 관계 정보 유형 + */ + public String getInfoType() { + return infoType; + } + + /**관계 정보 키를 반환한다. + * @return 관계 정보 키 + */ + public String getInfoKey() { + return infoKey; + } + + /**파일이름을 반환한다. + * @return 파일이름 + */ + public String getFilename() { + return filename; + } + + /**데이터를 반환한다. + * @return 데이터 + */ + public byte[] getData() { + return data; + } + + /**데이터의 길이를 반환한다. + * @return 데이터의 길이 + */ + public long length() { + return data != null ? data.length : 0; + } + + /**데이터가 비어있는지 반환한다. + * @return + *
  • 데이터가 비어있으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + public boolean isEmpty() { + return length() < 1; + } + } + + /**FileInfo 생성자 + * @author mjkhan + */ + public static class Factory extends AbstractComponent { + /**주어진 관계 정보 유형과 키, 그리고 파일로 FileInfo 목록을 생성한다. + * @param infoType 관계 정보 유형 + * @param infoKey 관계 정보 키 + * @param files 파일 + * @return FileInfo 목록 + */ + public List createFileInfos(String infoType, String infoKey, Iterable files) { + notEmpty(infoType, "infoType"); + notEmpty(infoKey, "infoKey"); + if (isEmpty(files)) + return Collections.emptyList(); + + ArrayList result = new ArrayList<>(); + for (File file: files) + try { + if (file == null) continue; + + FileInfo info = new FileInfo(); + info.setInfoType(infoType); + info.setInfoKey(infoKey); + String filename = file.getName(); + info.setName(filename); + InputStream input = new FileInputStream(file); + String mimeType = URLConnection.guessContentTypeFromName(filename); + if (isEmpty(mimeType)) + mimeType = URLConnection.guessContentTypeFromStream(input); + info.setMimeType(mimeType); + info.setInputStream(input); + info.setSize(file.length()); + info.setSortOrder(result.size()); + result.add(info); + } catch (Exception e) { + throw runtimeException(e); + } + return result; + } + + /**주어진 관계 정보 유형과 키, 그리고 파일로 FileInfo 목록을 생성한다. + * @param infoType 관계 정보 유형 + * @param infoKey 관계 정보 키 + * @param files 파일 + * @return FileInfo 목록 + */ + public List createFileInfos(String infoType, String infoKey, File... files) { + return createFileInfos(infoType, infoKey, Arrays.asList(files)); + } + + /**주어진 관계 정보 유형과 키, 그리고 파일로 FileInfo을 생성한다. + * @param infoType 관계 정보 유형 + * @param infoKey 관계 정보 키 + * @param file 파일 + * @return FileInfo + */ + public FileInfo create(String infoType, String infoKey, File file) { + List fileInfos = createFileInfos(infoType, infoKey, file); + return !fileInfos.isEmpty() ? fileInfos.get(0) : null; + } + + /**파일 DataHolder에서 FileInfo 목록을 생성한다. + * @return FileInfo 목록 + */ + public List createFileInfos(Iterable dataHolders) { + if (isEmpty(dataHolders)) + return Collections.emptyList(); + + ArrayList result = new ArrayList<>(); + for (DataHolder holder: dataHolders) + try { + if (holder == null) continue; + + FileInfo info = new FileInfo(); + info.setInfoType(holder.infoType); + info.setInfoKey(holder.infoKey); + String filename = holder.getFilename(); + info.setName(filename); + InputStream input = new ByteArrayInputStream(holder.data); + String mimeType = URLConnection.guessContentTypeFromName(filename); + if (isEmpty(mimeType)) + mimeType = URLConnection.guessContentTypeFromStream(input); + info.setMimeType(mimeType); + info.setInputStream(input); + info.setSize(holder.length()); + info.setSortOrder(result.size()); + result.add(info); + } catch (Exception e) { + throw runtimeException(e); + } + return result; + } + + /**파일 DataHolder에서 FileInfo 목록을 생성한다. + * @return FileInfo 목록 + */ + public List createFileInfos(DataHolder... dataHolders) { + return createFileInfos(Arrays.asList(dataHolders)); + } + + /**파일 DataHolder에서 FileInfo를 생성한다. + * @return FileInfo + */ + public FileInfo create(DataHolder dataHolder) { + List list = createFileInfos(dataHolder); + return !list.isEmpty() ? list.get(0) : null; + } + } + + private String + id, + infoType, + infoKey, + subType, + name, + path, + url, + mimeType, + extension, + createdBy, + inUse; + private long size; + private int downloadCount; + private int sortOrder; + private Date createdAt; + private InputStream input; + + /**주어진 경로에서 파일 이름을 추출한다. + * @param path 파일 경로 + * @return 파일 이름 + */ + public static final String name(String path) { + path = path.replace("\\", "/"); + return path.substring(path.lastIndexOf("/") + 1); + } + + /**주어진 경로에서 디렉토리 이름을 추출한다. + * @param path 파일 경로 + * @return 디렉토리 이름 + */ + public static final String dir(String path) { + path = path.replace("\\", "/"); + int pos = path.lastIndexOf("/"); + return pos < 0 ? "" : path.substring(0, pos); + } + + /**주어진 파일 이름에서 확장자를 추출한다. + * @param filename 파일 이름 + * @return 파일 확장자 + */ + public static final String extension(String filename) { + int pos = filename.lastIndexOf("."); + return pos < 0 ? "" : filename.substring(pos + 1); + } + + /**id를 반환한다. + * @return id + */ + public String getId() { + return id; + } + + /**id를 설정한다. + * @param id id + */ + public void setId(String id) { + this.id = id; + } + + /**관계 정보 유형을 반환한다. 프로그램에서 정의 + * @return 관계 정보 유형 + */ + public String getInfoType() { + return infoType; + } + + /**관계 정보 유형을 설정한다. 프로그램에서 정의 + * @param infoType 관계 정보 유형 + * @return 현재 FileInfo + */ + public FileInfo setInfoType(String infoType) { + this.infoType = infoType; + return this; + } + + /**관계 정보 키를 반환한다. 프로그램에서 정의 + * @return 관계 정보 키 + */ + public String getInfoKey() { + return infoKey; + } + + /**관계 정보 키를 설정한다. 프로그램에서 정의 + * @param infoKey 관계 정보 키 + * @return 현재 FileInfo + */ + public FileInfo setInfoKey(String infoKey) { + this.infoKey = infoKey; + return this; + } + + /**관계 정보 기준 하위분류를 반환한다. 프로그램에서 정의 + * @return 관계 정보 기준 하위분류 + */ + public String getSubType() { + return subType; + } + + /**관계 정보 기준 하위분류를 설정한다. 프로그램에서 정의 + * @param subType 관계 정보 기준 하위분류 + */ + public void setSubType(String subType) { + this.subType = subType; + } + + /**파일이름을 반환한다. + * @return 파일이름 + */ + public String getName() { + return name; + } + + /**파일이름을 설정한다. + * @param name 파일이름 + */ + public void setName(String name) { + this.name = name; + } + + /**저장경로를 반환한다. + * @return 저장경로 + */ + public String getPath() { + return path; + } + + /**저장경로를 설정한다. + * @param path 저장경로 + * @return 현재 FileInfo + */ + public FileInfo setPath(String path) { + this.path = path; + return this; + } + + /**url을 반환한다. + * @return url + */ + public String getUrl() { + return url; + } + + /**url을 설정한다. + * @param url url + */ + public void setUrl(String url) { + this.url = url; + } + + /**mime type을 반환한다. + * @return mime type + */ + public String getMimeType() { + return Assert.ifEmpty(mimeType, mimeType = "application/octet-stream"); + } + + /**mime type을 설정한다. + * @param mimeType mime type + */ + public void setMimeType(String mimeType) { + this.mimeType = mimeType; + } + + /**확장자를 반환한다. + * @return 확장자 + */ + public String getExtension() { + return Assert.ifEmpty(extension, extension = extension(name)); + } + + /**확장자를 설정한다. + * @param extension 확장자 + */ + public void setExtension(String extension) { + this.extension = extension; + } + + /**파일크기를 반환한다. + * @return 파일크기 + */ + public long getSize() { + return size; + } + + /**파일크기를 설정한다. + * @param size 파일크기 + */ + public void setSize(long size) { + this.size = size; + } + + /**다운로드 횟수를 반환한다. + * @return 다운로드 횟수 + */ + public int getDownloadCount() { + return downloadCount; + } + + /**다운로드 횟수를 설정한다. + * @param downloadCount 다운로드 횟수 + */ + public void setDownloadCount(int downloadCount) { + if (downloadCount < 0) + throw new IllegalArgumentException("downloadCount < 0"); + this.downloadCount = downloadCount; + } + + /**정렬순서를 반환한다. + * @return 정렬순서 + */ + public int getSortOrder() { + return sortOrder; + } + + /**정렬순서를 설정한다. + * @param sortOrder 정렬순서 + */ + public void setSortOrder(int sortOrder) { + this.sortOrder = sortOrder; + } + + /**등록자 ID를 반환한다. + * @return 등록자 ID + */ + public String getCreatedBy() { + return createdBy; + } + + /**등록자 ID를 설정한다. + * @param createdBy 등록자 ID + */ + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + /**등록 일시를 반환한다. + * @return 등록 일시 + */ + public Date getCreatedAt() { + return createdAt; + } + + /**등록 일시를 설정한다. + * @param createdAt 등록 일시 + */ + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + /**사용여부를 반환한다. + * @return 삭제여부 + *
  • Y - 사용 중
  • + *
  • N - 삭제
  • + *
+ */ + public String getInUse() { + return Assert.ifEmpty(inUse, "Y"); + } + + /**사용여부를 반환한다. + * @return 사용여부 + *
  • true - 사용 중
  • + *
  • false - 삭제
  • + *
+ */ + public boolean inUse() { + return "Y".equals(getInUse()); + } + + /**사용여부를 설정한다. + * @param deleted 사용여부 + *
  • Y - 사용 중
  • + *
  • N - 삭제
  • + *
+ */ + public void setInUse(String deleted) { + this.inUse = deleted; + } + + /**FileInfo 경로의 InputStream을 반환한다. + * @return InputStream + */ + public InputStream getInputStream() { + if (input != null) return input; + + if (Assert.isEmpty(path)) return null; + + try { + return new FileInputStream(path); + } catch (Exception e) { + throw Assert.runtimeException(e); + } + } + + /**InputStream을 설정한다. + * @param input InputStream + * @return FileInfo + */ + public FileInfo setInputStream(InputStream input) { + this.input = input; + return this; + } + + /**FileInfo의 경로로 File을 저장한다. + * @return 저장 여부 + *
  • 저장됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + public boolean write() { + if (Assert.isEmpty(path)) return false; + + try ( + InputStream in = input; + FileOutputStream out = new FileOutputStream(path); + ) { + FileCopyUtils.copy(in, out); + return true; + } catch (Exception e) { + throw Assert.runtimeException(e); + } + } + + /**FileInfo의 File을 삭제한다. + * @return 삭제 여부 + *
  • 삭제됐으면 true
  • + *
  • 그렇지 않으면 false
  • + *
+ */ + public boolean delete() { + if (Assert.isEmpty(path)) return false; + + File file = new File(path); + return file.exists() ? file.delete() : false; + } + + /**InputStream을 비운다. + * @return FileInfo + */ + public FileInfo close() { + try { + if (input != null) + input.close(); + input = null; + return this; + } catch (Exception e) { + throw Assert.runtimeException(e); + } + } + + @Override + public String toString() { + String path = getPath(); + return getName() + (Assert.isEmpty(path) ? "" : " -> " + path); + } } \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/XLS.java b/src/main/java/cokr/xit/base/file/XLS.java index 98df954..de0d4e1 100644 --- a/src/main/java/cokr/xit/base/file/XLS.java +++ b/src/main/java/cokr/xit/base/file/XLS.java @@ -1,229 +1,229 @@ -package cokr.xit.base.file; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.util.Date; -import java.util.function.Consumer; - -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.xssf.usermodel.XSSFSheet; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.springframework.util.ResourceUtils; - -import cokr.xit.foundation.AbstractComponent; -import cokr.xit.foundation.data.StringMap; - -/**엑셀 스프레드시트의 읽기나 쓰기를 돕는 유틸리티 - * @author mjkhan - */ -public class XLS extends AbstractComponent { - /**엑셀 파일(*.xlsx)의 mime type */ - public static final String MIME_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; - - /**워크시트에 데이터셋의 각 요소(row)의 값을 쓰기 위한 Functional interface - * @author mjkhan - * @param 데이터셋의 요소(row) 유형 - */ - @FunctionalInterface - public static interface Writer { - /**워크시트에 데이터셋의 각 요소(row)의 값을 쓴다. - * @param sheet 워크시트 - * @param element 데이터셋의 각 요소(row) - * @param index 데이터셋의 요소의 인덱스. 0부터 시작 - */ - void write(XSSFSheet sheet, E element, int index); - } - - /**셀의 값을 읽어 반환한다. - * @param cell 셀 - * @return 셀의 값 - */ - public static Object getValue(Cell cell) { - switch (cell.getCellType()) { - case STRING: return cell.getStringCellValue(); - case NUMERIC: return cell.getNumericCellValue(); - case BOOLEAN: return cell.getBooleanCellValue(); - case BLANK: return ""; - default: return null; - } - } - - /**값을 셀에 설정한다. - * @param cell Cell - * @param value 값 - */ - public static void setValue(Cell cell, Object value) { - if (isEmpty(value)) { - cell.setCellValue(""); - return; - } - - if (value instanceof String) { - cell.setCellValue((String)value); - } else if (value instanceof Number) { - Number number = (Number)value; - cell.setCellValue(number.doubleValue()); - } else if (value instanceof Date) { - cell.setCellValue((Date)value); - } else if (value instanceof Boolean) { - Boolean b = (Boolean)value; - cell.setCellValue(b.booleanValue()); - } else - throw new IllegalArgumentException(value.getClass().getName() + ": " + value); - } - - private StringMap styles; - - public void setValue(String key, Cell cell, Object value) { - setValue(cell, value); - - if (styles == null) - styles = new StringMap<>(); - - CellStyle style = styles.get(key); - if (style == null) - styles.put(key, style = cell.getCellStyle()); - - cell.setCellStyle(style); - } - - /**셀의 값을 읽어 String으로 반환한다. - * @param cell 셀 - * @return 셀의 문자열값 - */ - public static String getString(Cell cell) { - Object value = getValue(cell); - return isEmpty(value) ? "" - : value instanceof String ? (String)value - : value.toString(); - } - - /**셀의 값을 읽어 Number로 반환한다. - * @param cell 셀 - * @return - *
  • 셀의 숫자값
  • - *
  • 값이 비어있으면 0
  • - *
- */ - public static Number getNumber(Cell cell) { - Object value = getValue(cell); - return isEmpty(value) ? 0 - : value instanceof Number ? (Number)value - : value instanceof String ? Double.parseDouble((String)value) - : 0; - } - - /**셀의 값을 읽어 Boolean으로 반환한다. - * @param cell 셀 - * @return - *
  • 셀의 Boolean값
  • - *
  • 값이 비어있으면 false
  • - *
- */ - public static Boolean getBoolean(Cell cell) { - Object value = getValue(cell); - return isEmpty(value) ? false - : value instanceof Boolean ? (Boolean)value - : Boolean.valueOf(value.toString()); - } - - private XSSFWorkbook workbook; - - /**FileInputStream에서 엑셀 스프레드시트를 읽어들인다. - * @param input FileInputStream - * @return XLS - */ - public XLS load(FileInputStream input) { - try { - workbook = new XSSFWorkbook(input); - return this; - } catch (Exception e) { - throw applicationException(e); - } - } - - /**지정한 경로의 파일에서 엑셀 스프레드시트를 읽어들인다. - * @param path 파일 경로. classpath:..., 또는 file:... - * @return XLS - */ - public XLS load(String path) { - try (FileInputStream input = new FileInputStream(ResourceUtils.getFile(path))) { - return load(input); - } catch (Exception e) { - throw applicationException(e); - } - } - - /**엑셀 스프레드시트의 워크북을 반환한다. - * @return 엑셀 스프레드시트의 워크북 - */ - public XSSFWorkbook getWorkbook() { - return ifEmpty(workbook, () -> workbook = new XSSFWorkbook()); - } - - /**엑셀 스프레드시트에서 지정하는 인덱스의 워크시트를 반환한다. - * @param index 워크시트 인덱스. 0부터 시작 - * @return 엑셀 스프레드시트 워크시트 - */ - public XSSFSheet getWorksheet(int index) { - int count = getWorkbook().getNumberOfSheets(); - return index < count ? workbook.getSheetAt(index) : workbook.createSheet(); - } - - /**지정하는 인덱스의 워크시트를 읽는다. - * @param sheetIndex 워크시트 인덱스. 0부터 시작 - * @param reader 워크시트의 각 row의 셀값을 읽어 작업을 수행하는 Function - * @return XLS - */ - public XLS read(int sheetIndex, Consumer reader) { - if (reader == null) return this; - - XSSFSheet worksheet = getWorksheet(sheetIndex); - for (Row row: worksheet) { - reader.accept(row); - } - return this; - } - - /**지정하는 인덱스의 워크시트에 dataset의 각 row의 값들을 쓴다. - * @param sheetIndex 워크시트 인덱스. 0부터 시작 - * @param dataset 데이터셋 - * @param writer dataset의 각 row의 값들을 워크시트에 쓰는 Function - * @return XLS - */ - public > XLS write(int sheetIndex, T dataset, Writer writer) { - XSSFSheet worksheet = getWorksheet(sheetIndex); - if (!isEmpty(dataset)) { - int index = -1; - for (E e: dataset) { - ++index; - writer.write(worksheet, e, index); - } - } - if (styles != null) { - styles.clear(); - styles = null; - } - - return this; - } - - /**지정하는 경로로 엑셀 스프레드시트를 저장하고 해당 파일을 반환한다. - * @param path 저장할 파일 경로 - * @return 스프레드시트 파일 - */ - public File write(String path) { - if (workbook == null) - throw new NullPointerException("No workbook to write"); - - try (FileOutputStream out = new FileOutputStream(path);) { - workbook.write(out); - return new File(path); - } catch (Exception e) { - throw applicationException(e); - } - } +package cokr.xit.base.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.Date; +import java.util.function.Consumer; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.util.ResourceUtils; + +import cokr.xit.foundation.AbstractComponent; +import cokr.xit.foundation.data.StringMap; + +/**엑셀 스프레드시트의 읽기나 쓰기를 돕는 유틸리티 + * @author mjkhan + */ +public class XLS extends AbstractComponent { + /**엑셀 파일(*.xlsx)의 mime type */ + public static final String MIME_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; + + /**워크시트에 데이터셋의 각 요소(row)의 값을 쓰기 위한 Functional interface + * @author mjkhan + * @param 데이터셋의 요소(row) 유형 + */ + @FunctionalInterface + public static interface Writer { + /**워크시트에 데이터셋의 각 요소(row)의 값을 쓴다. + * @param sheet 워크시트 + * @param element 데이터셋의 각 요소(row) + * @param index 데이터셋의 요소의 인덱스. 0부터 시작 + */ + void write(XSSFSheet sheet, E element, int index); + } + + /**셀의 값을 읽어 반환한다. + * @param cell 셀 + * @return 셀의 값 + */ + public static Object getValue(Cell cell) { + switch (cell.getCellType()) { + case STRING: return cell.getStringCellValue(); + case NUMERIC: return cell.getNumericCellValue(); + case BOOLEAN: return cell.getBooleanCellValue(); + case BLANK: return ""; + default: return null; + } + } + + /**값을 셀에 설정한다. + * @param cell Cell + * @param value 값 + */ + public static void setValue(Cell cell, Object value) { + if (isEmpty(value)) { + cell.setCellValue(""); + return; + } + + if (value instanceof String) { + cell.setCellValue((String)value); + } else if (value instanceof Number) { + Number number = (Number)value; + cell.setCellValue(number.doubleValue()); + } else if (value instanceof Date) { + cell.setCellValue((Date)value); + } else if (value instanceof Boolean) { + Boolean b = (Boolean)value; + cell.setCellValue(b.booleanValue()); + } else + throw new IllegalArgumentException(value.getClass().getName() + ": " + value); + } + + private StringMap styles; + + public void setValue(String key, Cell cell, Object value) { + setValue(cell, value); + + if (styles == null) + styles = new StringMap<>(); + + CellStyle style = styles.get(key); + if (style == null) + styles.put(key, style = cell.getCellStyle()); + + cell.setCellStyle(style); + } + + /**셀의 값을 읽어 String으로 반환한다. + * @param cell 셀 + * @return 셀의 문자열값 + */ + public static String getString(Cell cell) { + Object value = getValue(cell); + return isEmpty(value) ? "" + : value instanceof String ? (String)value + : value.toString(); + } + + /**셀의 값을 읽어 Number로 반환한다. + * @param cell 셀 + * @return + *
  • 셀의 숫자값
  • + *
  • 값이 비어있으면 0
  • + *
+ */ + public static Number getNumber(Cell cell) { + Object value = getValue(cell); + return isEmpty(value) ? 0 + : value instanceof Number ? (Number)value + : value instanceof String ? Double.parseDouble((String)value) + : 0; + } + + /**셀의 값을 읽어 Boolean으로 반환한다. + * @param cell 셀 + * @return + *
  • 셀의 Boolean값
  • + *
  • 값이 비어있으면 false
  • + *
+ */ + public static Boolean getBoolean(Cell cell) { + Object value = getValue(cell); + return isEmpty(value) ? false + : value instanceof Boolean ? (Boolean)value + : Boolean.valueOf(value.toString()); + } + + private XSSFWorkbook workbook; + + /**FileInputStream에서 엑셀 스프레드시트를 읽어들인다. + * @param input FileInputStream + * @return XLS + */ + public XLS load(FileInputStream input) { + try { + workbook = new XSSFWorkbook(input); + return this; + } catch (Exception e) { + throw applicationException(e); + } + } + + /**지정한 경로의 파일에서 엑셀 스프레드시트를 읽어들인다. + * @param path 파일 경로. classpath:..., 또는 file:... + * @return XLS + */ + public XLS load(String path) { + try (FileInputStream input = new FileInputStream(ResourceUtils.getFile(path))) { + return load(input); + } catch (Exception e) { + throw applicationException(e); + } + } + + /**엑셀 스프레드시트의 워크북을 반환한다. + * @return 엑셀 스프레드시트의 워크북 + */ + public XSSFWorkbook getWorkbook() { + return ifEmpty(workbook, () -> workbook = new XSSFWorkbook()); + } + + /**엑셀 스프레드시트에서 지정하는 인덱스의 워크시트를 반환한다. + * @param index 워크시트 인덱스. 0부터 시작 + * @return 엑셀 스프레드시트 워크시트 + */ + public XSSFSheet getWorksheet(int index) { + int count = getWorkbook().getNumberOfSheets(); + return index < count ? workbook.getSheetAt(index) : workbook.createSheet(); + } + + /**지정하는 인덱스의 워크시트를 읽는다. + * @param sheetIndex 워크시트 인덱스. 0부터 시작 + * @param reader 워크시트의 각 row의 셀값을 읽어 작업을 수행하는 Function + * @return XLS + */ + public XLS read(int sheetIndex, Consumer reader) { + if (reader == null) return this; + + XSSFSheet worksheet = getWorksheet(sheetIndex); + for (Row row: worksheet) { + reader.accept(row); + } + return this; + } + + /**지정하는 인덱스의 워크시트에 dataset의 각 row의 값들을 쓴다. + * @param sheetIndex 워크시트 인덱스. 0부터 시작 + * @param dataset 데이터셋 + * @param writer dataset의 각 row의 값들을 워크시트에 쓰는 Function + * @return XLS + */ + public > XLS write(int sheetIndex, T dataset, Writer writer) { + XSSFSheet worksheet = getWorksheet(sheetIndex); + if (!isEmpty(dataset)) { + int index = -1; + for (E e: dataset) { + ++index; + writer.write(worksheet, e, index); + } + } + if (styles != null) { + styles.clear(); + styles = null; + } + + return this; + } + + /**지정하는 경로로 엑셀 스프레드시트를 저장하고 해당 파일을 반환한다. + * @param path 저장할 파일 경로 + * @return 스프레드시트 파일 + */ + public File write(String path) { + if (workbook == null) + throw new NullPointerException("No workbook to write"); + + try (FileOutputStream out = new FileOutputStream(path);) { + workbook.write(out); + return new File(path); + } catch (Exception e) { + throw applicationException(e); + } + } } \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/dao/FileMapper.java b/src/main/java/cokr/xit/base/file/dao/FileMapper.java index ef590a6..e73a13d 100644 --- a/src/main/java/cokr/xit/base/file/dao/FileMapper.java +++ b/src/main/java/cokr/xit/base/file/dao/FileMapper.java @@ -1,211 +1,211 @@ -package cokr.xit.base.file.dao; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import org.egovframe.rte.psl.dataaccess.mapper.Mapper; - -import cokr.xit.base.file.FileInfo; -import cokr.xit.base.file.service.FileQuery; -import cokr.xit.foundation.component.AbstractMapper; -import cokr.xit.foundation.data.DataObject; - -/**파일 정보 DAO - *
  • FileMapper는 파일 정보에 접근하기 위해 file-mapper.xml 파일을 사용한다.
  • - *
  • 이 파일에는 파일 경로에 대한 설정이 SQL문으로 설정되어 있다.
  • - *
- *

파일 저장 경로의 설정 - *

파일 저장 경로는 다음 SQL문으로 설정한다. - *

{@code 
- *  SELECT INF_TYPE
- *     , CONCAT('D://workspace/xit/base/files/', DIR, TO_CHAR(CURRENT_DATE, 'YYYY/MM/DD/')) DIR
- *  FROM (
- *       SELECT '00' INF_TYPE, 'attachment/' DIR UNION
- *       SELECT '10' INF_TYPE, 'document/' DIR UNION
- *       SELECT '20' INF_TYPE, 'article/' DIR
- *       ) FILE_DIRS
- * }
- * 위 문장은 - *
  • 애플리케이션의 파일을 저장하는 루트 디렉토리를 'D://workspace/xit/base/files/'로 지정한다. - *
  • 정보 유형 '00'과 관계있는 파일은 '루트 디렉토리/attachment/YYYY/MM/DD' - *
  • 정보 유형 '01'과 관계있는 파일은 '루트 디렉토리/document/YYYY/MM/DD' - *
  • 정보 유형 '02'과 관계있는 파일은 '루트 디렉토리/article/YYYY/MM/DD' - *
- *

디렉토리에 각각 저장하도록 하고 있다.
- * 애플리케이션은 요구사항에 따라 이 문장을 수정하여 파일 저장 디렉토리를 지정한다. - *

파일 URL의 설정 - *

파일 URL은 다음 SQL문으로 추출한다. - *

{@code 
- * SELECT A.*, REPLACE(FILE_PATH, 'D://workspace/xit/base', '') URL
- *   FROM TBL_FILE A
- *   ...
- * }
- * 위 문장은 - *
  • 저장된 파일 정보의 FILE_PATH 컬럼의 값에서 'D://workspace/xit/base' 부분을 제거하여 파일의 URL로 추출하도록 하고 있다.
  • - *
  • 애플리케이션은 요구사항에 따라 이 문장을 수정하여 파일의 URL로 사용할 수 있다.
  • - *
- * @author mjkhan - */ -@Mapper("fileMapper") -public interface FileMapper extends AbstractMapper { - /**주어진 관계 정보의 파일 정보 목록을 반환한다.
- * 관계 정보 키가 없으면 관계 정보 유형의 모든 파일 정보 목록을 반환한다. - * @param req 조회 조건 - *
 {
-	 *     "infoType": 관계 정보 유형
-	 *     "infoKeys": 관계 정보 키
-	 * }
- * @return 파일 정보 목록 - */ - List getFileList(FileQuery req); - - /**주어진 관계 정보의 파일 정보들을 반환한다.
- * 관계 정보 키가 없으면 관계 정보 유형의 모든 파일 정보들을 반환한다. - * @param req 조회 조건 - *
 {
-	 *     "infoType": 관계 정보 유형
-	 *     "infoKeys": 관계 정보 키
-	 * }
- * @return 파일 정보 - */ - List getFilesOf(FileQuery req); - - /**주어진 아이디의 파일 정보들을 반환한다. - * @param fileIDs 파일 정보 아이디 - * @return 파일 정보 - */ - default List getFiles(String... fileIDs) { - return getFilesOf( - new FileQuery() - .setFileIDs(fileIDs) - .setOrderBy("FILE_ID") - ); - } - - /**주어진 아이디의 파일 정보를 반환한다. - * @param fileID 파일 정보 아이디 - * @return 파일 정보 - */ - default FileInfo getFile(String fileID) { - List files = getFiles(fileID); - return !files.isEmpty() ? files.get(0) : null; - } - - /**파일 정보를 등록한다. - * @param params 파라미터 - *
 {
-	 *     "file": 파일 정보
-	 * }
- * @return 저장된 정보수 - */ - int insertFile(Map params); - - /**파일 정보를 등록한다. - * @param files 파일 정보 - * @return 저장된 정보수 - */ - default int create(List files) { - if (isEmpty(files)) return 0; - - DataObject params = params().set("currentUser", currentUser()); - int affected = 0; - for (FileInfo file:files) - affected += insertFile(params.set("file", file)); - - return affected; - } - - /**주어진 파일 정보 아이디의 순서대로 정렬 순서를 변경한다. - * @param params 파라미터 - *
 {
-	 *     "fileIDs": 파일 정보 아이디
-	 * }
- * @return 저장된 정보수 - */ - int reorder(Map params); - - /**주어진 파일 정보 아이디의 순서대로 정렬 순서를 변경한다. - * @param fileIDs 파일 정보 아이디 - * @return 저장된 정보수 - */ - default int reorder(String... fileIDs) { - if (isEmpty(fileIDs)) return 0; - - return reorder(params().set("fileIDs", fileIDs)); - } - - /**주어진 아이디의 파일 정보들의 다운로드 횟수를 증가시킨다. - * @param params 파라미터 - *
 {
-	 *     "fileIDs": 파일 정보 아이디
-	 * }
- * @return 저장된 정보수 - */ - int updateDownloadCount(Map params); - - /**주어진 아이디의 파일 정보들의 다운로드 횟수를 증가시킨다. - * @param fileIDs 파일 정보 아이디 - * @return 저장된 정보수 - */ - default int updateDownloadCount(String... fileIDs) { - if (isEmpty(fileIDs)) return 0; - - return updateDownloadCount(params().set("fileIDs", fileIDs)); - } - - /**주어진 관계 정보의 파일 정보를 제거한다.
- * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보를 제거한다. - * @param params - *
 {
-	 *     "infoType": 관계 정보 유형
-	 *     "infoKeys": 관계 정보 키
-	 * }
- * @return 저장된 정보수 - */ - int removeFiles(Map params); - - /**주어진 관계 정보의 파일 정보를 제거한다.
- * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보를 제거한다. - * @param infoType 관계 정보 유형 - * @param infoKeys 관계 정보 키 - * @return 저장된 정보수 - */ - default int remove(String infoType, String... infoKeys) { - return removeFiles( - params() - .set("infoType", infoType) - .set("infoKeys", ifEmpty(infoKeys, () -> null)) - ); - } - - /**주어진 아이디의 파일 정보를 제거한다. - * @param fileIDs 파일 정보 아이디 - * @return 저장된 정보수 - */ - default int remove(String... fileIDs) { - return removeFiles( - params().set("fileIDs", ifEmpty(fileIDs, () -> null)) - ); - } - - /**주어진 아이디의 파일 정보를 삭제한다. - * @param params 파라미터 - *
 {
-	 *     "fileIDs": 파일 정보 아이디
-	 * }
- * @return 저장된 정보수 - */ - int deleteFiles(Map params); - - /**주어진 파일 정보를 삭제한다. - * @param files 파일 정보 - * @return 저장된 정보수 - */ - default int delete(List files) { - if (isEmpty(files)) return 0; - - String[] fileIDs = files.stream().map(FileInfo::getId).collect(Collectors.toList()).toArray(new String[files.size()]); - return deleteFiles(params().set("fileIDs", ifEmpty(fileIDs, () -> null))); - } +package cokr.xit.base.file.dao; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.egovframe.rte.psl.dataaccess.mapper.Mapper; + +import cokr.xit.base.file.FileInfo; +import cokr.xit.base.file.service.FileQuery; +import cokr.xit.foundation.component.AbstractMapper; +import cokr.xit.foundation.data.DataObject; + +/**파일 정보 DAO + *
  • FileMapper는 파일 정보에 접근하기 위해 file-mapper.xml 파일을 사용한다.
  • + *
  • 이 파일에는 파일 경로에 대한 설정이 SQL문으로 설정되어 있다.
  • + *
+ *

파일 저장 경로의 설정 + *

파일 저장 경로는 다음 SQL문으로 설정한다. + *

{@code 
+ *  SELECT INF_TYPE
+ *     , CONCAT('D://workspace/xit/base/files/', DIR, TO_CHAR(CURRENT_DATE, 'YYYY/MM/DD/')) DIR
+ *  FROM (
+ *       SELECT '00' INF_TYPE, 'attachment/' DIR UNION
+ *       SELECT '10' INF_TYPE, 'document/' DIR UNION
+ *       SELECT '20' INF_TYPE, 'article/' DIR
+ *       ) FILE_DIRS
+ * }
+ * 위 문장은 + *
  • 애플리케이션의 파일을 저장하는 루트 디렉토리를 'D://workspace/xit/base/files/'로 지정한다. + *
  • 정보 유형 '00'과 관계있는 파일은 '루트 디렉토리/attachment/YYYY/MM/DD' + *
  • 정보 유형 '01'과 관계있는 파일은 '루트 디렉토리/document/YYYY/MM/DD' + *
  • 정보 유형 '02'과 관계있는 파일은 '루트 디렉토리/article/YYYY/MM/DD' + *
+ *

디렉토리에 각각 저장하도록 하고 있다.
+ * 애플리케이션은 요구사항에 따라 이 문장을 수정하여 파일 저장 디렉토리를 지정한다. + *

파일 URL의 설정 + *

파일 URL은 다음 SQL문으로 추출한다. + *

{@code 
+ * SELECT A.*, REPLACE(FILE_PATH, 'D://workspace/xit/base', '') URL
+ *   FROM TBL_FILE A
+ *   ...
+ * }
+ * 위 문장은 + *
  • 저장된 파일 정보의 FILE_PATH 컬럼의 값에서 'D://workspace/xit/base' 부분을 제거하여 파일의 URL로 추출하도록 하고 있다.
  • + *
  • 애플리케이션은 요구사항에 따라 이 문장을 수정하여 파일의 URL로 사용할 수 있다.
  • + *
+ * @author mjkhan + */ +@Mapper("fileMapper") +public interface FileMapper extends AbstractMapper { + /**주어진 관계 정보의 파일 정보 목록을 반환한다.
+ * 관계 정보 키가 없으면 관계 정보 유형의 모든 파일 정보 목록을 반환한다. + * @param req 조회 조건 + *
 {
+	 *     "infoType": 관계 정보 유형
+	 *     "infoKeys": 관계 정보 키
+	 * }
+ * @return 파일 정보 목록 + */ + List getFileList(FileQuery req); + + /**주어진 관계 정보의 파일 정보들을 반환한다.
+ * 관계 정보 키가 없으면 관계 정보 유형의 모든 파일 정보들을 반환한다. + * @param req 조회 조건 + *
 {
+	 *     "infoType": 관계 정보 유형
+	 *     "infoKeys": 관계 정보 키
+	 * }
+ * @return 파일 정보 + */ + List getFilesOf(FileQuery req); + + /**주어진 아이디의 파일 정보들을 반환한다. + * @param fileIDs 파일 정보 아이디 + * @return 파일 정보 + */ + default List getFiles(String... fileIDs) { + return getFilesOf( + new FileQuery() + .setFileIDs(fileIDs) + .setOrderBy("FILE_ID") + ); + } + + /**주어진 아이디의 파일 정보를 반환한다. + * @param fileID 파일 정보 아이디 + * @return 파일 정보 + */ + default FileInfo getFile(String fileID) { + List files = getFiles(fileID); + return !files.isEmpty() ? files.get(0) : null; + } + + /**파일 정보를 등록한다. + * @param params 파라미터 + *
 {
+	 *     "file": 파일 정보
+	 * }
+ * @return 저장된 정보수 + */ + int insertFile(Map params); + + /**파일 정보를 등록한다. + * @param files 파일 정보 + * @return 저장된 정보수 + */ + default int create(List files) { + if (isEmpty(files)) return 0; + + DataObject params = params().set("currentUser", currentUser()); + int affected = 0; + for (FileInfo file:files) + affected += insertFile(params.set("file", file)); + + return affected; + } + + /**주어진 파일 정보 아이디의 순서대로 정렬 순서를 변경한다. + * @param params 파라미터 + *
 {
+	 *     "fileIDs": 파일 정보 아이디
+	 * }
+ * @return 저장된 정보수 + */ + int reorder(Map params); + + /**주어진 파일 정보 아이디의 순서대로 정렬 순서를 변경한다. + * @param fileIDs 파일 정보 아이디 + * @return 저장된 정보수 + */ + default int reorder(String... fileIDs) { + if (isEmpty(fileIDs)) return 0; + + return reorder(params().set("fileIDs", fileIDs)); + } + + /**주어진 아이디의 파일 정보들의 다운로드 횟수를 증가시킨다. + * @param params 파라미터 + *
 {
+	 *     "fileIDs": 파일 정보 아이디
+	 * }
+ * @return 저장된 정보수 + */ + int updateDownloadCount(Map params); + + /**주어진 아이디의 파일 정보들의 다운로드 횟수를 증가시킨다. + * @param fileIDs 파일 정보 아이디 + * @return 저장된 정보수 + */ + default int updateDownloadCount(String... fileIDs) { + if (isEmpty(fileIDs)) return 0; + + return updateDownloadCount(params().set("fileIDs", fileIDs)); + } + + /**주어진 관계 정보의 파일 정보를 제거한다.
+ * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보를 제거한다. + * @param params + *
 {
+	 *     "infoType": 관계 정보 유형
+	 *     "infoKeys": 관계 정보 키
+	 * }
+ * @return 저장된 정보수 + */ + int removeFiles(Map params); + + /**주어진 관계 정보의 파일 정보를 제거한다.
+ * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보를 제거한다. + * @param infoType 관계 정보 유형 + * @param infoKeys 관계 정보 키 + * @return 저장된 정보수 + */ + default int remove(String infoType, String... infoKeys) { + return removeFiles( + params() + .set("infoType", infoType) + .set("infoKeys", ifEmpty(infoKeys, () -> null)) + ); + } + + /**주어진 아이디의 파일 정보를 제거한다. + * @param fileIDs 파일 정보 아이디 + * @return 저장된 정보수 + */ + default int remove(String... fileIDs) { + return removeFiles( + params().set("fileIDs", ifEmpty(fileIDs, () -> null)) + ); + } + + /**주어진 아이디의 파일 정보를 삭제한다. + * @param params 파라미터 + *
 {
+	 *     "fileIDs": 파일 정보 아이디
+	 * }
+ * @return 저장된 정보수 + */ + int deleteFiles(Map params); + + /**주어진 파일 정보를 삭제한다. + * @param files 파일 정보 + * @return 저장된 정보수 + */ + default int delete(List files) { + if (isEmpty(files)) return 0; + + String[] fileIDs = files.stream().map(FileInfo::getId).collect(Collectors.toList()).toArray(new String[files.size()]); + return deleteFiles(params().set("fileIDs", ifEmpty(fileIDs, () -> null))); + } } \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/dao/package-info.java b/src/main/java/cokr/xit/base/file/dao/package-info.java index 569b5aa..b2e1ff9 100644 --- a/src/main/java/cokr/xit/base/file/dao/package-info.java +++ b/src/main/java/cokr/xit/base/file/dao/package-info.java @@ -1,3 +1,3 @@ -/**파일 정보 테이블 접근 객체 - */ +/**파일 정보 테이블 접근 객체 + */ package cokr.xit.base.file.dao; \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/package-info.java b/src/main/java/cokr/xit/base/file/package-info.java index c27052c..d0403ef 100644 --- a/src/main/java/cokr/xit/base/file/package-info.java +++ b/src/main/java/cokr/xit/base/file/package-info.java @@ -1,17 +1,17 @@ -/**파일 정보 관리 모듈. - *
  • 애플리케이션이 관리하는 파일은 여러 경로로 유입된다.
  • - *
  • 파일들은 여러 유형의 정보와 관계있다. 정보와 관계없는 파일은 없다.
  • - *
  • 정보와 파일 사이의 관계를 명시하려면, 파일과 관계있는 정보의 유형과 해당 정보의 아이디가 있어야 한다.
  • - *
  • 이 때 관계 정보의 유형을 infoType이라 하고, 애플리케이션 개발자가 정의한다.
    - * 예) 사용자 프로필의 이미지 파일의 infoType은 "00", 단속 정보의 이미지 파일의 infoType은 "10"
  • - *
  • 관계 정보의 아이디는 infoKey라고 한다.
    - * 관계 정보의 아이디가 여러 개의 필드값으로 되어있으면, 이들을 대시(-)로 연결하여 infoKey로 사용한다.
  • - *
- *

애플리케이션의 파일 정보는 관계 정보의 infoType, infoKey + 파일 자체의 메타 정보로 이루어지며
- * 데이타베이스의 TBL_FILE 테이블에 저장하여 관리한다. - *

파일 저장 디렉토리의 설정은 {@link cokr.xit.base.file.dao.FileMapper FileMapper} 문서를 참고한다. - *

  • 배포 모듈: xit-file-yy.mm.dd.jar
  • - *
  • 의존 모듈: {@link cokr.xit.foundation xit-foundation-yy.mm.dd.jar}
  • - *
- */ +/**파일 정보 관리 모듈. + *
  • 애플리케이션이 관리하는 파일은 여러 경로로 유입된다.
  • + *
  • 파일들은 여러 유형의 정보와 관계있다. 정보와 관계없는 파일은 없다.
  • + *
  • 정보와 파일 사이의 관계를 명시하려면, 파일과 관계있는 정보의 유형과 해당 정보의 아이디가 있어야 한다.
  • + *
  • 이 때 관계 정보의 유형을 infoType이라 하고, 애플리케이션 개발자가 정의한다.
    + * 예) 사용자 프로필의 이미지 파일의 infoType은 "00", 단속 정보의 이미지 파일의 infoType은 "10"
  • + *
  • 관계 정보의 아이디는 infoKey라고 한다.
    + * 관계 정보의 아이디가 여러 개의 필드값으로 되어있으면, 이들을 대시(-)로 연결하여 infoKey로 사용한다.
  • + *
+ *

애플리케이션의 파일 정보는 관계 정보의 infoType, infoKey + 파일 자체의 메타 정보로 이루어지며
+ * 데이타베이스의 TBL_FILE 테이블에 저장하여 관리한다. + *

파일 저장 디렉토리의 설정은 {@link cokr.xit.base.file.dao.FileMapper FileMapper} 문서를 참고한다. + *

  • 배포 모듈: xit-file-yy.mm.dd.jar
  • + *
  • 의존 모듈: {@link cokr.xit.foundation xit-foundation-yy.mm.dd.jar}
  • + *
+ */ package cokr.xit.base.file; \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/service/FileQuery.java b/src/main/java/cokr/xit/base/file/service/FileQuery.java index 2f4c748..968946a 100644 --- a/src/main/java/cokr/xit/base/file/service/FileQuery.java +++ b/src/main/java/cokr/xit/base/file/service/FileQuery.java @@ -1,60 +1,60 @@ -package cokr.xit.base.file.service; - -import cokr.xit.foundation.component.QueryRequest; - -public class FileQuery extends QueryRequest { - private static final long serialVersionUID = 1L; - private String infoType; - private String[] infoKeys; - private String[] fileIDs; - - /**관계정보 유형을 반환한다. - * @return 관계정보 유형 - */ - public String getInfoType() { - return infoType; - } - - /**관계정보 유형을 설정한다. - * @param FileQuery - * @param infoType 관계정보 유형 - * @return FileQuery - */ - public T setInfoType(String infoType) { - this.infoType = infoType; - return self(); - } - - /**관계정보 키를 반환한다. - * @return 관계정보 키 - */ - public String[] getInfoKeys() { - return ifEmpty(infoKeys, () -> null); - } - - /**관계정보 키를 설정한다. - * @param FileQuery - * @param infoKeys 관계정보 키 - * @return FileQuery - */ - public T setInfoKeys(String... infoKeys) { - this.infoKeys = infoKeys; - return self(); - } - - /**파일 아이디를 반환한다. - * @return 파일 아이디 - */ - public String[] getFileIDs() { - return ifEmpty(fileIDs, () -> null); - } - /**파일 아이디를 설정한다. - * @param FileQuery - * @param fileIDs 파일 아이디 - * @return FileQuery - */ - public T setFileIDs(String... fileIDs) { - this.fileIDs = fileIDs; - return self(); - } +package cokr.xit.base.file.service; + +import cokr.xit.foundation.component.QueryRequest; + +public class FileQuery extends QueryRequest { + private static final long serialVersionUID = 1L; + private String infoType; + private String[] infoKeys; + private String[] fileIDs; + + /**관계정보 유형을 반환한다. + * @return 관계정보 유형 + */ + public String getInfoType() { + return infoType; + } + + /**관계정보 유형을 설정한다. + * @param FileQuery + * @param infoType 관계정보 유형 + * @return FileQuery + */ + public T setInfoType(String infoType) { + this.infoType = infoType; + return self(); + } + + /**관계정보 키를 반환한다. + * @return 관계정보 키 + */ + public String[] getInfoKeys() { + return ifEmpty(infoKeys, () -> null); + } + + /**관계정보 키를 설정한다. + * @param FileQuery + * @param infoKeys 관계정보 키 + * @return FileQuery + */ + public T setInfoKeys(String... infoKeys) { + this.infoKeys = infoKeys; + return self(); + } + + /**파일 아이디를 반환한다. + * @return 파일 아이디 + */ + public String[] getFileIDs() { + return ifEmpty(fileIDs, () -> null); + } + /**파일 아이디를 설정한다. + * @param FileQuery + * @param fileIDs 파일 아이디 + * @return FileQuery + */ + public T setFileIDs(String... fileIDs) { + this.fileIDs = fileIDs; + return self(); + } } \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/service/FileService.java b/src/main/java/cokr/xit/base/file/service/FileService.java index a30b613..0c359d7 100644 --- a/src/main/java/cokr/xit/base/file/service/FileService.java +++ b/src/main/java/cokr/xit/base/file/service/FileService.java @@ -1,112 +1,112 @@ -package cokr.xit.base.file.service; - -import java.util.Arrays; -import java.util.List; - -import cokr.xit.base.file.FileInfo; -import cokr.xit.foundation.data.DataObject; - -/**파일 정보 서비스를 제공한다. - *
  • {@link #getFileList(String, String...) 파일 정보 목록 조회}
  • - *
  • {@link #getFilesOf(String, String...) 파일 정보 가져오기}
  • - *
  • {@link #create(List) 파일 등록}
  • - *
  • {@link #reorder(String...) 파일 순서 변경}
  • - *
  • {@link #updateDownloadCount(String...) 다운로드 횟수 증가}
  • - *
  • {@link #remove(String, String...) 파일 정보 제거}
  • - *
  • {@link #deleteOf(String, String...) 파일 정보 및 파일 삭제}
  • - *
- * @author mjkhan - */ -public interface FileService { - /**주어진 관계 정보의 파일 정보 목록을 반환한다.
- * 관계 정보 키가 없으면 관계 정보 유형의 모든 파일 정보 목록을 반환한다. - * @param req 조회 조건 - *
 {
-	 *     "infoType": 관계 정보 유형
-	 *     "infoKeys": 관계 정보 키
-	 * }
- * @return 파일 정보 목록 - */ - List getFileList(FileQuery req); - - /**주어진 관계 정보의 파일 정보들을 반환한다.
- * 관계 정보 키가 없으면 관계 정보 유형의 모든 파일 정보들을 반환한다. - * @param infoType 관계 정보 유형 - * @param infoKeys 관계 정보 키 - * @return 파일 정보 - */ - List getFilesOf(String infoType, String... infoKeys); - - /**주어진 관계 정보의 파일 정보를 반환한다. - * @param infoType 관계 정보 유형 - * @param infoKey 관계 정보 키 - * @return 파일 정보 - */ - FileInfo getFileOf(String infoType, String infoKey); - - /**주어진 아이디의 파일 정보들을 반환한다. - * @param fileIDs 파일 정보 아이디 - * @return 파일 정보 - */ - List getFiles(String... fileIDs); - - /**주어진 아이디의 파일 정보를 반환한다. - * @param fileID 파일 정보 아이디 - * @return 파일 정보 - */ - FileInfo getFile(String fileID); - - /**파일 정보를 등록한다. - * @param files 파일 정보 - * @return 저장된 정보수 - */ - int create(List files); - - /**파일 정보를 등록한다. - * @param files 파일 정보 - * @return 저장된 정보수 - */ - default int create(FileInfo... files) { - return create(Arrays.asList(files)); - } - - /**주어진 파일 정보 아이디의 순서대로 정렬 순서를 변경한다. - * @param fileIDs 파일 정보 아이디 - * @return 저장된 정보수 - */ - public int reorder(String... fileIDs); - - /**주어진 아이디의 파일 정보들의 다운로드 횟수를 증가시킨다. - * @param fileIDs 파일 정보 아이디 - * @return 저장된 정보수 - */ - int updateDownloadCount(String... fileIDs); - - /**주어진 관계 정보의 파일 정보를 제거한다.
- * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보를 제거한다. - * @param infoType 관계 정보 유형 - * @param infoKeys 관계 정보 키 - * @return 저장된 정보수 - */ - int remove(String infoType, String... infoKeys); - - /**주어진 아이디의 파일 정보를 제거한다. - * @param fileIDs 파일 정보 아이디 - * @return 저장된 정보수 - */ - int remove(String... fileIDs); - - /**주어진 관계 정보의 파일 정보와 파일을 삭제하다.
- * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보와 파일을 삭제한다. - * @param infoType 관계 정보 유형 - * @param infoKeys 관계 정보 키 - * @return 저장된 정보수 - */ - int deleteOf(String infoType, String... infoKeys); - - /**주어진 아이디의 파일 정보와 파일을 삭제한다. - * @param fileIDs 파일 정보 아이디 - * @return 저장된 정보수 - */ - int delete(String... fileIDs); +package cokr.xit.base.file.service; + +import java.util.Arrays; +import java.util.List; + +import cokr.xit.base.file.FileInfo; +import cokr.xit.foundation.data.DataObject; + +/**파일 정보 서비스를 제공한다. + *
  • {@link #getFileList(String, String...) 파일 정보 목록 조회}
  • + *
  • {@link #getFilesOf(String, String...) 파일 정보 가져오기}
  • + *
  • {@link #create(List) 파일 등록}
  • + *
  • {@link #reorder(String...) 파일 순서 변경}
  • + *
  • {@link #updateDownloadCount(String...) 다운로드 횟수 증가}
  • + *
  • {@link #remove(String, String...) 파일 정보 제거}
  • + *
  • {@link #deleteOf(String, String...) 파일 정보 및 파일 삭제}
  • + *
+ * @author mjkhan + */ +public interface FileService { + /**주어진 관계 정보의 파일 정보 목록을 반환한다.
+ * 관계 정보 키가 없으면 관계 정보 유형의 모든 파일 정보 목록을 반환한다. + * @param req 조회 조건 + *
 {
+	 *     "infoType": 관계 정보 유형
+	 *     "infoKeys": 관계 정보 키
+	 * }
+ * @return 파일 정보 목록 + */ + List getFileList(FileQuery req); + + /**주어진 관계 정보의 파일 정보들을 반환한다.
+ * 관계 정보 키가 없으면 관계 정보 유형의 모든 파일 정보들을 반환한다. + * @param infoType 관계 정보 유형 + * @param infoKeys 관계 정보 키 + * @return 파일 정보 + */ + List getFilesOf(String infoType, String... infoKeys); + + /**주어진 관계 정보의 파일 정보를 반환한다. + * @param infoType 관계 정보 유형 + * @param infoKey 관계 정보 키 + * @return 파일 정보 + */ + FileInfo getFileOf(String infoType, String infoKey); + + /**주어진 아이디의 파일 정보들을 반환한다. + * @param fileIDs 파일 정보 아이디 + * @return 파일 정보 + */ + List getFiles(String... fileIDs); + + /**주어진 아이디의 파일 정보를 반환한다. + * @param fileID 파일 정보 아이디 + * @return 파일 정보 + */ + FileInfo getFile(String fileID); + + /**파일 정보를 등록한다. + * @param files 파일 정보 + * @return 저장된 정보수 + */ + int create(List files); + + /**파일 정보를 등록한다. + * @param files 파일 정보 + * @return 저장된 정보수 + */ + default int create(FileInfo... files) { + return create(Arrays.asList(files)); + } + + /**주어진 파일 정보 아이디의 순서대로 정렬 순서를 변경한다. + * @param fileIDs 파일 정보 아이디 + * @return 저장된 정보수 + */ + public int reorder(String... fileIDs); + + /**주어진 아이디의 파일 정보들의 다운로드 횟수를 증가시킨다. + * @param fileIDs 파일 정보 아이디 + * @return 저장된 정보수 + */ + int updateDownloadCount(String... fileIDs); + + /**주어진 관계 정보의 파일 정보를 제거한다.
+ * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보를 제거한다. + * @param infoType 관계 정보 유형 + * @param infoKeys 관계 정보 키 + * @return 저장된 정보수 + */ + int remove(String infoType, String... infoKeys); + + /**주어진 아이디의 파일 정보를 제거한다. + * @param fileIDs 파일 정보 아이디 + * @return 저장된 정보수 + */ + int remove(String... fileIDs); + + /**주어진 관계 정보의 파일 정보와 파일을 삭제하다.
+ * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보와 파일을 삭제한다. + * @param infoType 관계 정보 유형 + * @param infoKeys 관계 정보 키 + * @return 저장된 정보수 + */ + int deleteOf(String infoType, String... infoKeys); + + /**주어진 아이디의 파일 정보와 파일을 삭제한다. + * @param fileIDs 파일 정보 아이디 + * @return 저장된 정보수 + */ + int delete(String... fileIDs); } \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/service/bean/FileBean.java b/src/main/java/cokr/xit/base/file/service/bean/FileBean.java index f20ace4..66f9342 100644 --- a/src/main/java/cokr/xit/base/file/service/bean/FileBean.java +++ b/src/main/java/cokr/xit/base/file/service/bean/FileBean.java @@ -1,220 +1,220 @@ -package cokr.xit.base.file.service.bean; - -import java.io.File; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import javax.annotation.Resource; - -import org.springframework.stereotype.Component; - -import cokr.xit.base.file.FileInfo; -import cokr.xit.base.file.dao.FileMapper; -import cokr.xit.base.file.service.FileQuery; -import cokr.xit.foundation.AbstractComponent; -import cokr.xit.foundation.data.DataObject; - -/**파일 정보 Bean - *

파일 저장 경로의 설정 - *

파일 저장 경로는 다음 SQL문으로 설정한다. - *

{@code 
- *  SELECT INF_TYPE
- *     , CONCAT('D://workspace/xit/base/files/', DIR, TO_CHAR(CURRENT_DATE, 'YYYY/MM/DD/')) DIR
- *  FROM (
- *       SELECT '00' INF_TYPE, 'attachment/' DIR UNION
- *       SELECT '10' INF_TYPE, 'document/' DIR UNION
- *       SELECT '20' INF_TYPE, 'article/' DIR
- *       ) FILE_DIRS
- * }
- * 위 문장은 - *
  • 애플리케이션의 파일을 저장하는 루트 디렉토리를 'D://workspace/xit/base/files/'로 지정한다. - *
  • 정보 유형 '00'과 관계있는 파일은 '루트 디렉토리/attachment/YYYY/MM/DD' - *
  • 정보 유형 '01'과 관계있는 파일은 '루트 디렉토리/document/YYYY/MM/DD' - *
  • 정보 유형 '02'과 관계있는 파일은 '루트 디렉토리/article/YYYY/MM/DD' - *
- *

디렉토리에 각각 저장하도록 하고 있다.
- * 애플리케이션은 요구사항에 따라 이 문장을 수정하여 파일 저장 디렉토리를 지정한다. - *

파일 URL의 설정 - *

파일 URL은 다음 SQL문으로 추출한다. - *

{@code 
- * SELECT A.*, REPLACE(FILE_PATH, 'D://workspace/xit/base', '') URL
- *   FROM TBL_FILE A
- *   ...
- * }
- * 위 문장은 - *
  • 저장된 파일 정보의 FILE_PATH 컬럼의 값에서 'D://workspace/xit/base' 부분을 제거하여 파일의 URL로 추출하도록 하고 있다.
  • - *
  • 애플리케이션은 요구사항에 따라 이 문장을 수정하여 파일의 URL로 사용할 수 있다.
  • - *
- * @author mjkhan - */ -@Component("fileBean") -public class FileBean extends AbstractComponent { - @Resource(name = "fileMapper") - private FileMapper fileMapper; - - /**주어진 관계 정보의 파일 정보 목록을 반환한다.
- * 관계 정보 키가 없으면 관계 정보 유형의 모든 파일 정보 목록을 반환한다. - * @param req 조회 조건 - *
 {
-	 *     "infoType": 관계 정보 유형
-	 *     "infoKeys": 관계 정보 키
-	 * }
- * @return 파일 정보 목록 - */ - public List getFileList(FileQuery req) { - return fileMapper.getFileList(req.setOrderBy("INF_TYPE, INF_KEY, SRT_ORD")); - } - - /**주어진 관계 정보의 파일 정보들을 반환한다.
- * 관계 정보 키가 없으면 관계 정보 유형의 모든 파일 정보들을 반환한다. - * @param infoType 관계 정보 유형 - * @param infoKeys 관계 정보 키 - * @return 파일 정보 - */ - public List getFilesOf(String infoType, String... infoKeys) { - return fileMapper.getFilesOf( - new FileQuery() - .setInfoType(infoType) - .setInfoKeys(infoKeys) - .setOrderBy("INF_TYPE, INF_KEY, SRT_ORD") - ); - } - - /**주어진 관계 정보의 파일 정보를 반환한다. - * @param infoType 관계 정보 유형 - * @param infoKey 관계 정보 키 - * @return 파일 정보 - */ - public FileInfo getFileOf(String infoType, String infoKey) { - List list = getFilesOf(infoType, infoKey); - return !list.isEmpty() ? list.get(0) : null; - } - - /**주어진 아이디의 파일 정보들을 반환한다. - * @param fileIDs 파일 정보 아이디 - * @return 파일 정보 - */ - public List getFiles(String... fileIDs) { - return fileMapper.getFiles(fileIDs); - } - - /**주어진 아이디의 파일 정보를 반환한다. - * @param fileID 파일 정보 아이디 - * @return 파일 정보 - */ - public FileInfo getFile(String fileID) { - return fileMapper.getFile(fileID); - } - - /**파일 정보를 등록한다. - * @param files 파일 정보 - * @return 저장된 정보수 - */ - public int create(List files) { - int affected = fileMapper.create(files); - write(files); - return affected; - } - - /**파일 정보로 파일을 생성한다. - * @param files 파일 정보 - */ - public void write(List files) { - try { - mkdirs(files); - files.forEach(FileInfo::write); - } catch (Exception e) { - delete(files); - throw applicationException(e); - } - } - - /**파일 정보의 디렉토리를 생성한다. - * @param files 파일 정보 - * @throws Exception - */ - protected void mkdirs(List files) throws Exception { - Set dirs = files.stream() - .map(file -> FileInfo.dir(file.getPath())) - .collect(Collectors.toSet()); - - for (String path: dirs) { - File dir = new File(path); - if (!dir.exists()) - dir.mkdirs(); - } - } - - /**주어진 파일 정보 아이디의 순서대로 정렬 순서를 변경한다. - * @param fileIDs 파일 정보 아이디 - * @return 저장된 정보수 - */ - public int reorder(String... fileIDs) { - return fileMapper.reorder(fileIDs); - } - - /**주어진 아이디의 파일 정보들의 다운로드 횟수를 증가시킨다. - * @param fileIDs 파일 정보 아이디 - * @return 저장된 정보수 - */ - public int updateDownloadCount(String... fileIDs) { - return fileMapper.updateDownloadCount(fileIDs); - } - - /**주어진 관계 정보의 파일 정보를 제거한다.
- * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보를 제거한다. - * @param infoType 관계 정보 유형 - * @param infoKeys 관계 정보 키 - * @return 저장된 정보수 - */ - public int remove(String infoType, String... infoKeys) { - return fileMapper.remove(infoType, infoKeys); - } - - /**주어진 아이디의 파일 정보를 제거한다. - * @param fileIDs 파일 정보 아이디 - * @return 저장된 정보수 - */ - public int remove(String... fileIDs) { - return fileMapper.remove(fileIDs); - } - - /**주어진 관계 정보의 파일 정보와 파일을 삭제하다.
- * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보와 파일을 삭제한다. - * @param infoType 관계 정보 유형 - * @param infoKeys 관계 정보 키 - * @return 저장된 정보수 - */ - public int deleteOf(String infoType, String... infoKeys) { - List files = getFilesOf(infoType, infoKeys); - if (delete(files) < 1) return 0; - - return fileMapper.delete(files); - } - - /**주어진 아이디의 파일 정보와 파일을 삭제한다. - * @param fileIDs 파일 정보 아이디 - * @return 저장된 정보수 - */ - public int deleteByIDs(String... fileIDs) { - List files = getFiles(fileIDs); - if (delete(files) < 1) return 0; - - return fileMapper.delete(files); - } - - /**파일 정보의 파일들을 삭제한다. - * @param files 파일 정보 - * @return 삭제된 파일 수 - */ - protected int delete(List files) { - if (isEmpty(files)) return 0; - - int affected = 0; - for (FileInfo file: files) - affected += file.delete() ? 1 : 0; - - return affected; - } +package cokr.xit.base.file.service.bean; + +import java.io.File; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Component; + +import cokr.xit.base.file.FileInfo; +import cokr.xit.base.file.dao.FileMapper; +import cokr.xit.base.file.service.FileQuery; +import cokr.xit.foundation.AbstractComponent; +import cokr.xit.foundation.data.DataObject; + +/**파일 정보 Bean + *

파일 저장 경로의 설정 + *

파일 저장 경로는 다음 SQL문으로 설정한다. + *

{@code 
+ *  SELECT INF_TYPE
+ *     , CONCAT('D://workspace/xit/base/files/', DIR, TO_CHAR(CURRENT_DATE, 'YYYY/MM/DD/')) DIR
+ *  FROM (
+ *       SELECT '00' INF_TYPE, 'attachment/' DIR UNION
+ *       SELECT '10' INF_TYPE, 'document/' DIR UNION
+ *       SELECT '20' INF_TYPE, 'article/' DIR
+ *       ) FILE_DIRS
+ * }
+ * 위 문장은 + *
  • 애플리케이션의 파일을 저장하는 루트 디렉토리를 'D://workspace/xit/base/files/'로 지정한다. + *
  • 정보 유형 '00'과 관계있는 파일은 '루트 디렉토리/attachment/YYYY/MM/DD' + *
  • 정보 유형 '01'과 관계있는 파일은 '루트 디렉토리/document/YYYY/MM/DD' + *
  • 정보 유형 '02'과 관계있는 파일은 '루트 디렉토리/article/YYYY/MM/DD' + *
+ *

디렉토리에 각각 저장하도록 하고 있다.
+ * 애플리케이션은 요구사항에 따라 이 문장을 수정하여 파일 저장 디렉토리를 지정한다. + *

파일 URL의 설정 + *

파일 URL은 다음 SQL문으로 추출한다. + *

{@code 
+ * SELECT A.*, REPLACE(FILE_PATH, 'D://workspace/xit/base', '') URL
+ *   FROM TBL_FILE A
+ *   ...
+ * }
+ * 위 문장은 + *
  • 저장된 파일 정보의 FILE_PATH 컬럼의 값에서 'D://workspace/xit/base' 부분을 제거하여 파일의 URL로 추출하도록 하고 있다.
  • + *
  • 애플리케이션은 요구사항에 따라 이 문장을 수정하여 파일의 URL로 사용할 수 있다.
  • + *
+ * @author mjkhan + */ +@Component("fileBean") +public class FileBean extends AbstractComponent { + @Resource(name = "fileMapper") + private FileMapper fileMapper; + + /**주어진 관계 정보의 파일 정보 목록을 반환한다.
+ * 관계 정보 키가 없으면 관계 정보 유형의 모든 파일 정보 목록을 반환한다. + * @param req 조회 조건 + *
 {
+	 *     "infoType": 관계 정보 유형
+	 *     "infoKeys": 관계 정보 키
+	 * }
+ * @return 파일 정보 목록 + */ + public List getFileList(FileQuery req) { + return fileMapper.getFileList(req.setOrderBy("INF_TYPE, INF_KEY, SRT_ORD")); + } + + /**주어진 관계 정보의 파일 정보들을 반환한다.
+ * 관계 정보 키가 없으면 관계 정보 유형의 모든 파일 정보들을 반환한다. + * @param infoType 관계 정보 유형 + * @param infoKeys 관계 정보 키 + * @return 파일 정보 + */ + public List getFilesOf(String infoType, String... infoKeys) { + return fileMapper.getFilesOf( + new FileQuery() + .setInfoType(infoType) + .setInfoKeys(infoKeys) + .setOrderBy("INF_TYPE, INF_KEY, SRT_ORD") + ); + } + + /**주어진 관계 정보의 파일 정보를 반환한다. + * @param infoType 관계 정보 유형 + * @param infoKey 관계 정보 키 + * @return 파일 정보 + */ + public FileInfo getFileOf(String infoType, String infoKey) { + List list = getFilesOf(infoType, infoKey); + return !list.isEmpty() ? list.get(0) : null; + } + + /**주어진 아이디의 파일 정보들을 반환한다. + * @param fileIDs 파일 정보 아이디 + * @return 파일 정보 + */ + public List getFiles(String... fileIDs) { + return fileMapper.getFiles(fileIDs); + } + + /**주어진 아이디의 파일 정보를 반환한다. + * @param fileID 파일 정보 아이디 + * @return 파일 정보 + */ + public FileInfo getFile(String fileID) { + return fileMapper.getFile(fileID); + } + + /**파일 정보를 등록한다. + * @param files 파일 정보 + * @return 저장된 정보수 + */ + public int create(List files) { + int affected = fileMapper.create(files); + write(files); + return affected; + } + + /**파일 정보로 파일을 생성한다. + * @param files 파일 정보 + */ + public void write(List files) { + try { + mkdirs(files); + files.forEach(FileInfo::write); + } catch (Exception e) { + delete(files); + throw applicationException(e); + } + } + + /**파일 정보의 디렉토리를 생성한다. + * @param files 파일 정보 + * @throws Exception + */ + protected void mkdirs(List files) throws Exception { + Set dirs = files.stream() + .map(file -> FileInfo.dir(file.getPath())) + .collect(Collectors.toSet()); + + for (String path: dirs) { + File dir = new File(path); + if (!dir.exists()) + dir.mkdirs(); + } + } + + /**주어진 파일 정보 아이디의 순서대로 정렬 순서를 변경한다. + * @param fileIDs 파일 정보 아이디 + * @return 저장된 정보수 + */ + public int reorder(String... fileIDs) { + return fileMapper.reorder(fileIDs); + } + + /**주어진 아이디의 파일 정보들의 다운로드 횟수를 증가시킨다. + * @param fileIDs 파일 정보 아이디 + * @return 저장된 정보수 + */ + public int updateDownloadCount(String... fileIDs) { + return fileMapper.updateDownloadCount(fileIDs); + } + + /**주어진 관계 정보의 파일 정보를 제거한다.
+ * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보를 제거한다. + * @param infoType 관계 정보 유형 + * @param infoKeys 관계 정보 키 + * @return 저장된 정보수 + */ + public int remove(String infoType, String... infoKeys) { + return fileMapper.remove(infoType, infoKeys); + } + + /**주어진 아이디의 파일 정보를 제거한다. + * @param fileIDs 파일 정보 아이디 + * @return 저장된 정보수 + */ + public int remove(String... fileIDs) { + return fileMapper.remove(fileIDs); + } + + /**주어진 관계 정보의 파일 정보와 파일을 삭제하다.
+ * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보와 파일을 삭제한다. + * @param infoType 관계 정보 유형 + * @param infoKeys 관계 정보 키 + * @return 저장된 정보수 + */ + public int deleteOf(String infoType, String... infoKeys) { + List files = getFilesOf(infoType, infoKeys); + if (delete(files) < 1) return 0; + + return fileMapper.delete(files); + } + + /**주어진 아이디의 파일 정보와 파일을 삭제한다. + * @param fileIDs 파일 정보 아이디 + * @return 저장된 정보수 + */ + public int deleteByIDs(String... fileIDs) { + List files = getFiles(fileIDs); + if (delete(files) < 1) return 0; + + return fileMapper.delete(files); + } + + /**파일 정보의 파일들을 삭제한다. + * @param files 파일 정보 + * @return 삭제된 파일 수 + */ + protected int delete(List files) { + if (isEmpty(files)) return 0; + + int affected = 0; + for (FileInfo file: files) + affected += file.delete() ? 1 : 0; + + return affected; + } } \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/service/bean/FileServiceBean.java b/src/main/java/cokr/xit/base/file/service/bean/FileServiceBean.java index 55f7faf..82f429e 100644 --- a/src/main/java/cokr/xit/base/file/service/bean/FileServiceBean.java +++ b/src/main/java/cokr/xit/base/file/service/bean/FileServiceBean.java @@ -1,84 +1,84 @@ -package cokr.xit.base.file.service.bean; - -import java.util.List; - -import javax.annotation.Resource; - -import org.springframework.stereotype.Service; - -import cokr.xit.base.file.FileInfo; -import cokr.xit.base.file.service.FileQuery; -import cokr.xit.base.file.service.FileService; -import cokr.xit.foundation.component.AbstractServiceBean; -import cokr.xit.foundation.data.DataObject; - -/**파일 정보 서비스 인터페이스 구현체 - * @author mjkhan - */ -@Service("fileService") -public class FileServiceBean extends AbstractServiceBean implements FileService { - @Resource(name="fileBean") - private FileBean fileBean; - - @Override - public List getFileList(FileQuery req) { - return fileBean.getFileList(req); - } - - @Override - public List getFilesOf(String infoType, String... infoKeys) { - return fileBean.getFilesOf(infoType, infoKeys); - } - - @Override - public FileInfo getFileOf(String infoType, String infoKey) { - return fileBean.getFileOf(infoType, infoKey); - } - - @Override - public List getFiles(String... fileIDs) { - return fileBean.getFiles(fileIDs); - } - - @Override - public FileInfo getFile(String fileID) { - return fileBean.getFile(fileID); - } - - @Override - public int create(List files) { - if (isEmpty(files)) return 0; - - return fileBean.create(files); - } - - @Override - public int reorder(String... fileIDs) { - return fileBean.reorder(fileIDs); - } - - @Override - public int updateDownloadCount(String... fileIDs) { - return fileBean.updateDownloadCount(fileIDs); - } - - @Override - public int remove(String infoType, String... infoKeys) { - return fileBean.remove(infoType, infoKeys); - } - - @Override - public int remove(String... fileIDs) { - return fileBean.remove(fileIDs); - } - - @Override - public int deleteOf(String infoType, String... infoKeys) { - return fileBean.deleteOf(infoType, infoKeys); - } - - @Override - public int delete(String... fileIDs) { - return fileBean.deleteByIDs(fileIDs); - } +package cokr.xit.base.file.service.bean; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; + +import cokr.xit.base.file.FileInfo; +import cokr.xit.base.file.service.FileQuery; +import cokr.xit.base.file.service.FileService; +import cokr.xit.foundation.component.AbstractServiceBean; +import cokr.xit.foundation.data.DataObject; + +/**파일 정보 서비스 인터페이스 구현체 + * @author mjkhan + */ +@Service("fileService") +public class FileServiceBean extends AbstractServiceBean implements FileService { + @Resource(name="fileBean") + private FileBean fileBean; + + @Override + public List getFileList(FileQuery req) { + return fileBean.getFileList(req); + } + + @Override + public List getFilesOf(String infoType, String... infoKeys) { + return fileBean.getFilesOf(infoType, infoKeys); + } + + @Override + public FileInfo getFileOf(String infoType, String infoKey) { + return fileBean.getFileOf(infoType, infoKey); + } + + @Override + public List getFiles(String... fileIDs) { + return fileBean.getFiles(fileIDs); + } + + @Override + public FileInfo getFile(String fileID) { + return fileBean.getFile(fileID); + } + + @Override + public int create(List files) { + if (isEmpty(files)) return 0; + + return fileBean.create(files); + } + + @Override + public int reorder(String... fileIDs) { + return fileBean.reorder(fileIDs); + } + + @Override + public int updateDownloadCount(String... fileIDs) { + return fileBean.updateDownloadCount(fileIDs); + } + + @Override + public int remove(String infoType, String... infoKeys) { + return fileBean.remove(infoType, infoKeys); + } + + @Override + public int remove(String... fileIDs) { + return fileBean.remove(fileIDs); + } + + @Override + public int deleteOf(String infoType, String... infoKeys) { + return fileBean.deleteOf(infoType, infoKeys); + } + + @Override + public int delete(String... fileIDs) { + return fileBean.deleteByIDs(fileIDs); + } } \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/service/bean/package-info.java b/src/main/java/cokr/xit/base/file/service/bean/package-info.java index 846d070..52b871f 100644 --- a/src/main/java/cokr/xit/base/file/service/bean/package-info.java +++ b/src/main/java/cokr/xit/base/file/service/bean/package-info.java @@ -1,3 +1,3 @@ -/**파일 정보 서비스 구현부 - */ +/**파일 정보 서비스 구현부 + */ package cokr.xit.base.file.service.bean; \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/service/package-info.java b/src/main/java/cokr/xit/base/file/service/package-info.java index 56f0fcc..0ff30c6 100644 --- a/src/main/java/cokr/xit/base/file/service/package-info.java +++ b/src/main/java/cokr/xit/base/file/service/package-info.java @@ -1,3 +1,3 @@ -/**파일 정보 서비스 인터페이스 - */ +/**파일 정보 서비스 인터페이스 + */ package cokr.xit.base.file.service; \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/web/DownloadView.java b/src/main/java/cokr/xit/base/file/web/DownloadView.java index 6f62eb3..fde05e5 100644 --- a/src/main/java/cokr/xit/base/file/web/DownloadView.java +++ b/src/main/java/cokr/xit/base/file/web/DownloadView.java @@ -1,147 +1,147 @@ -package cokr.xit.base.file.web; - -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; -import java.net.URLConnection; -import java.net.URLEncoder; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.util.FileCopyUtils; -import org.springframework.web.servlet.view.AbstractView; - -import cokr.xit.base.file.FileInfo; -import cokr.xit.foundation.Assert; - -/**파일의 다운로드를 처리하기 위한 {@link org.springframework.web.servlet.View} - *

DownloadView가 파일을 다운로드하기 위해서는 {@link org.springframework.web.servlet.ModelAndView}로 다음과 같은 속성의 값을 지정해야 한다. - *

  • "file" - {@link File}, {@link InputStream}, 또는 {@link FileInfo}
  • - *
  • "filename" - 다운로드될 때 사용자가 보게될 파일이름. "file"이 InputStream일 경우는 필수
  • - *
  • "contentType" - 컨텐트 유형. 지정하지 않으면 "file" 속성의 객체를 검사하여 추측하며, 알아낼 수 없으면 'application/octet-stream'을 설정 - *
  • "disposition" - 응답의 Content-Disposition 헤더값. 지정하지 않으면 'attachment'를 설정
  • - *
  • "length" - 파일 길이. 지정하지 않으면 "file" 속성의 객체를 검사하여 설정한다. "file" 속성 객체가 InputStream일 경우는 필수
  • - *
  • "delete" - "file" 속성의 객체가 {@link File}일 경우 삭제 여부(true 또는 false). 지정하지 않으면 다운로드 후 삭제한다.
  • - *
- * @author mjkhan - */ -public class DownloadView extends AbstractView { - @Override - protected void renderMergedOutputModel(Map model, HttpServletRequest hreq, HttpServletResponse hresp) throws Exception { - InputStream input = getInputStream(model); - if (input == null) { - hresp.setStatus(HttpServletResponse.SC_NOT_FOUND); - hresp.sendError(HttpServletResponse.SC_NOT_FOUND); - return; - } - - try (InputStream stream = input) { - String filename = getFilename(model); - if (Assert.isEmpty(filename)) - throw new IllegalArgumentException("Unable to determine the filename"); - - String contentType = getContentType(model); - if (Assert.isEmpty(contentType)) { - contentType = Assert.ifEmpty(URLConnection.guessContentTypeFromName(filename), "application/octet-stream"); - } - String disposition = Assert.ifEmpty((String)model.get("disposition"), "attachment"); - Number length = getLength(model); - if (length == null) - throw new IllegalArgumentException("Unable to determine the length"); - - hresp.setCharacterEncoding("UTF-8"); - hresp.setContentType(contentType); - hresp.setHeader("Content-Disposition", disposition + "; filename=\"" + URLEncoder.encode(filename, "UTF-8") +"\""); - hresp.setContentLengthLong(length.longValue()); - - FileCopyUtils.copy(stream, hresp.getOutputStream()); - } catch (Exception e) { - throw Assert.runtimeException(e); - } finally { - clear(model); - } - } - - private InputStream getInputStream(Map model) throws Exception { - Object obj = model.get("file"); - if (obj == null) return null; - - if (obj instanceof InputStream) - return (InputStream)obj; - if (obj instanceof File) { - File file = (File)obj; - return new FileInputStream(file); - } - if (obj instanceof FileInfo) { - FileInfo fileInfo = (FileInfo)obj; - return fileInfo.getInputStream(); - } - throw new IllegalArgumentException("'file' must be either a " + File.class.getName() + ", a " + InputStream.class.getName() + ", or a " + FileInfo.class.getName()); - } - - private String getFilename(Map model) { - String filename = (String)model.get("filename"); - if (!Assert.isEmpty(filename)) return filename; - - Object obj = model.get("file"); - if (obj instanceof File) { - File file = (File)obj; - return file.getName(); - } - if (obj instanceof FileInfo) { - FileInfo fileInfo = (FileInfo)obj; - return fileInfo.getName(); - } - return null; - } - - private String getContentType(Map model) throws Exception { - String contentType = (String)model.get("contentType"); - if (!Assert.isEmpty(contentType)) return contentType; - - Object obj = model.get("file"); - if (obj instanceof InputStream) { - InputStream input = (InputStream)obj; - return URLConnection.guessContentTypeFromStream(input); - } - if (obj instanceof File) { - File file = (File)obj; - return URLConnection.guessContentTypeFromName(file.getName()); - } - if (obj instanceof FileInfo) { - FileInfo fileInfo = (FileInfo)obj; - return fileInfo.getMimeType(); - } - return null; - } - - private Number getLength(Map model) { - Number length = (Number)model.get("length"); - if (!Assert.isEmpty(length)) return length; - - Object obj = model.get("file"); - if (obj instanceof File) { - File file = (File)obj; - return file.length(); - } - if (obj instanceof FileInfo) { - FileInfo fileInfo = (FileInfo)obj; - return fileInfo.getSize(); - } - return null; - } - - private void clear(Map model) { - Object obj = model.get("file"); - if (!(obj instanceof File)) return; - - Boolean delete = (Boolean)model.get("delete"); - if (Boolean.FALSE.equals(delete)) return; - - File file = (File)obj; - if (file.exists()) - file.delete(); - } +package cokr.xit.base.file.web; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.util.FileCopyUtils; +import org.springframework.web.servlet.view.AbstractView; + +import cokr.xit.base.file.FileInfo; +import cokr.xit.foundation.Assert; + +/**파일의 다운로드를 처리하기 위한 {@link org.springframework.web.servlet.View} + *

DownloadView가 파일을 다운로드하기 위해서는 {@link org.springframework.web.servlet.ModelAndView}로 다음과 같은 속성의 값을 지정해야 한다. + *

  • "file" - {@link File}, {@link InputStream}, 또는 {@link FileInfo}
  • + *
  • "filename" - 다운로드될 때 사용자가 보게될 파일이름. "file"이 InputStream일 경우는 필수
  • + *
  • "contentType" - 컨텐트 유형. 지정하지 않으면 "file" 속성의 객체를 검사하여 추측하며, 알아낼 수 없으면 'application/octet-stream'을 설정 + *
  • "disposition" - 응답의 Content-Disposition 헤더값. 지정하지 않으면 'attachment'를 설정
  • + *
  • "length" - 파일 길이. 지정하지 않으면 "file" 속성의 객체를 검사하여 설정한다. "file" 속성 객체가 InputStream일 경우는 필수
  • + *
  • "delete" - "file" 속성의 객체가 {@link File}일 경우 삭제 여부(true 또는 false). 지정하지 않으면 다운로드 후 삭제한다.
  • + *
+ * @author mjkhan + */ +public class DownloadView extends AbstractView { + @Override + protected void renderMergedOutputModel(Map model, HttpServletRequest hreq, HttpServletResponse hresp) throws Exception { + InputStream input = getInputStream(model); + if (input == null) { + hresp.setStatus(HttpServletResponse.SC_NOT_FOUND); + hresp.sendError(HttpServletResponse.SC_NOT_FOUND); + return; + } + + try (InputStream stream = input) { + String filename = getFilename(model); + if (Assert.isEmpty(filename)) + throw new IllegalArgumentException("Unable to determine the filename"); + + String contentType = getContentType(model); + if (Assert.isEmpty(contentType)) { + contentType = Assert.ifEmpty(URLConnection.guessContentTypeFromName(filename), "application/octet-stream"); + } + String disposition = Assert.ifEmpty((String)model.get("disposition"), "attachment"); + Number length = getLength(model); + if (length == null) + throw new IllegalArgumentException("Unable to determine the length"); + + hresp.setCharacterEncoding("UTF-8"); + hresp.setContentType(contentType); + hresp.setHeader("Content-Disposition", disposition + "; filename=\"" + URLEncoder.encode(filename, "UTF-8") +"\""); + hresp.setContentLengthLong(length.longValue()); + + FileCopyUtils.copy(stream, hresp.getOutputStream()); + } catch (Exception e) { + throw Assert.runtimeException(e); + } finally { + clear(model); + } + } + + private InputStream getInputStream(Map model) throws Exception { + Object obj = model.get("file"); + if (obj == null) return null; + + if (obj instanceof InputStream) + return (InputStream)obj; + if (obj instanceof File) { + File file = (File)obj; + return new FileInputStream(file); + } + if (obj instanceof FileInfo) { + FileInfo fileInfo = (FileInfo)obj; + return fileInfo.getInputStream(); + } + throw new IllegalArgumentException("'file' must be either a " + File.class.getName() + ", a " + InputStream.class.getName() + ", or a " + FileInfo.class.getName()); + } + + private String getFilename(Map model) { + String filename = (String)model.get("filename"); + if (!Assert.isEmpty(filename)) return filename; + + Object obj = model.get("file"); + if (obj instanceof File) { + File file = (File)obj; + return file.getName(); + } + if (obj instanceof FileInfo) { + FileInfo fileInfo = (FileInfo)obj; + return fileInfo.getName(); + } + return null; + } + + private String getContentType(Map model) throws Exception { + String contentType = (String)model.get("contentType"); + if (!Assert.isEmpty(contentType)) return contentType; + + Object obj = model.get("file"); + if (obj instanceof InputStream) { + InputStream input = (InputStream)obj; + return URLConnection.guessContentTypeFromStream(input); + } + if (obj instanceof File) { + File file = (File)obj; + return URLConnection.guessContentTypeFromName(file.getName()); + } + if (obj instanceof FileInfo) { + FileInfo fileInfo = (FileInfo)obj; + return fileInfo.getMimeType(); + } + return null; + } + + private Number getLength(Map model) { + Number length = (Number)model.get("length"); + if (!Assert.isEmpty(length)) return length; + + Object obj = model.get("file"); + if (obj instanceof File) { + File file = (File)obj; + return file.length(); + } + if (obj instanceof FileInfo) { + FileInfo fileInfo = (FileInfo)obj; + return fileInfo.getSize(); + } + return null; + } + + private void clear(Map model) { + Object obj = model.get("file"); + if (!(obj instanceof File)) return; + + Boolean delete = (Boolean)model.get("delete"); + if (Boolean.FALSE.equals(delete)) return; + + File file = (File)obj; + if (file.exists()) + file.delete(); + } } \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/web/FileController.java b/src/main/java/cokr/xit/base/file/web/FileController.java index 138d496..68c1f7f 100644 --- a/src/main/java/cokr/xit/base/file/web/FileController.java +++ b/src/main/java/cokr/xit/base/file/web/FileController.java @@ -1,169 +1,169 @@ -package cokr.xit.base.file.web; - -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.multipart.MultipartFile; -import org.springframework.web.servlet.ModelAndView; - -import cokr.xit.base.file.FileInfo; -import cokr.xit.base.file.service.FileQuery; -import cokr.xit.base.file.service.FileService; -import cokr.xit.foundation.web.AbstractController; - -/**파일 정보 서비스 웹 컨트롤러.
- * {웹 컨텍스트}/file/*로 접근할 수 있다. - * @author mjkhan - */ -@RequestMapping(name="파일관리", value="/file") -public class FileController extends AbstractController { - @Resource(name="fileService") - private FileService fileService; - - /**파일 서비스 인터페이스를 반환한다. - * @return 파일 서비스 인터페이스 - */ - protected FileService fileService() { - return fileService; - } - - /**주어진 관계 정보의 파일 정보 목록을 반환한다.
- * 관계 정보 키가 없으면 관계 정보 유형의 모든 파일 정보 목록을 반환한다. - * @param infoType 관계 정보 유형 - * @param infoKeys 관계 정보 키 - * @return ModelAndView - *
{
-	 *     "fileList": [...]
-	 * }
- */ - @RequestMapping(name="파일목록 조회", value="/list.do") - public ModelAndView getFileList(FileQuery req) { - return setCollectionInfo( - new ModelAndView("jsonView"), - fileService.getFileList(setFetchSize(req)), - "file" - ); - } - - /**업로드한 파일을 주어진 관계 정보의 파일로 등록한다. - * @param infoType 관계 정보 유형 - * @param infoKey 관계 정보 키 - * @param uploads 업로드 파일 - * @return ModelAndView - *
{
-	 *     "affected": 등록된 파일 수,
-	 *     "saved": true || false
-	 * }
- */ - @PostMapping(name="파일 등록", value="/create.do") - public ModelAndView create( - String infoType, - String infoKey, - MultipartFile[] uploads - ) { - List files = new FileInfoFactory().makeFileInfos(infoType, infoKey, uploads); - int affected = fileService.create(files); - return new ModelAndView("jsonView") - .addObject("affected", affected) - .addObject("saved", affected > 0); - } - - /**주어진 파일 정보의 파일을 다운로드한다. - * @param fileID 파일 정보 아이디 - * @return downloadView - */ - @RequestMapping(name="다운로드", value="/download.do") - public ModelAndView download(String fileID) { - FileInfo fileInfo = fileService.getFile(fileID); - fileService.updateDownloadCount(fileID); - return new ModelAndView("downloadView") - .addObject("file", fileInfo); - } - - /**주어진 파일 정보 아이디의 순서대로 정렬 순서를 변경한다. - * @param fileIDs 파일 정보 아이디 - * @return jsonView - *
{
-	 *     "affected": 저장된 정보수,
-	 *     "saved": true || false
-	 * }
- */ - @PostMapping(name="순서 변경", value="/reorder.do") - public ModelAndView reorder(String... fileIDs) { - int affected = fileService.reorder(fileIDs); - return new ModelAndView("jsonView") - .addObject("affected", affected) - .addObject("saved", affected > 0); - } - - /**주어진 아이디의 파일 정보를 제거한다. - * @param fileIDs 파일 정보 아이디 - * @return jsonView - *
{
-	 *     "affected": 저장된 정보수,
-	 *     "saved": true || false
-	 * }
- */ - @PostMapping(name="파일 제거", value="/remove.do") - public ModelAndView remove(String... fileIDs) { - int affected = fileService.remove(fileIDs); - return new ModelAndView("jsonView") - .addObject("affected", affected) - .addObject("saved", affected > 0); - } - - /**주어진 관계 정보의 파일 정보를 제거한다.
- * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보를 제거한다. - * @param infoType 관계 정보 유형 - * @param infoKeys 관계 정보 키 - * @return jsonView - *
{
-	 *     "affected": 저장된 정보수,
-	 *     "saved": true || false
-	 * }
- */ - @PostMapping(name="관련파일 제거", value="/removeLinked.do") - public ModelAndView remove(String infoType, String... infoKeys) { - int affected = fileService.remove(infoType, infoKeys); - return new ModelAndView("jsonView") - .addObject("affected", affected) - .addObject("saved", affected > 0); - } - - /**주어진 아이디의 파일 정보와 파일을 삭제한다. - * @param fileIDs 파일 정보 아이디 - * @return jsonView - *
{
-	 *     "affected": 저장된 정보수,
-	 *     "saved": true || false
-	 * }
- */ - @PostMapping(name="파일 삭제", value="/delete.do") - public ModelAndView delete(String... fileIDs) { - int affected = fileService.delete(fileIDs); - return new ModelAndView("jsonView") - .addObject("affected", affected) - .addObject("saved", affected > 0); - } - - /**주어진 관계 정보의 파일 정보와 파일을 삭제하다.
- * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보와 파일을 삭제한다. - * @param infoType 관계 정보 유형 - * @param infoKeys 관계 정보 키 - * @return jsonView - *
{
-	 *     "affected": 저장된 정보수,
-	 *     "saved": true || false
-	 * }
- */ - @PostMapping(name="관련파일 삭제", value="/deleteOf.do") - public ModelAndView delete(String infoType, String... infoKeys) { - int affected = fileService.deleteOf(infoType, infoKeys); - return new ModelAndView("jsonView") - .addObject("affected", affected) - .addObject("saved", affected > 0); - } +package cokr.xit.base.file.web; + +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.multipart.MultipartFile; +import org.springframework.web.servlet.ModelAndView; + +import cokr.xit.base.file.FileInfo; +import cokr.xit.base.file.service.FileQuery; +import cokr.xit.base.file.service.FileService; +import cokr.xit.foundation.web.AbstractController; + +/**파일 정보 서비스 웹 컨트롤러.
+ * {웹 컨텍스트}/file/*로 접근할 수 있다. + * @author mjkhan + */ +@RequestMapping(name="파일관리", value="/file") +public class FileController extends AbstractController { + @Resource(name="fileService") + private FileService fileService; + + /**파일 서비스 인터페이스를 반환한다. + * @return 파일 서비스 인터페이스 + */ + protected FileService fileService() { + return fileService; + } + + /**주어진 관계 정보의 파일 정보 목록을 반환한다.
+ * 관계 정보 키가 없으면 관계 정보 유형의 모든 파일 정보 목록을 반환한다. + * @param infoType 관계 정보 유형 + * @param infoKeys 관계 정보 키 + * @return ModelAndView + *
{
+	 *     "fileList": [...]
+	 * }
+ */ + @RequestMapping(name="파일목록 조회", value="/list.do") + public ModelAndView getFileList(FileQuery req) { + return setCollectionInfo( + new ModelAndView("jsonView"), + fileService.getFileList(setFetchSize(req)), + "file" + ); + } + + /**업로드한 파일을 주어진 관계 정보의 파일로 등록한다. + * @param infoType 관계 정보 유형 + * @param infoKey 관계 정보 키 + * @param uploads 업로드 파일 + * @return ModelAndView + *
{
+	 *     "affected": 등록된 파일 수,
+	 *     "saved": true || false
+	 * }
+ */ + @PostMapping(name="파일 등록", value="/create.do") + public ModelAndView create( + String infoType, + String infoKey, + MultipartFile[] uploads + ) { + List files = new FileInfoFactory().makeFileInfos(infoType, infoKey, uploads); + int affected = fileService.create(files); + return new ModelAndView("jsonView") + .addObject("affected", affected) + .addObject("saved", affected > 0); + } + + /**주어진 파일 정보의 파일을 다운로드한다. + * @param fileID 파일 정보 아이디 + * @return downloadView + */ + @RequestMapping(name="다운로드", value="/download.do") + public ModelAndView download(String fileID) { + FileInfo fileInfo = fileService.getFile(fileID); + fileService.updateDownloadCount(fileID); + return new ModelAndView("downloadView") + .addObject("file", fileInfo); + } + + /**주어진 파일 정보 아이디의 순서대로 정렬 순서를 변경한다. + * @param fileIDs 파일 정보 아이디 + * @return jsonView + *
{
+	 *     "affected": 저장된 정보수,
+	 *     "saved": true || false
+	 * }
+ */ + @PostMapping(name="순서 변경", value="/reorder.do") + public ModelAndView reorder(String... fileIDs) { + int affected = fileService.reorder(fileIDs); + return new ModelAndView("jsonView") + .addObject("affected", affected) + .addObject("saved", affected > 0); + } + + /**주어진 아이디의 파일 정보를 제거한다. + * @param fileIDs 파일 정보 아이디 + * @return jsonView + *
{
+	 *     "affected": 저장된 정보수,
+	 *     "saved": true || false
+	 * }
+ */ + @PostMapping(name="파일 제거", value="/remove.do") + public ModelAndView remove(String... fileIDs) { + int affected = fileService.remove(fileIDs); + return new ModelAndView("jsonView") + .addObject("affected", affected) + .addObject("saved", affected > 0); + } + + /**주어진 관계 정보의 파일 정보를 제거한다.
+ * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보를 제거한다. + * @param infoType 관계 정보 유형 + * @param infoKeys 관계 정보 키 + * @return jsonView + *
{
+	 *     "affected": 저장된 정보수,
+	 *     "saved": true || false
+	 * }
+ */ + @PostMapping(name="관련파일 제거", value="/removeLinked.do") + public ModelAndView remove(String infoType, String... infoKeys) { + int affected = fileService.remove(infoType, infoKeys); + return new ModelAndView("jsonView") + .addObject("affected", affected) + .addObject("saved", affected > 0); + } + + /**주어진 아이디의 파일 정보와 파일을 삭제한다. + * @param fileIDs 파일 정보 아이디 + * @return jsonView + *
{
+	 *     "affected": 저장된 정보수,
+	 *     "saved": true || false
+	 * }
+ */ + @PostMapping(name="파일 삭제", value="/delete.do") + public ModelAndView delete(String... fileIDs) { + int affected = fileService.delete(fileIDs); + return new ModelAndView("jsonView") + .addObject("affected", affected) + .addObject("saved", affected > 0); + } + + /**주어진 관계 정보의 파일 정보와 파일을 삭제하다.
+ * 관계 정보 키를 지정하지 않으면 해당 정보 유형의 모든 파일 정보와 파일을 삭제한다. + * @param infoType 관계 정보 유형 + * @param infoKeys 관계 정보 키 + * @return jsonView + *
{
+	 *     "affected": 저장된 정보수,
+	 *     "saved": true || false
+	 * }
+ */ + @PostMapping(name="관련파일 삭제", value="/deleteOf.do") + public ModelAndView delete(String infoType, String... infoKeys) { + int affected = fileService.deleteOf(infoType, infoKeys); + return new ModelAndView("jsonView") + .addObject("affected", affected) + .addObject("saved", affected > 0); + } } \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/web/FileInfoFactory.java b/src/main/java/cokr/xit/base/file/web/FileInfoFactory.java index 596a348..76a2f3f 100644 --- a/src/main/java/cokr/xit/base/file/web/FileInfoFactory.java +++ b/src/main/java/cokr/xit/base/file/web/FileInfoFactory.java @@ -1,67 +1,67 @@ -package cokr.xit.base.file.web; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.springframework.web.multipart.MultipartFile; - -import cokr.xit.base.file.FileInfo; - -/**파일 정보 생성자 - * @author mjkhan - */ -public class FileInfoFactory extends FileInfo.Factory { - /**주어진 관계 정보 유형과 키, 그리고 업로드 파일로 FileInfo 목록을 생성한다. - * @param infoType 관계 정보 유형 - * @param infoKey 관계 정보 키 - * @param multipartFiles 업로드 파일 - * @return FileInfo 목록 - */ - public List makeFileInfos(String infoType, String infoKey, Iterable multipartFiles) { - if (isEmpty(multipartFiles)) - return Collections.emptyList(); - - ArrayList result = new ArrayList<>(); - for (MultipartFile file: multipartFiles) - try { - if (file == null) continue; - - FileInfo info = new FileInfo(); - String filename = FileInfo.name(file.getOriginalFilename()); - info.setName(filename); - info.setMimeType(file.getContentType()); - info.setSize(file.getSize()); - info.setInputStream(file.getInputStream()); - info.setSortOrder(result.size()); - info.setInfoType(infoType); - info.setInfoKey(infoKey); - result.add(info); - } catch (Exception e) { - throw runtimeException(e); - } - return result; - } - - /**주어진 관계 정보 유형과 키, 그리고 업로드 파일로 FileInfo 목록을 생성한다. - * @param infoType 관계 정보 유형 - * @param infoKey 관계 정보 키 - * @param multipartFiles 업로드 파일 - * @return FileInfo 목록 - */ - public List makeFileInfos(String infoType, String infoKey, MultipartFile... multipartFiles) { - return makeFileInfos(infoType, infoKey, Arrays.asList(multipartFiles)); - } - - /**주어진 관계 정보 유형과 키, 그리고 업로드 파일로 FileInfo을 생성한다. - * @param infoType 관계 정보 유형 - * @param infoKey 관계 정보 키 - * @param multipartFile 업로드 파일 - * @return FileInfo - */ - public FileInfo make(String infoType, String infoKey, MultipartFile multipartFile) { - List files = makeFileInfos(infoType, infoKey, multipartFile); - return !files.isEmpty() ? files.get(0) : null; - } +package cokr.xit.base.file.web; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.springframework.web.multipart.MultipartFile; + +import cokr.xit.base.file.FileInfo; + +/**파일 정보 생성자 + * @author mjkhan + */ +public class FileInfoFactory extends FileInfo.Factory { + /**주어진 관계 정보 유형과 키, 그리고 업로드 파일로 FileInfo 목록을 생성한다. + * @param infoType 관계 정보 유형 + * @param infoKey 관계 정보 키 + * @param multipartFiles 업로드 파일 + * @return FileInfo 목록 + */ + public List makeFileInfos(String infoType, String infoKey, Iterable multipartFiles) { + if (isEmpty(multipartFiles)) + return Collections.emptyList(); + + ArrayList result = new ArrayList<>(); + for (MultipartFile file: multipartFiles) + try { + if (file == null) continue; + + FileInfo info = new FileInfo(); + String filename = FileInfo.name(file.getOriginalFilename()); + info.setName(filename); + info.setMimeType(file.getContentType()); + info.setSize(file.getSize()); + info.setInputStream(file.getInputStream()); + info.setSortOrder(result.size()); + info.setInfoType(infoType); + info.setInfoKey(infoKey); + result.add(info); + } catch (Exception e) { + throw runtimeException(e); + } + return result; + } + + /**주어진 관계 정보 유형과 키, 그리고 업로드 파일로 FileInfo 목록을 생성한다. + * @param infoType 관계 정보 유형 + * @param infoKey 관계 정보 키 + * @param multipartFiles 업로드 파일 + * @return FileInfo 목록 + */ + public List makeFileInfos(String infoType, String infoKey, MultipartFile... multipartFiles) { + return makeFileInfos(infoType, infoKey, Arrays.asList(multipartFiles)); + } + + /**주어진 관계 정보 유형과 키, 그리고 업로드 파일로 FileInfo을 생성한다. + * @param infoType 관계 정보 유형 + * @param infoKey 관계 정보 키 + * @param multipartFile 업로드 파일 + * @return FileInfo + */ + public FileInfo make(String infoType, String infoKey, MultipartFile multipartFile) { + List files = makeFileInfos(infoType, infoKey, multipartFile); + return !files.isEmpty() ? files.get(0) : null; + } } \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/web/XLSView.java b/src/main/java/cokr/xit/base/file/web/XLSView.java index 310d7f0..bbdd0ff 100644 --- a/src/main/java/cokr/xit/base/file/web/XLSView.java +++ b/src/main/java/cokr/xit/base/file/web/XLSView.java @@ -1,14 +1,14 @@ -package cokr.xit.base.file.web; - -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.web.servlet.view.AbstractView; - -public class XLSView extends AbstractView { - @Override - protected void renderMergedOutputModel(Map model, HttpServletRequest hreq, HttpServletResponse hresp) throws Exception { - } +package cokr.xit.base.file.web; + +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.servlet.view.AbstractView; + +public class XLSView extends AbstractView { + @Override + protected void renderMergedOutputModel(Map model, HttpServletRequest hreq, HttpServletResponse hresp) throws Exception { + } } \ No newline at end of file diff --git a/src/main/java/cokr/xit/base/file/web/package-info.java b/src/main/java/cokr/xit/base/file/web/package-info.java index ed9e837..a807867 100644 --- a/src/main/java/cokr/xit/base/file/web/package-info.java +++ b/src/main/java/cokr/xit/base/file/web/package-info.java @@ -1,3 +1,3 @@ -/**파일 정보 서비스 웹 컨트롤러 - */ +/**파일 정보 서비스 웹 컨트롤러 + */ package cokr.xit.base.file.web; \ No newline at end of file diff --git a/src/test/java/cokr/xit/base/file/service/FileServiceTest.java b/src/test/java/cokr/xit/base/file/service/FileServiceTest.java index 67f2d61..ef56e57 100644 --- a/src/test/java/cokr/xit/base/file/service/FileServiceTest.java +++ b/src/test/java/cokr/xit/base/file/service/FileServiceTest.java @@ -1,64 +1,64 @@ -package cokr.xit.base.file.service; - -import java.io.File; -import java.util.List; -import java.util.stream.Collectors; - -import javax.annotation.Resource; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import cokr.xit.base.file.FileInfo; -import cokr.xit.foundation.data.DataObject; -import cokr.xit.foundation.test.TestSupport; - -public class FileServiceTest extends TestSupport { - @Resource(name="fileService") - private FileService service; - - @Test - public void files() { - File[] files = { - new File(".\\src\\test\\resources\\files\\a-jpg-file.jpg"), - new File(".\\src\\test\\resources\\files\\an-excel-file.xlsx"), - new File(".\\src\\test\\resources\\files\\a-pdf-file.pdf") - }; - String infoType = "00"; - String infoKey = "info-key-00"; - FileQuery req = new FileQuery().setInfoType(infoType); - - List fileInfos = new FileInfo.Factory().createFileInfos(infoType, infoKey, files); - Assertions.assertTrue(service.create(fileInfos) > 0); - fileInfos.forEach(System.out::println); - - List fileList = service.getFileList(req); - Assertions.assertFalse(fileList.isEmpty()); - - fileList = service.getFileList(req.setInfoKeys(infoKey)); - Assertions.assertFalse(fileList.isEmpty()); - - List fileInfoList = service.getFilesOf(infoType, infoKey); - Assertions.assertFalse(fileInfoList.isEmpty()); - fileInfoList.forEach(fileInfo -> Assertions.assertTrue(new File(fileInfo.getPath()).exists())); - - String[] fileIDs = fileInfos.stream() - .map(FileInfo::getId) - .collect(Collectors.toList()) - .toArray(new String[fileInfos.size()]); - - Assertions.assertTrue(service.updateDownloadCount(fileIDs) > 0); - fileInfoList = service.getFiles(fileIDs); - fileInfoList.forEach(info -> Assertions.assertTrue(info.getDownloadCount() > 0)); - - service.reorder( - fileInfoList.get(2).getId(), - fileInfoList.get(1).getId(), - fileInfoList.get(0).getId() - ); - fileInfoList = service.getFiles(fileIDs); - - service.deleteOf(infoType, infoKey); - fileInfoList.forEach(fileInfo -> Assertions.assertFalse(new File(fileInfo.getPath()).exists())); - } +package cokr.xit.base.file.service; + +import java.io.File; +import java.util.List; +import java.util.stream.Collectors; + +import javax.annotation.Resource; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cokr.xit.base.file.FileInfo; +import cokr.xit.foundation.data.DataObject; +import cokr.xit.foundation.test.TestSupport; + +public class FileServiceTest extends TestSupport { + @Resource(name="fileService") + private FileService service; + + @Test + public void files() { + File[] files = { + new File(".\\src\\test\\resources\\files\\a-jpg-file.jpg"), + new File(".\\src\\test\\resources\\files\\an-excel-file.xlsx"), + new File(".\\src\\test\\resources\\files\\a-pdf-file.pdf") + }; + String infoType = "00"; + String infoKey = "info-key-00"; + FileQuery req = new FileQuery().setInfoType(infoType); + + List fileInfos = new FileInfo.Factory().createFileInfos(infoType, infoKey, files); + Assertions.assertTrue(service.create(fileInfos) > 0); + fileInfos.forEach(System.out::println); + + List fileList = service.getFileList(req); + Assertions.assertFalse(fileList.isEmpty()); + + fileList = service.getFileList(req.setInfoKeys(infoKey)); + Assertions.assertFalse(fileList.isEmpty()); + + List fileInfoList = service.getFilesOf(infoType, infoKey); + Assertions.assertFalse(fileInfoList.isEmpty()); + fileInfoList.forEach(fileInfo -> Assertions.assertTrue(new File(fileInfo.getPath()).exists())); + + String[] fileIDs = fileInfos.stream() + .map(FileInfo::getId) + .collect(Collectors.toList()) + .toArray(new String[fileInfos.size()]); + + Assertions.assertTrue(service.updateDownloadCount(fileIDs) > 0); + fileInfoList = service.getFiles(fileIDs); + fileInfoList.forEach(info -> Assertions.assertTrue(info.getDownloadCount() > 0)); + + service.reorder( + fileInfoList.get(2).getId(), + fileInfoList.get(1).getId(), + fileInfoList.get(0).getId() + ); + fileInfoList = service.getFiles(fileIDs); + + service.deleteOf(infoType, infoKey); + fileInfoList.forEach(fileInfo -> Assertions.assertFalse(new File(fileInfo.getPath()).exists())); + } } \ No newline at end of file diff --git a/src/test/resources/lombok.config b/src/test/resources/lombok.config index 0a8874c..23be078 100644 --- a/src/test/resources/lombok.config +++ b/src/test/resources/lombok.config @@ -1,2 +1,2 @@ -# see https://projectlombok.org/features/constructor lombok.copyableAnnotations -lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier +# 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 index 02e921c..b457dc0 100644 --- a/src/test/resources/message/message-common.properties +++ b/src/test/resources/message/message-common.properties @@ -1,382 +1,382 @@ -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=\uc138\uc158\uc774 \ub9cc\ub8cc\ub410\uc2b5\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. +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=\uc138\uc158\uc774 \ub9cc\ub8cc\ub410\uc2b5\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 index 5caa11d..e60edec 100644 --- a/src/test/resources/message/message-common_en.properties +++ b/src/test/resources/message/message-common_en.properties @@ -1,277 +1,277 @@ -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. +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 index be0b930..db2928a 100644 --- a/src/test/resources/message/message-common_ko.properties +++ b/src/test/resources/message/message-common_ko.properties @@ -1,375 +1,375 @@ -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. +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-beans.xml b/src/test/resources/spring/context-beans.xml index 8ec9d84..8e82350 100644 --- a/src/test/resources/spring/context-beans.xml +++ b/src/test/resources/spring/context-beans.xml @@ -1,13 +1,13 @@ - - - - + + + + \ No newline at end of file diff --git a/src/test/resources/spring/context-common.xml b/src/test/resources/spring/context-common.xml index 5a3e076..c3ad1ed 100644 --- a/src/test/resources/spring/context-common.xml +++ b/src/test/resources/spring/context-common.xml @@ -1,68 +1,68 @@ - - - - - - - - - - - - - - - - classpath:message/message-common - classpath:message/authentication-message - classpath:org/egovframe/rte/fdl/property/messages/properties - - - - - 60 - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + 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 index dc3465a..dac777f 100644 --- a/src/test/resources/spring/context-datasource.xml +++ b/src/test/resources/spring/context-datasource.xml @@ -1,49 +1,49 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/sql/mapper/base/file-mapper.xml b/src/test/resources/sql/mapper/base/file-mapper.xml index b77d16c..b81ec97 100644 --- a/src/test/resources/sql/mapper/base/file-mapper.xml +++ b/src/test/resources/sql/mapper/base/file-mapper.xml @@ -1,6 +1,6 @@ - + diff --git a/src/test/resources/sql/mapper/base/test.xml b/src/test/resources/sql/mapper/base/test.xml index f62c6fc..2774ae9 100644 --- a/src/test/resources/sql/mapper/base/test.xml +++ b/src/test/resources/sql/mapper/base/test.xml @@ -1,6 +1,6 @@ - + ${sql} diff --git a/src/test/resources/sql/mybatis-config.xml b/src/test/resources/sql/mybatis-config.xml index 03ad4e8..ab0047a 100644 --- a/src/test/resources/sql/mybatis-config.xml +++ b/src/test/resources/sql/mybatis-config.xml @@ -1,25 +1,25 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file