반응형

상황 : 로컬 서버에서 잘 돌아갔던 파일 업로드가 live 서버에서 정상 작동을 안함

 

에러 메세지 (was) : java.io.IOException: java.io.IOException: Unexpected output data

에러 발생 소스 : multipartFile.transferTo(l_file);

 

원인 : 서버에 디렉토리가 없거나, 소유자와 권한설정이 안되어있음

 

해결 방법 : 디렉토리와 권한 부여

반응형
반응형

 

에러 메세지 : Failed to launch emulator. Reason: Could not start emulator within 30 seconds..

원인 : 버추얼 디바이스 메모리 이슈

 

해결 방법 : 

1. 안드로이드 스튜디오 실행

2. 상위 탭에서 Tools > AVD Manager 클릭

3. 좌측 하단의 Create Virtual Device... 클릭

4. 좌측 phone 탭 > pixel2 디바이스 선택 > 우측 하단 Clone Device... 클릭

5. 최상단 AVD Name을 본인이 알아볼수 있는 명칭으로 설정

6. 중간쯤 Memory 행의 RAM을 768로 설정 후 Finish 클릭

7. 설정한 AVD Name 선택 후 Next

8. 안드로이드 릴리즈버전 선택(난 Andriod 9.0 Pie 버전으로 세팅) 후 Next 

9. Finish

반응형
반응형

발생한 상황 : react-native 세팅 중 npm run android

 

에러 메세지 : error Failed to launch emulator. Reason: Emulator exited before boot..

 

원인 : 버추얼 디바이스 세팅

android SDK 버전을 android 9.0 (pie)로 다운받고 세팅했건만

버추얼 디바이스에서 android 버전을 11 (R)로 설정으로 세팅

 

해결방법 : 버추얼 디바이스를 동일하게 9.0 pie로 세팅

1. 안드로이드 스튜디오 실행

2. 상위 탭에서 Tools > AVD Manager 클릭

3. 좌측 하단의 Create Virtual Device... 클릭

4. 좌측 phone 탭 > pixel2 디바이스 선택 후 Next

5. 안드로이드 릴리즈버전 Andriod 9.0 Pie 버전으로 세팅 후 Next 

6. Finish

반응형
반응형

니가 대수롭지 않게 받아들이면

남들도 대수롭지 않게 생각해

 

니가 심각하게 받아들이면

남들도 심각하게 생각하고

 

니가 아무것도 아니라고 생각하면

아무일도 아니야

 

- 나의 아저씨

반응형
반응형

 

remix.ethereum.org/

 

- ① : 새로운 .sol 파일 생성

- ② : pc에 저장된 .sol 파일 불러오기

- ③ : contract를 작성하는 영역

- ④ : 솔라디티 compile에 관련 설정 탭

- ⑤ : compile 버전 설정 하는 곳 (현재 0.5.0버전 까지 나옴, github에 올라와있는 파일은 0.4.25 버전일때 작성함, 0.4.25 + commit.59dbf8f1 선택)

- ⑥ : 현재 파일에 대해 compile 시작 

- ⑦ : 현재 파일의 contract의 목록

- ⑧ : 선택한 contract의 정보를 볼수 있음(name, metadata, bytecode, abi, web3deploy, metadata hash, swarmlocation, functionhashes, gasestimates, devdoc, userdoc, runtime bytecode, assembly), 주로 bytecode, abi 정도 만 사용

- ⑨ : 해당 contract의 ABI 복사

- ⑩ : 해당 contract의 Bytecode 복사

- ⑪ : contract에 대한 동작을 실행 할 때 보여지는 consol log 

call : web3.ether. 블록체인의 function을 불렀을때 표시

vm : 이 노드로 트랜잭션이 발생됐을때 표시

 

 

- ⓐ : 솔라디티 실행에 관련된 탭

- ⓑ : .sol 파일을 실행 할 환경의 목록 (JavaScript VM, Injected Web3, Web3 Provider)

javascript Vm : 실행 환경이 노드에 연결되지 않고 모든 것이 로컬 및 메모리에서만 실행, remix에서 자체적인 머신

