카테고리 없음2024. 9. 27. 23:47

삶의 방향을 바꾸는 5가지 긍정의 질문들. 이렇게 생각하기 시작하면서 인생이 변하기 시작했다.

 

1. 어떻게 하면 앞으로 더 잘 살수있을까?

→ 어떻게 하면 오늘 하루 행복할 수 있을까?

 

2. 앞으로 뭐해먹고 살지?

→ 지금 하는 일, 어떻게 하면 더 잘하지?

 

3. 왜 나한테만 이런 일이 일어나지?

→ 이걸 해결하려면 어떻게 해야하지? 

 

4.나는 왜 이렇게  운이 없지?

→ 앞으로 운이 좋아질려면 어떻게 해야하지?

 

5. 나는 그거 할수없어. 절대 못할거야. 

나는 이렇게 생각하지? 생각에 대한 근거는 뭐지?

Posted by JayCeeP
일/Spring2018. 5. 4. 16:36



fileName     = new String(fileName.getBytes("euc-kr"), "iso-8859-1");


System.out.println("latin1 -> euc=kr" + new String(viewFileName.getBytes("latin1") , "euc-kr")) ; 

System.out.println("utf-8 -> euc-kr        : " + new String(viewFileName.getBytes("utf-8"), "euc-kr"));

System.out.println("utf-8 -> ksc5601       : " + new String(viewFileName.getBytes("utf-8"), "ksc5601"));

System.out.println("utf-8 -> x-windows-949 : " + new String(viewFileName.getBytes("utf-8"), "x-windows-949"));

System.out.println("utf-8 -> iso-8859-1    : " + new String(viewFileName.getBytes("utf-8"), "iso-8859-1"));

 

System.out.println("iso-8859-1 -> euc-kr        : " + new String(viewFileName.getBytes("iso-8859-1"), "euc-kr"));

System.out.println("iso-8859-1 -> ksc5601       : " + new String(viewFileName.getBytes("iso-8859-1"), "ksc5601"));

System.out.println("iso-8859-1 -> x-windows-949 : " + new String(viewFileName.getBytes("iso-8859-1"), "x-windows-949"));

System.out.println("iso-8859-1 -> utf-8         : " + new String(viewFileName.getBytes("iso-8859-1"), "utf-8"));

 

System.out.println("euc-kr -> utf-8         : " + new String(viewFileName.getBytes("euc-kr"), "utf-8"));

System.out.println("euc-kr -> ksc5601       : " + new String(viewFileName.getBytes("euc-kr"), "ksc5601"));

System.out.println("euc-kr -> x-windows-949 : " + new String(viewFileName.getBytes("euc-kr"), "x-windows-949"));

System.out.println("euc-kr -> iso-8859-1    : " + new String(viewFileName.getBytes("euc-kr"), "iso-8859-1"));

 

System.out.println("ksc5601 -> euc-kr        : " + new String(viewFileName.getBytes("ksc5601"), "euc-kr"));

System.out.println("ksc5601 -> utf-8         : " + new String(viewFileName.getBytes("ksc5601"), "utf-8"));

System.out.println("ksc5601 -> x-windows-949 : " + new String(viewFileName.getBytes("ksc5601"), "x-windows-949"));

System.out.println("ksc5601 -> iso-8859-1    : " + new String(viewFileName.getBytes("ksc5601"), "iso-8859-1"));

 

System.out.println("x-windows-949 -> euc-kr     : " + new String(viewFileName.getBytes("x-windows-949"), "euc-kr"));

System.out.println("x-windows-949 -> utf-8      : " + new String(viewFileName.getBytes("x-windows-949"), "utf-8"));

System.out.println("x-windows-949 -> ksc5601    : " + new String(viewFileName.getBytes("x-windows-949"), "ksc5601"));

System.out.println("x-windows-949 -> iso-8859-1 : " + new String(viewFileName.getBytes("x-windows-949"), "iso-8859-1"));

Posted by JayCeeP
카테고리 없음2018. 5. 4. 10:57



http://addio3305.tistory.com/84



Posted by JayCeeP
일/Spring2018. 5. 3. 13:50

웹 어플리케이션 개발에서 대용량 엑셀 다운로드는 항상 골칫거리이다.

한 10만 레코드 정도만 받으려고 해도

