상황 : 로컬 서버에서 잘 돌아갔던 파일 업로드가 live 서버에서 정상 작동을 안함
에러 메세지 (was) : java.io.IOException: java.io.IOException: Unexpected output data
에러 발생 소스 : multipartFile.transferTo(l_file);
원인 : 서버에 디렉토리가 없거나, 소유자와 권한설정이 안되어있음
해결 방법 : 디렉토리와 권한 부여
상황 : 로컬 서버에서 잘 돌아갔던 파일 업로드가 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
[오류] error Failed to launch emulator. Reason: Emulator exited before boot.. (1) | 2021.11.06 |
---|
발생한 상황 : 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
[오류] Failed to launch emulator. Reason: Could not start emulator within 30 seconds.. (0) | 2021.11.06 |
---|
니가 대수롭지 않게 받아들이면
남들도 대수롭지 않게 생각해
니가 심각하게 받아들이면
남들도 심각하게 생각하고
니가 아무것도 아니라고 생각하면
아무일도 아니야
- 나의 아저씨
이 순간 기억하고 싶은 명언 2번째 (0) | 2019.03.05 |
---|---|
이 순간 기억하고 싶은 명언 1번째 (0) | 2019.02.14 |
신입사원이 알아두면 좋은 명언 5번째 (0) | 2018.05.30 |
신입사원이 알아두면 좋은 명언 4번째 (0) | 2016.03.30 |
신입사원이 알아두면 좋은 명언 3번째 (0) | 2016.03.02 |
- ① : 새로운 .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 삭제
블록체인의 목표 (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로 해결
[오류] 스프링 ajax controller 접근 전 response 500 error (0) | 2022.03.24 |
---|---|
[오류] java.io.IOException: java.io.IOException: Unexpected output data (0) | 2022.03.24 |
poi를 활용한 엑셀 다운로드(다른 이름으로 저장) 폴더 및 파일 명 지정 (0) | 2021.01.19 |
전자정부프레임워크 maven 클린 프로젝트 클린 리빌드 (0) | 2021.01.13 |
전자정부 프레임워크에서 log 커스터마이징 하기 (0) | 2019.09.05 |
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
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;
}
form 에서 check box 값 전달 spring에서 처리(다중 check value 전달) (0) | 2021.01.14 |
---|---|
jstl 체크 박스 c:forEach 생성 후 c:forEach 로 checked 표시 (0) | 2021.01.13 |
google traslate 구버전에서 자동 번역 기능 추가 하는 방법 (1) | 2019.02.12 |
[jQuery] 여러 건의 ajax 통신 (2) | 2018.08.29 |
웹 접근성 점검 규칙(웹 접근성 오류 해결 방안) (1) | 2016.03.22 |
어플리케이션 배포 특정 페이지만 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 (0) | 2021.01.14 |
---|---|
네이버 클라우드 web was db 서버 한 서버로 구축하기-2 (0) | 2021.01.14 |
네이버 클라우드 web was db 서버 한 서버로 구축하기-1 (0) | 2021.01.14 |
svn 계정등록 (0) | 2018.05.30 |
네이버 클라우드 web was db 서버 한 서버로 구축하기-3
Ⅰ. 서버 생성 및 접속
Ⅱ. 서버 접속
Ⅲ. JDK 설치
Ⅳ. tomcat 설치
Ⅴ. 파일 배포
Ⅵ. 서버 실행
https://devfootprint.tistory.com/59
이전 내용 (네이버 클라우드 web was db 서버 한 서버로 구축하기-1)
이전 내용 (네이버 클라우드 web was db 서버 한 서버로 구축하기-2)
1. 파일 질라(FTP 프로그램)1. 전자정부 프레임워크에서 war 파일로 패킹하기
url : devfootprint.tistory.com/56
2. 내 PC에 파일 질라(FTP 프로그램) 설치
설치 url : filezilla-project.org/download.php?type=client
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) 입력
웹 어플리케이션 특정 페이지만 404 error (0) | 2021.01.14 |
---|---|
네이버 클라우드 web was db 서버 한 서버로 구축하기-2 (0) | 2021.01.14 |
네이버 클라우드 web was db 서버 한 서버로 구축하기-1 (0) | 2021.01.14 |
svn 계정등록 (0) | 2018.05.30 |