Injected Web3 : Metamask 또는 유사한 공급자가 실행 환경을 제공

Web3 Provider : ganache 또는 geth와 같은 환경으로 실행

- ⓒ : 실행환경과 연결된 계정 목록 (가나슈는 10개의 개정 제공, metamask는 1개의 계정 제공)

- ⓓ : contract 배포시 설정한 수치를 넘어갔을때 실행하지못하게 하기 위한 장치

- ⓔ : 트렌잭션에 실어 보낼 eth

- ⓕ : 현재 .sol 파일에 작성된 contract 목록

- ⓖ : 선택된 contract를 배포(배포시 초기값을 설정해 줘야한다면 택스트박스에 값을 넣어줘야함)

- ⓗ : 주소를 통해 contract를 load, 이미 배포된 선택된 contract와 연결하는 것

- ⓘ : Deploy된 conract(클릭 시 contract에 포함된 function이 보임 ⓙ, 가 예시) 

- ⓙ : 붉은 색의 버튼은 트랜잭션비용을 지불,  이외의 함수 호출 임을 나타냄

- ⓚ : 푸른 색의 버튼은 gas비용없이 트랜잭션없이가져옴, function 호출 시 값을 가져오는 함수임을 나타냄(get 함수)

- ⓛ : Deploy 된 다른 contract

- ⓜ : Deploy 된 모든 contracts 삭제

 

반응형

'개발의 흔적 > Blockchain' 카테고리의 다른 글

블록체인의 목표  (0) 2019.02.12
블록체인 동영상 강좌  (0) 2019.02.12
블록체인 트렌잭션의 이해  (0) 2019.02.12
블록체인 채굴이란  (0) 2019.02.12
블록체인 네트워크에 참여자  (0) 2019.02.12
반응형

error code

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ~[?:1.7.0_80]
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1904) ~[?:1.7.0_80]
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:279) ~[?:1.7.0_80]
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:273) ~[?:1.7.0_80]
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1446) ~[?:1.7.0_80]
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:209) ~[?:1.7.0_80]
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:913) ~[?:1.7.0_80]
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:849) ~[?:1.7.0_80]
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1023) ~[?:1.7.0_80]
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332) ~[?:1.7.0_80]
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359) ~[?:1.7.0_80]
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343) ~[?:1.7.0_80]
        at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:275) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:254) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:123) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:318) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106) ~[httpclient-4.3.4.jar:4.3.4]
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57) ~[httpclient-4.3.4.jar:4.3.4]
        at egovframework.test.www.test.web.TestController.test123(TestController.java:137) [TestController.class:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_80]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_80]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_80]
        at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_80]
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) [spring-web-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) [spring-web-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:747) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:676) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) [javax.servlet_1.0.0.0_2-5.jar:2.5]
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) [spring-webmvc-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [javax.servlet_1.0.0.0_2-5.jar:2.5]
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) [weblogic.jar:10.3.6.0]
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) [weblogic.jar:10.3.6.0]
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301) [weblogic.jar:10.3.6.0]
        at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26) [weblogic.jar:10.3.6.0]
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60) [BUG26519424_10360171017.jar:10.3.6.0]
        at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) [urlrewritefilter-4.0.3.jar:4.0.3]
        at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) [urlrewritefilter-4.0.3.jar:4.0.3]
        at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) [urlrewritefilter-4.0.3.jar:4.0.3]
        at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394) [urlrewritefilter-4.0.3.jar:4.0.3]
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60) [BUG26519424_10360171017.jar:10.3.6.0]
        at com.github.ziplet.filter.compression.CompressingFilter.doFilter(CompressingFilter.java:263) [ziplet-2.3.0.jar:?]
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60) [BUG26519424_10360171017.jar:10.3.6.0]
        at egovframework.com.cmm.filter.HTMLTagFilter.doFilter(HTMLTagFilter.java:35) [HTMLTagFilter.class:?]
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60) [BUG26519424_10360171017.jar:10.3.6.0]
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) [spring-web-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.0.9.RELEASE.jar:4.0.9.RELEASE]
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60) [BUG26519424_10360171017.jar:10.3.6.0]
        at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27) [weblogic.jar:10.3.6.0]
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:60) [BUG26519424_10360171017.jar:10.3.6.0]
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3748) [BUG26519424_10360171017.jar:10.3.6.0]
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3714) [BUG26519424_10360171017.jar:10.3.6.0]
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) [com.bea.core.weblogic.security.identity_1.2.0.0.jar:1.2.0.0]
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) [com.bea.core.weblogic.security.wls_1.0.0.0_6-2-0-0.jar:6.2.0.0]
        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2283) [BUG26519424_10360171017.jar:10.3.6.0]
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2182) [BUG26519424_10360171017.jar:10.3.6.0]
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1499) [BUG26519424_10360171017.jar:10.3.6.0]
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:263) [BUG26519424_10360171017.jar:1.11.0.0]
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:221) [BUG26519424_10360171017.jar:1.11.0.0]
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385) ~[?:1.7.0_80]
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:230) ~[?:1.7.0_80]
        at sun.security.validator.Validator.validate(Validator.java:260) ~[?:1.7.0_80]
        at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326) ~[?:1.7.0_80]
        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231) ~[?:1.7.0_80]
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126) ~[?:1.7.0_80]
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1428) ~[?:1.7.0_80]
        ... 66 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196) ~[?:1.7.0_80]
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268) ~[?:1.7.0_80]
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380) ~[?:1.7.0_80]
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:230) ~[?:1.7.0_80]
        at sun.security.validator.Validator.validate(Validator.java:260) ~[?:1.7.0_80]
        at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326) ~[?:1.7.0_80]
        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231) ~[?:1.7.0_80]
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126) ~[?:1.7.0_80]
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1428) ~[?:1.7.0_80]
        ... 66 more