1) 일단 레코드를 얻어서 객체로 들고 있는 단계에서 OutOfMemory가 나기도 하고

2) 이걸 간신히 객체로 만든 후에 POI 나 JXL 라이브러리로 Workbook을 생성해 

    데이터를 채워나가다가 OutOfMemory가 나기도 한다. (같은 데이터가 중복되는 셈이니 2배가 되어)

3) 게다가 메모리에 담고 있는 걸 요청자에게 송신하는 시간동안 꼼짝없이 메모리를 잡고 있게 된다.

 

대용량 컨텐츠를 보낼 때는 조금씩 끊어 보내면서 flush를 할 수 있어야 하는데 이게 안되는 게 문제.

 

그래서 보통 다음과 같이 하나하나씩 해결해 나간다.

- 위의 3)번은 일단 파일로 저장하고 이 파일을 다운로드 시켜주는 방식이 가능하다.

- 위의 2)번의 경우 Workbook을 생성해 Row를 채우는 데 쓰인 객체는 해제시켜줄 수 있겠다.

- 아예 Workbook을 생성하지 않고 HTML 로 보내면서 Microsoft Excel 어플리케이션이 열 수 있게 

  응답헤더만 조정하는 방법도 있다.

- 내게 시키는 고객과 잘 협의가 가능하다면 CSV (Comma Separated Values) 포맷으로 다운로드도 

  가능할 것이다. 고객 만족도는 엄청 떨어지겠지만.

 

그런데 이것들을 제대로 해결해 주는 녀석이 등장.

 

Apache POI 3.8-beta3 (2011년 6월) 버전부터 임시파일을 활용하여 메모리 사용량을 최저로 유지하는 기능이 추가되었다.

(Excel 2007부터 지원되는 xslx, 혹은 ooxml 포맷만 가능)

 

확인을 위해 테스트 소스를 작성해 보았다.

 

pom.xml 을 다음과 같이 구성하여 apache-poi를 사용 가능하게 한다.

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>test</groupId>

  <artifactId>test-poi-memory</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <name>test-poi-memory</name>

  <dependencies>

   <dependency>

   <groupId>org.apache.poi</groupId>

   <artifactId>poi-ooxml</artifactId>

   <version>3.10-beta2</version>

   </dependency>

  </dependencies>

</project>

 

 

다음과 같이 소스를 짜 보았다.

 

public class ExcelWriteTest {

 

    public static void main(String[] args) throws Exception{

        OutputStream os = new FileOutputStream("c:/tmp/excelfile.xlsx");

 

        // streaming workbook 생성

        Workbook wb = new SXSSFWorkbook(100); // 100 row마다 파일로 flush

        for(int sheetNum = 0; sheetNum < 6; sheetNum++){ // 시트 6개

            Sheet sh = wb.createSheet();

            Row heading = sh.createRow(1);

            String[] columns = new String[]{"ID", "NAME", "GENDER", "ADDR", "TEL"};

 

            for(int i = 0; i < columns.length; i++) {

                Cell cell = heading.createCell(i+1);

                cell.setCellValue(columns[i]);

            }

 

            for (int rowNum = 2; rowNum < 1048560; rowNum++){

                Row row = sh.createRow(rowNum);

                row.createCell(1).setCellValue("123123123123");

                row.createCell(2).setCellValue("JOHN_CORNER_MARIE_TYPE_PILE_END");

                row.createCell(3).setCellValue("MALE");

                row.createCell(4).setCellValue("Dongjin-Gu, Pyeonsoo-dong, Daeum-chon 2348-112");

                row.createCell(5).setCellValue("010-8422-9548");

            }

        }

 

        wb.write(os);

        os.close();

        ((SXSSFWorkbook)wb).dispose();

}

 

row의 내용들은 의미없이 양만 채운 것이고, 결과적으로 실행하고 나면 100메가 정도짜리 엑셀 파일이 만들어지게 조정했다.




그걸 만드는 몇 분 동안 VisualVM 으로 메모리 사용량을 체크했는데 실행 내내 다음과 같이 2MB 안쪽으로 밖에 쓰지 않는다.



이걸 만들 때 주의할 것은, 시트(!)가 임시 저장소 (윈도우즈의 경우 환경변수 %TEMP% 로 정해진 위치, 유닉스라면 /tmp 일 듯) 에 압축되지 않은 채로 생기는데, 이게 꽤 양을 잡아먹는데다 위 코드의 마지막 줄 dispose() 를 실행하지 않으면 JVM이 종료된 후에도 파일이 사라지지 않는다.


 

그러므로 dispose()는 꼭 해 주는 걸 권장한다.

다만 dispose()를 하게 되면 그 Workbook 객체는 쓸 수 없는 상태가 되므로 가능한 한 마지막(!)에..

 

... 이제 이걸 가지고 다음과 같이 하면 다운로드가 끝난다.

1) 예제처럼 (임시)파일로 저장하고 dispose()한 후, 이를 다운로드 시키고 파일을 삭제한다.