상황 :  https -> https로 api 호출을 하였으나 상위 에러가 발생, JAVA API 호출시 ssl 에러
- 인증서 인증기관 검증 이슈가 의심되며 클라이언트 서버에 인증기관 목록이 부족하거나 호출하는 api 쪽의 웹서버에 등록된 인증서 체인이 완전하지 않을 수 있음.
- 인증서 확인 사이트에서 호출하는 api url을 검색해봤을 때 인증서 체인 연결에 빨간색 깨진 체인 표시가 확인
이러한 경우 클라이언트에서 중간 인증서까지 모두 가지고 있지 않으면 인증기관 검증이 정상적으로 이루어지지 않을 수 있음 (www.digicert.com/help/)

 

원인 : SSL은 연결하려는 api url의 인증서가 신뢰하는 인증기관 인증서 목록(keystore)에 없음

해결방안1 : api 서버에서 사용하는 사설 인증서를 호출하는 쪽 서버에 등록

해결방안2 : 호출하는쪽 서버에서 사용하는 공인 인증서 구매 및 api 서버에 등록

 

해결방안 2로 해결

반응형
반응형

poi를 활용한 엑셀 다운로드(다른 이름으로 저장) 폴더 및 파일 명 지정

 

서버 환경 
: java1.8
: 전자정부 프레임워크 - 개발자용 개발환경 32bit/64bit(Implementation Tool) Version 3.9.0 

: tomcat8

 

1. pom.xml에 Dependency 추가

<!-- Excel Read/Write 를 위한 Dependency 추가 -->
<dependency>
<groupId>org.apachepoi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>

 

 

2. devfootprint.tistory.com/56

 

전자정부프레임워크 maven 클린 프로젝트 클린 리빌드

war 파일 삭제 후 생성 프로세스 dependency 추가했을 경우 0. Maven > Update Project : pom.xml에 dependency를 내 로컬 pc에 다운로드 그렇지 않을 경우엔 0번 스킵해도 됨 1. 프로젝트 우클릭 > Run as..

devfootprint.tistory.com

3. java 소스