2) 아예 workbook 객체를 가지고 다운로드까지 한 후 dispose() 한다.

 

위 방법 중 1)번은 개발구조 상 layer가 명시적으로 나누어져 있어 layer 간 건네줄 정보가 String(파일위치) 이라는 등 한정적이거나, 파일을 생성후 다운로드 하는 짧(지만 짧지 않)은 시간 동안 디스크 공간 점유가 염려될 때 사용할 수 있겠다. 2)번은 그런 제약이 없을 경우 쓸 수 있고.

 

둘 다 모듈로 일반화 시키려면 적절한 코딩은 필요하고.. 특히 예외사항 (파일 생성 중 오류가 난다거나 파일 생성과 관계없는 곳에서 오류가 날 경우 임시파일의 뒤처리 등등) 에 대한 대응이 잘 짜여 있어야 하겠다.


Posted by JayCeeP
일/office2018. 2. 23. 14:22

워드에서 문서구조로 편히 목차를 확인할려고

 

종종 다단계 번호매기기를 즐겨 쓴다.

 

근데 매번 양식 만들 때마다 한두개씩 기능이 가물가물해서 10~20분씩 삽질하니...

 

더이상은 귀찮다. 정리해 두자.

 

설명은 MS Office Word 2007 버전을 기준으로 한다.

 

 

1. 새문서 열기

 

2. 스타일 목록(1)을 활성화 시키고 새스타일(2)을 클릭

 

3-1. 스타일 목록에 표시될 이름(1)을 입력하고,

3-2. 스타일형식(2)은 '단락'으로 유지

3-3. 스타일기준(3)은 '제목1'로 변경

3-4. 다음 단락의 스타일(4)은 '표준'으로

3-5. 확인(5)을 누르고 '1순위제목'이라는 스타일을 완성

3-6. 3-1~3-6의 과정처럼 '2순위제목'과 '3순위제목'도 만든다. 스타일기준(3) 각각 다르니 유의.

 

4-1. 다시 새스타일을 클릭하고,

4-2. 이름(1)을 입력하고,

4-3. 스타일형식을 '목록'(2)으로 선택

 

5-1. 서식적용대상(1)을 '수준1'을 선택하고,

5-2. 글꼴들(2)을 조정한다.

5-3. 단계가 3단계였으니 나머지 '수준2'와 '수준3'도 서식적용대상(1)에서 선택하여 마찬가지로 글꼴을 조정.

 

6-1. 서식(1)을 클릭하고,

6-2. 번호매기기(2)를 선택.

 

7-1. 자세히(1)를 클릭하여 옵션목록을 확장.

 

8-1. 수준(1)에서 '수준1' 선택하고

8-2. 번호서식(2)을 조정해 준다.

8-3. 그리고 단계에 연결할 스타일(3)에 먼저 만들었던 '1순위제목'을 선택하여 연결

8-4. 8-1~8-3의 과정처럼 '수준2'에 '2순위제목'을, '수준3'에 '3순위제목'을 입력해준다.

8-5. 마지막으로 창 모두 확인(4)을 클릭하여 스타일을 저장.

 

9. 목록에서 생긴 스타일을 확인할 수 있다. 적용해서 사용하면 끝.

  



출처: http://damduc.tistory.com/290

Posted by JayCeeP
일/coding2018. 1. 20. 15:39

여태 개발을 하면서 습관적으로 반복문을 for문만을 사용했다. 알고리즘 공부하다보니 때로는 while을 사용하는 것이 소스 간결함에서 유리할 수 있다는 것을 알았다. 소스가 간결하다는 것은 해석하기도 좋다는 것이다. 이것을 비교하여 정리해본다.


 

 for

while 