@RequestMapping(value = "/data/downloadDataInfo.do")
public void downloadDataInfo(@RequestParam HashMap<String, Object> commandMap, HttpServletResponse response) throws Exception {

    FileOutputStream fileOut = null;
    // Workbook 생성
    Workbook xlsWb = new HSSFWorkbook(); // Excel 2007 이전 버전
    String sheetname = "sheet1";
    Sheet sheet = xlsWb.createSheet(sheetname);
			
    Font font = xlsWb.createFont();
    font.setFontHeightInPoints((short)10);
    font.setFontName("맑은고딕");
			
    sheet.setColumnWidth(1, 50*256);
    CellStyle style = xlsWb.createCellStyle();
    style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
			
    Row row = null;
    Cell cell = null;
                    
    // 첫번째 행추가
    row = sheet.createRow(0);
    row.setHeight((short)500);
            
    // 첫번째행에 첫번째 컬럼 값 생성
    cell = row.createCell(0);
    cell.setCellValue("test1");
    cell.setCellStyle(style);

    // 첫번째행에 두번째 컬럼 값 생성
    cell = row.createCell(1);
    cell.setCellValue("test2");
    cell.setCellStyle(style);            
            
	         
    response.setContentType("application/octet-stream;");
    response.setHeader("Content-Disposition", "attachment; filename=\"" + new String(filename.getBytes(), "UTF-8") + "\"");
    response.setHeader("Pragma", "no-cache;");
    response.setHeader("Expires", "-1;");

    // excel 파일 저장
    try {
        fileOut = new FileOutputStream("test.xls");
        xlsWb.write(response.getOutputStream());
        fileOut.flush();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(fileOut != null) {
            fileOut.close();
        }
    }
}
반응형
반응형

테이블에 있는 list를 ajax통신을 통해 java로 넘기기 list<Map<String, Object>> 형식

 

 

데이터 형태

{codeArrObj=[
{"newcode":"0001","newcodename":"A 1","codetype":"acode","beforecode":"0001"},
{"newcode":"0002","newcodename":"B","codetype":"acode","beforecode":"0002"},
{"newcode":"0003","newcodename":"C","codetype":"acode","beforecode":"0003"},
{"newcode":"0004","newcodename":"D","codetype":"acode","beforecode":"0004"},
{"newcode":"9999","newcodename":"1234","codetype":"acode","beforecode":"9999"}]
}

 

html 코드 input 값에 있는 여러개의 행 데이터를 java로 넘겨서 update 또는 insert 하고 싶다. 

id name속성이 없어도됨

<input type="hidden" id="codeType" name="codeType" value="${Code[0].codetype}"/>
<table class="table table-striped jambo_table bulk_action" id="codeList_table">
    <thead>
        <tr class="headings">
            <th class="column-title">코드</th>
            <th class="column-title">코드 명</th>
        </tr>
    </thead>
    <tbody>
        <c:forEach var="item" items="${Code}" varStatus="status">
            <tr>
                <td>
                    <input type="text" value="${item.code}" />
                </td>
                <td>
                    <input type="text" value="${item.codename}"/>
                    <input type="hidden" value="${item.code}"/>
                </td>
            </tr>
        </c:forEach>
    </tbody>
</table>

 

javascript 소스 (jQuery)

// ajax controller 매핑용 url을 변수에 담음
var l_url = "/admin/saveCodeAjax.do";
// array 변수 초기화
var codeArr = [];
// object 변수 초기화
var dataObj={};

//원하는 데이터의 형태
/*	
*	{codeArrObj=[
*		{"newcode":"0001","newcodename":"A 경로당 ","codetype":"agencycode","beforecode":"0001"},
*		{"newcode":"0002","newcodename":"B 경로당","codetype":"agencycode","beforecode":"0002"},
*		{"newcode":"0003","newcodename":"C 경로당","codetype":"agencycode","beforecode":"0003"},
*		{"newcode":"0004","newcodename":"D 경로당","codetype":"agencycode","beforecode":"0004"},
*		{"newcode":"9999","newcodename":"1234","codetype":"agencycode","beforecode":"9999"}]
*	}
*/

// for문으로 데이터 생성
for (var i = 0 ; i < $("#codeList_table tbody tr").length; i++){
    // 행 별로 첫번째 input 값을 찾아서 newcode로 초기화 
    var newcode = $("#codeList_table tbody tr").eq(i).children().children().eq(0).val();
    // 행 별로 두번째 input 값을 찾아서 newcode로 초기화 
    var newcodename = $("#codeList_table tbody tr").eq(i).children().children().eq(1).val();
    // 행 별로 세번째 input 값을 찾아서 newcode로 초기화 
    var beforecode = $("#codeList_table tbody tr").eq(i).children().children().eq(2).val();

    // object에 newcode라는 key로 newcode 값 바인딩
    dataObj.newcode = newcode;
    // object에 newcodename라는 key로 newcodename 값 바인딩
    dataObj.newcodename= newcodename;
    // object에 codetype라는 key로 codetype 값 바인딩
    dataObj.codetype= $("#codeType").val();
    // object에 beforecode라는 key로 beforecode 값 바인딩
    dataObj.beforecode= beforecode;

    // array에 object push
    codeArr.push(dataObj);

    // push 후 초기화 해주지 않으면 같은 object로 loop 만큼 push됨 
    dataObj ={};
}

// ajax controller에서 처리할 파라미터를 변수에 담음(json형태)
var jsonData = JSON.stringify(codeArr);

$.ajax({
    url        : l_url,
    type       : "POST",
    dataType   : 'json',
    data       : {codeArrObj : jsonData},
    success    : function(p_resultvalue) {
        $(".evaluation_data").attr('disabled', true);
        alert(p_resultvalue.result_msg);
    }
});

 

java 코드

// 코드 저장하기
@Override
public int saveCodeAjax(HashMap<String, Object> commandMap) throws Exception {
    // codeArrObj를 JSONarray 타입으로 형변환 
    JSONArray array = JSONArray.fromObject(commandMap.get("codeArrObj"));

    // 모든 코드의 결과 값 저장을 위한 초기화
    int[] results= new int[array.size()];

    // 최종 결과값 (정상 저장 될 경우 1로 리턴)
    int result=1;

    // JSONarray타입에 저장된 값 처리
    for(int i=0; i<array.size(); i++){
        // array 안의 값을 object로 세팅
        JSONObject obj = (JSONObject)array.get(i);

        // mybatis에 파라미터로 넘겨줄 map 타입 초기화
        Map<String, Object> resendMap = new HashMap<String, Object>();

        // object의 이전코드명을 파라미터로 세팅(update 해야할 경우를 위해 필요)
        resendMap.put("beforecode", obj.get("beforecode"));
        // object의 코드타입을 파라미터로 세팅(어떤 코드 저장인지 파악을 위해 필요)
        resendMap.put("codetype", obj.get("codetype"));
        // object의 신규코드를 파라미터로 세팅(코드 저장을 위해 세팅)
        resendMap.put("newcode", obj.get("newcode"));
        // object의 신규코드명을 파라미터로 세팅(코드 저장을 위해 세팅)
        resendMap.put("newcodename", obj.get("newcodename"));


        results[i] = DAO.insertCode(resendMap);

        // for문 내부에서 한 코드 업데이트, 인서트가 발생했을경우 
        // 한 건이라도 실패(0)가 나오면 결과값은 0이 됨 
        result *= results[i];
    }

    return result;
}

 

 

반응형
반응형

어플리케이션 배포 특정 페이지만 404 error

서버 환경 
: 네이버 클라우드 플렛폼
: mysql(5.7)-centos-7.2-64 서버 사용
: tomcat 8
: java-1.8.0-openjdk-1.8.0.275.b01-0.el7_9.x86_64
: 전자정부 프레임워크 - 개발자용 개발환경 32bit/64bit(Implementation Tool) Version 3.9.0
: web, was, DB가 한 서버에 있음