사용법 

 for(반복 판단할 변수 초기화/일반적으로 int i=0;

      반복 조건(boolean 형태);

      반복 판단할 변수 처리/일반적으로 i++){

....


구문 처리

...

}

while(반복 여부 판단할 수 있는 boolean 형태/구문 내에 사용하는 변수나 조건으로 판단 할 수 있음){ 

....

구문 처리

또는

구문 처리+반복 여부 판단할 변수 처리

....

}

단순 반복문 구현 적합 

비교적 간단

비교적 귀찮음.

반복 여부 조건이 내용을 구현하면서 달라지는 경우를 고려하여 설계할 경우 for에 비하여 비교적 귀찮음. 또는 반복여부할 변수를 따로 관리해야하니 귀찮음 >> 개발자 자원(시간)이 소요됨.

알고리즘 구현 적합 

for()와 if()문, break문 사용 시 인자 내용 변경등을 고려해야 하기 때문에 소스의 양이 많아지고 가독성이 떨어질 수 있음.

break시점을 생각하지 않고 단순 구현만을 할 경우 필요이상으로 반복하여 퍼포먼스 차이 발생 가능.

비교적 간결

서로 비교한 결론 

단순 반복일 경우 for 문을 사용하는 것이 소스 해석이 더 편하다. 

for안에 if를 사용 && 특정부분에서 break 시키는 것을 원할 경우 while이 더 소스가 간결하다.


결론

-단순 반복문 사용 시 >> for문이 쓰기도 편하고 해석하기도 편하다.

-반복 조건이 유동적으로 변경되는 알고리즘 구현 >> for, if문 break를 사용할 경우 for문보다 while문이 더 간결하게 작성할 수 있다. 이런 경우에 for문 사용 시 반복 조건 및 내부에 여러 변수와 break처리가 쓰이므로 소스가 길어지고 이에 따라 해석이 더 어려워지는 경우가 발생한다.(절대적인 기준은 아님)

Posted by JayCeeP
카테고리 없음2018. 1. 12. 10:28

잘 작동하던 톰캣이 갑자기 아래와 같은 에러를 뱉으며 오류가 발생했다.



1월 12, 2018 10:02:54 오전 org.apache.tomcat.util.digester.SetPropertiesRule begin

경고: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:lrcbo' did not find a matching property.

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Server version:        Apache Tomcat/8.0.0

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Server built:          Nov 3 2016 21:14:13 UTC

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Server number:         8.0.0

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: OS Name:               Windows 7

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: OS Version:            6.1

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Architecture:          amd64

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Java Home:             C:\lrcProject\jdk1.8.0_112\jre

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: JVM Version:           1.8.0_112-b15

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: JVM Vendor:            Oracle Corporation

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: CATALINA_BASE:         C:\lrcProject\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: CATALINA_HOME:         C:\lrcProject\apache-tomcat-8.5.8

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Command line argument: -Dcatalina.base=C:\lrcProject\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Command line argument: -Dcatalina.home=C:\lrcProject\apache-tomcat-8.5.8

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Command line argument: -Dwtp.deploy=C:\lrcProject\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Command line argument: -Djava.endorsed.dirs=C:\lrcProject\apache-tomcat-8.5.8\endorsed

1월 12, 2018 10:02:54 오전 org.apache.catalina.startup.VersionLoggerListener log

정보: Command line argument: -Dfile.encoding=UTF-8

1월 12, 2018 10:02:54 오전 org.apache.catalina.core.AprLifecycleListener lifecycleEvent

정보: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\lrcProject\jdk1.8.0_112\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;D:\app\77100669\product\11.2.0\client_1\bin;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files\Bandizip\;.

1월 12, 2018 10:02:54 오전 org.apache.coyote.AbstractProtocol init

정보: Initializing ProtocolHandler ["http-nio-8080"]

1월 12, 2018 10:02:55 오전 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector

정보: Using a shared selector for servlet write/read

1월 12, 2018 10:02:55 오전 org.apache.coyote.AbstractProtocol init

정보: Initializing ProtocolHandler ["ajp-nio-8009"]

1월 12, 2018 10:02:55 오전 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector

정보: Using a shared selector for servlet write/read

1월 12, 2018 10:02:55 오전 org.apache.catalina.startup.Catalina load

정보: Initialization processed in 1215 ms

1월 12, 2018 10:02:55 오전 org.apache.catalina.core.StandardService startInternal

정보: Starting service Catalina

1월 12, 2018 10:02:55 오전 org.apache.catalina.core.StandardEngine startInternal

정보: Starting Servlet Engine: Apache Tomcat/8.0.0

1월 12, 2018 10:02:57 오전 org.apache.catalina.core.ContainerBase startInternal

심각: A child container failed during start

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]

at java.util.concurrent.FutureTask.report(FutureTask.java:122)

at java.util.concurrent.FutureTask.get(FutureTask.java:192)

at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:939)

at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:890)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1404)

at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1394)

at java.util.concurrent.FutureTask.run(FutureTask.java:266)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at java.lang.Thread.run(Thread.java:745)

Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)

... 6 more

Caused by: java.lang.NoClassDefFoundError: Lorg/apache/commons/logging/Log;

at java.lang.Class.getDeclaredFields0(Native Method)

at java.lang.Class.privateGetDeclaredFields(Class.java:2583)

at java.lang.Class.getDeclaredFields(Class.java:1916)

at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:110)

at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:262)

at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:136)

at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:66)

at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:328)

at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:778)

at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299)

at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94)

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5087)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

... 6 more

Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log

at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)

at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)

... 19 more


1월 12, 2018 10:02:57 오전 org.apache.catalina.core.ContainerBase startInternal

심각: A child container failed during start

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]

at java.util.concurrent.FutureTask.report(FutureTask.java:122)

at java.util.concurrent.FutureTask.get(FutureTask.java:192)

at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:939)

at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:793)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

at org.apache.catalina.startup.Catalina.start(Catalina.java:655)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:355)

at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495)

Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)

at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1404)

at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1394)

at java.util.concurrent.FutureTask.run(FutureTask.java:266)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at java.lang.Thread.run(Thread.java:745)

Caused by: org.apache.catalina.LifecycleException: A child container failed during start

at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:947)

at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:890)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

... 6 more


1월 12, 2018 10:02:57 오전 org.apache.catalina.startup.Catalina start

심각: The required Server component failed to start so Tomcat is unable to start.

org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]]

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)

at org.apache.catalina.startup.Catalina.start(Catalina.java:655)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:355)

at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495)

Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Catalina]]

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)

at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:793)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

... 7 more

Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]]

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)

at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

... 9 more

Caused by: org.apache.catalina.LifecycleException: A child container failed during start

at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:947)

at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

... 11 more


1월 12, 2018 10:02:57 오전 org.apache.coyote.AbstractProtocol pause

정보: Pausing ProtocolHandler ["http-nio-8080"]

1월 12, 2018 10:02:57 오전 org.apache.coyote.AbstractProtocol pause

정보: Pausing ProtocolHandler ["ajp-nio-8009"]

1월 12, 2018 10:02:57 오전 org.apache.catalina.core.StandardService stopInternal

정보: Stopping service Catalina

1월 12, 2018 10:02:57 오전 org.apache.coyote.AbstractProtocol destroy

정보: Destroying ProtocolHandler ["http-nio-8080"]

1월 12, 2018 10:02:57 오전 org.apache.coyote.AbstractProtocol destroy

정보: Destroying ProtocolHandler ["ajp-nio-8009"]




해결방법:

 프로젝트 오른쪽 클릭 > properties > Deployment Assembly 에서 아래와 같이 Maven Dependency룰 추가해준다,




참고 포스트

  • http://lng1982.tistory.com/115
  • http://edmundtips.tistory.com/30


Posted by JayCeeP
일/Spring2018. 1. 11. 11:35


참고 포스트

  • 간단 구현 http://theeye.pe.kr/archives/1593
  • 상세 포스트 http://javacan.tistory.com/entry/133



공통 코드를 찾는 기준으로 캐시를 사용했을 때 기준.



-context-cache.xml


<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:cache="http://www.springframework.org/schema/cache"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd">

<cache:annotation-driven key-generator="simpleKeyGenerator" />

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">

<property name="cacheManager" ref="ehcache" />

</bean>

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">

<property name="configLocation" value="classpath:spring/ehcache.xml" />

<property name="shared" value="false" />

</bean>

<bean id="simpleKeyGenerator" class="org.springframework.cache.interceptor.SimpleKeyGenerator" />

</beans>




-ehcache.xml