1. 늘 그렇듯 배포전 로컬서버에서는 잘 돌아감.
2. /usr/local/tomcat8/conf/server.xml에서 path 설정과 docBase 설정, source 설정을 완벽하게 구성함
3. 특정 페이지 (로그인, 코드 조회 등)는 정상 호출 및 action이 되나 대부분의 페이지는 통신 status가 404
4. 로그상에는 아무것도 안찍힘 (log4j의 레벨을 전부 DEBUG로 수정 배포)
- /usr/local/tomcat8/logs/catalina.2021-01-13.log
5. access 로그상에는 404가 떨어짐 
- /usr/local/tomcat8/logs/localhost_access_log.2021-01-13.txt
6. 인코딩 이슈인 줄 알고 
- /usr/local/tomcat8/conf/server.xml connector에  URIEncoding="UTF-8" 적용
- /usr/local/tomcat8/conf/web.xml filter 태그 추가

<filter>  
    <filter-name>setCharacterEncodingFilter</filter-name>  
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>  
    <init-param>  
        <param-name>encoding</param-name>  
        <param-value>UTF-8</param-value>  
    </init-param>  
    <async-supported>true</async-supported>  
</filter> 


7. 권한 이슈인줄 알고 centos내에서 tomcat user와 group 생성, service 생성하여 톰캣을 구동시켰음에도 변화가 없음
8. 우연히 /usr/local/tomcat8/logs/폴더의 파일 중 catalina.out 파일을 tail을 걸어 보니
4번에서 안찍히던 로그가 보임
### Cause: java.sql.SQLSyntaxErrorException: Table 'sa_db.S_USER' doesn't exist
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException:Table 'sa_db.S_USER' doesn't existexist
9. DB 스키마 설정 및 테이블 데이터를 생성하여 분명 select 하고 배포를 했는데 저런 에러가 떨어짐
10. mysql에서 select * from S_USER를 조회 하니 조회가 안됨
11. 테이블 조회 시 대소문자 구분을 함
12. 테이블 생성 시 테이블명과 컬럼명을 소문자로 생성하였고, 조회를 대문자 테이블명으로 하니 안됨
(희안하게 대문자 컬럼명은 조회 가능)
테이블 명 소문자로 변경 후 배포하니 정상작동

※ 아마 mysql 버전별 테이블의 대소문자를 가리는 이슈일것 같음


※ 로컬 환경에서 잘돌아가서 소스는 문제 없다고 판단, was 로그 확인을 소홀히 했다.
아니 어떤게 찐 was 로그인지 몰랐다. 에러 발생하면 무조건 로그를 확인하자.

 

반응형
반응형

네이버 클라우드 web was db 서버 한 서버로 구축하기-3
Ⅰ. 서버 생성 및 접속
Ⅱ. 서버 접속
Ⅲ. JDK 설치
Ⅳ. tomcat 설치
Ⅴ. 파일 배포
Ⅵ. 서버 실행

https://devfootprint.tistory.com/59

 

네이버 클라우드 web was db 서버 한 서버로 구축하기-1

네이버 클라우드 web was db 서버 한 서버로 구축하기-1 Ⅰ. 서버 생성 및 접속 Ⅱ. 서버 접속 Ⅲ. JDK 설치 Ⅳ. tomcat 설치 Ⅴ. 파일 배포 Ⅵ. 서버 실행 ※ 생성할 서버 스펙 : mysql..

devfootprint.tistory.com

이전 내용 (네이버 클라우드 web was db 서버 한 서버로 구축하기-1)

 

devfootprint.tistory.com/60

 

네이버 클라우드 web was db 서버 한 서버로 구축하기-2

네이버 클라우드 web was db 서버 한 서버로 구축하기-2 Ⅰ. 서버 생성 및 접속 Ⅱ. 서버 접속 Ⅲ. JDK 설치 Ⅳ. tomcat 설치 Ⅴ. 파일 배포 Ⅵ. 서버 실행 ※ 생성할 서버 스펙  : mysql(5.7)-..

devfootprint.tistory.com

이전 내용 (네이버 클라우드 web was db 서버 한 서버로 구축하기-2)

 

 

 

 

 