<?xml version="1.0" encoding="UTF-8"?>

<ehcache>

<!--

name 캐시의 이름 필수

maxElementsInMemory 메모리에 저장될 수 있는 객체의 최대 개수 필수

eternal 이 값이 true이면 timeout 관련 설정은 무시되고, Element가 캐시에서 삭제되지 않는다. 필수

overflowToDisk 메모리에 저장된 객체 개수가 maxElementsInMemory에서 지정한 값에 다다를 경우 디스크에 오버플로우 되는 객체는 저장할 지의 여부를 지정한다. 필수

timeToIdleSeconds Element가 지정한 시간 동안 사용(조회)되지 않으면 캐시에서 제거된다. 이 값이 0인 경우 조회 관련 만료 시간을 지정하지 않는다. 기본값은 0이다. 선택

timeToLiveSeconds Element가 존재하는 시간. 이 시간이 지나면 캐시에서 제거된다. 이 시간이 0이면 만료 시간을 지정하지 않는다. 기본값은 0이다. 선택

diskPersistent VM이 재 가동할 때 디스크 저장소에 캐싱된 객체를 저장할지의 여부를 지정한다. 기본값은 false이다. 선택

diskExpiryThreadIntervalSeconds Disk Expiry 쓰레드의 수행 시간 간격을 초 단위로 지정한다. 기본값은 120 이다. 선택

memoryStoreEvictionPolicy 객체의 개수가 maxElementsInMemory에 도달했을 때,메모리에서 객체를 어떻게 제거할 지에 대한 정책을 지정한다. 기본값은 LRU이다. FIFO와 LFU도 지정할 수 있다. 선택

-->


<defaultCache

name="defaut"

maxElementsInMemory="100"

eternal="false"

overflowToDisk="false"

timeToIdleSeconds="300"

timeToLiveSeconds="600"

diskPersistent="false"

memoryStoreEvictionPolicy="FIFO"

/>


<!-- msgSvc  -->

<cache

name="msgCache"

maxElementsInMemory="1000"

eternal="false"

overflowToDisk="false"

timeToIdleSeconds="300"

timeToLiveSeconds="600"

diskPersistent="false"

memoryStoreEvictionPolicy="LRU"

/>

<!-- cmCdSvc,cmGrpCdSvc  -->

<cache

name="codeCache"

maxElementsInMemory="1000"

eternal="false"

overflowToDisk="false"

timeToIdleSeconds="300"

timeToLiveSeconds="600"

diskPersistent="false"

memoryStoreEvictionPolicy="LRU"

/>

</ehcache>



-java 구현 파일

*@Cacheable("codeCache") >> value나 cashNames로 설정 가능 @Cacheable(value="codeCache") or @Cacheable(cachNames="codeCache")

*@Cacheable(value="codeCache",key="c#mGrpCd") 형식으로 key를 지정할 수 있음. key를 지정하지 않으면 프레임워크에서 들어온 파라미터를 조합하여 키를 자체 생성하여 관리한다.


@Cacheable("codeCache")

public List searchCmCdList(String cmGrpCd) {

CmCdVo vo = new CmCdVo();

vo.setCmGrpCd(cmGrpCd);

return cboCmDao.selectList(CmCdDao.searchCmCdList, vo);

}

Posted by JayCeeP
일/Spring2018. 1. 11. 11:18

-서비스 명칭 별 트랜잭션 기준


동사 영문명

동사 한글명

* 트랜잭션

acquire

취득

O

adjust

조정

O

apply

적용

O

calcurate

계산

O

cancel

취소

O

certify

인증

O

change

변경

O

check

검사

X

create

생성

O

decide

판단

X

delay

지연

O

delete

삭제

O

delevery

출고

O

find

찾기

X

get

채번

X

handle

처리

O


inhouse

입고

O

isExist

존재

X

issue

발행

O

make

작성

O

manage

관리

O

regist

등록

O

request

요청

O

retrieve

조회

X

save

저장

O

search

검색

X

select

선택

X

send

발송

O

update

수정

O

wait

대기

O

process

처리

O



context-trasaction.xml 파일 내용



<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">


<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"/>

</bean>


<tx:advice id="txAdvice" transaction-manager="txManager">

<tx:attributes>

<tx:method name="check*" read-only="true" propagation="SUPPORTS" timeout="60"/>