1. 파일 질라(FTP 프로그램)1. 전자정부 프레임워크에서 war 파일로 패킹하기
url : devfootprint.tistory.com/56

 

전자정부프레임워크 maven 클린 프로젝트 클린 리빌드

war 파일 삭제 후 생성 프로세스 dependency 추가했을 경우 0. Maven > Update Project : pom.xml에 dependency를 내 로컬 pc에 다운로드 그렇지 않을 경우엔 0번 스킵해도 됨 1. 프로젝트 우클릭 > Run as..

devfootprint.tistory.com

 

2. 내 PC에 파일 질라(FTP 프로그램) 설치
설치 url : filezilla-project.org/download.php?type=client

 

Download FileZilla Client for Windows (64bit)

Download FileZilla Client for Windows (64bit) The latest stable version of FileZilla Client is 3.52.0.5 Please select the file appropriate for your platform below. Please select your edition of FileZilla Client FileZilla FileZilla with manual FileZilla Pro

filezilla-project.org

 

3. 네이버 클라우드 서버에 ftp 설치
※ 이 단계에서 너무 막혀서 이런저런 시도가 많았으나 이슈는 호스트명과 포트를 잘 못 입력 했음을 알았다.
ftp가 이미 설치가 되어있어서 구동이 안되어 삭제했다가 다시 깔기도했으며 이런저런 설정도 바꾸어보았으나,
기록이 안되어있다....
 
기억나는대로 적어보겠다.

- 기존 설정 파일이 있는 폴더로 이동
명령어 # cd /etc/vsftpd/

- 기존 설정파일 백업
명령어 # mv vsftpd.conf vsfptd.conf_bak

-- 설정파일 열기
명령어 # vi /etc/vsftpd/vsftpd.conf 
하단에 추가
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
chroot_local_user=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
allow_writeable_chroot=YE
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40000
listen_port=21
listen=YES
pasv_address=네이버 클라우드에 공인 IP 입력

vi /etc/vsftpd/ftpusers
root 제거

vi /etc/vsftpd/user_list
root 제거

 

4. FTP 붙기
- 내 PC에 파일 질라(FTP 프로그램) 실행
- 상단 메뉴에서 파일 > 사이트 관리자
프로토콜 : SFTP - SSH File Transfer Protocol
호스트 : 네이버 클라우드 서버에 포트포워딩 정보에 나와있는 서버접속용 공인 ip 입력 
포트 : 네이버 클라우드 서버에 포트포워딩 정보에 나와있는 외부포트 입력 
사용자 : root
비밀번호 : 네이버 클라우드에서 서버 우클릭 > 관리자 비밀번호 확인 > pem파일 upload 후 나오는 비밀번호 입력

 

5. 파일질라에서 war 파일 배포
- 파일 질라 좌측(내 PC)에서 war패킹된 경로로 이동
- 파일 질라 우측(네이버 클라우드 서버)에서 /usr/local/tomcat8/webapps/로 이동 후 프로젝트 명으로 폴더 생성
- war 패킹된 파일을 우측에 생성된 폴더로 복사
- putty에서 압축해제
명령어 # cd /usr/local/tomcat8/webapps/프로젝트 명/ 
명령어 # unzip war패킹파일명.war

 

6. putty에서 tomcat 설정 변경
- 배포한 파일 경로 설정
명령어 # vi  /usr/local/tomcat8/conf/server.xml

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
host 태그 내부에 하기의 내용 추가
<Context path="/" docBase="프로젝트 명" reloadable="false" source="org.eclipse.jst.jee.server:프로젝트 명" />

 

7. putty에서 8080포트를 80포트로 변경
명령어 # iptables -t nat --append PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080



8. putty에서 tomcat 서버 구동
명령어 # cd /usr/local/tomcat8/bin
명령어 # startup.sh

 

9. 내 pc에서 배포한 웹 페이지 접속
브라우저에서 네이버 클라우드 서버에 공인 IP(Instance ID) 입력

반응형

+ Recent posts