<tx:method name="decide*" read-only="true" propagation="SUPPORTS" timeout="60"/>

<tx:method name="find*" read-only="true" propagation="SUPPORTS" timeout="60"/>

<tx:method name="get*" read-only="true" propagation="SUPPORTS" timeout="60"/>

<tx:method name="isExist*" read-only="true" propagation="SUPPORTS" timeout="60"/>

<tx:method name="retrieve*" read-only="true" propagation="SUPPORTS" timeout="60"/>

<tx:method name="search*" read-only="true" propagation="SUPPORTS" timeout="60"/>

<tx:method name="select*" read-only="true" propagation="SUPPORTS" timeout="60"/>


<tx:method name="acquire*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="adjust*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="apply*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="calcurate*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="cancel*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="certify*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="change*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="create*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="delay*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="delete*" rollback-for="Exception" propagation="REQUIRED"  timeout="60"/>

<tx:method name="delevery*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="handle*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="inhouse*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="issue*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="make*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="manage*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="regist*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="request*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="save*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="send*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="update*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="wait*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="process*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

<tx:method name="new*" rollback-for="Exception" propagation="REQUIRES_NEW" timeout="120"/>

<tx:method name="push*" rollback-for="Exception" propagation="REQUIRES_NEW" timeout="120"/>


<!-- Long term transaction -->

<tx:method name="long*" rollback-for="Exception" propagation="REQUIRED" timeout="120"/>

</tx:attributes>

</tx:advice>


<aop:config>

<aop:pointcut id="requiredTx" expression="execution(public * com.프로젝트경로..svc.*Impl.*(..)) || execution(public * com.프로젝트경로.*Impl.*(..))"/>

<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />

</aop:config>


</beans>



Posted by JayCeeP
일/Spring2018. 1. 11. 11:08

-JUnit 관련 문서 즐겨찾기

  • assert 레퍼런스:http://junit.sourceforge.net/javadoc/org/junit/Assert.html

  • junit + mysql 초기세팅:http://all-record.tistory.com/175

  • 롤백설정:http://credemol.blogspot.kr/2011/01/spring-junit-transaction.html


-프로젝트에 로컬 서버 구동만 되어있을 때 JUnit 세팅하기.

  1. 테스트 파일 생성할 Src/test/java/com/프로젝트명/이하 경로 생성
  2. 프로젝트 오른쪽 클릭 > properties
  3. Java Build Path에서 Add Folder 하여 p프로젝트명/src/test/java 선택
  4. 하단 output folder 프로젝트명/target/test-classes 입력
  5. 테스트할 파일 junitTest.java 생성

 

    package com.프로젝트명.이하경로;

     

    import static org.junit.Assert.*;

    import org.junit.BeforeClass;

    import org.junit.Test;

    import org.junit.runner.RunWith;

    import org.springframework.beans.factory.annotation.Autowired;

    import org.springframework.test.context.ActiveProfiles;

    import org.springframework.test.context.ContextConfiguration;

    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

    import org.springframework.test.context.web.WebAppConfiguration;

     

    ....

    테스트할 서비스 관련 import 부분

    .... 


    @RunWith(SpringJUnit4ClassRunner.class)

    @ContextConfiguration(locations="file:src/main/resources/spring/context-*.xml")

    //@ActiveProfiles("pc") >> 이건 프로젝트마다 환경이 다르므로 환경에 맞게 세팅한다

    @WebAppConfiguration

    public class junitTest {

     

    @Autowired

    CboCmDao cboCmDao;

     

    @BeforeClass

    public static void setServerMode() throws Exception {//이 메쏘드에서 테스트 전에 세팅이나 실행되어야할 서버 및 스프링 환경 설정을 해준다.

    //System.setProperty("server.mode", "pc");>>이건 프로젝트마다 환경이 다르므로 환경에 맞게 세팅한다

    }

     

    @Test

    public void test() throws Exception{

    UsrToVo usrVo = cboCmDao.selectOne(LoginDao.selectUsr, "아이디");

     

    assertEquals("내이름",usrVo.getUsrNm());

    }

    }

  1. 위에서 만든 자바파일 오른쪽 클릭 > run as > junit 선택
  2. 실행하여 db연결 되는지 확인
  3. 위에 붉은 글씨 부분을 수정하여 테스트할 서비스로 변경해주면


Posted by JayCeeP