반응형

myBatis와 iBatis에서 쿼리를 실행할때 PrepareStatement 방식으로 작동을 하게 되고 이때 쿼리로 전달값은 값을 각각 아래처럼 적용한다.

1
2
3
4
5
6
7
8
9
<!-- ibatis 방식-->
<insert id="insertQuery" parameterType="java.util.Map">
    INSERT INTO table (id , name, title) VALUES (#id#, #name#, #title#)
</select>
 
<!-- mybatis 방식 -->
<insert id="insertQuery">
    INSERT INTO table (id , name, title) VALUES (#{id}, #{name}, #{title})
</insert>

그런데 이때 insert 하려는 값 중에 null이 전달되었을 경우 오라클에서는

uncategorized SQLException for SQL []; SQL state [99999]; error code [17004]; 부적합한 열 유형: 1111; nested exception is java.sql.SQLException: 부적합한 열 유형: 1111

이런 에러를 발생시키게 된다. Spring을 사용했을 경우는 이런에러를 발생시킨다.

Caused by: org.springframework.jdbc.UncategorizedSQLException: Error setting null parameter.  Most JDBC drivers require that the JdbcType must be specified for all nullable parameters. Cause: java.sql.SQLException : 부적합한 열 유형: 1111

그렇다고 항상 쿼리에서 null을 체크하는 방식을 사용하는것은 너무나도 귀찮은 일!! 그래서 if(myBatis)문 혹은 isNotEmpty(ibatis)를 사용하지 않는 방법이 있다. (자세히 보면 Spring Framework에서 발생시키는 에러에 답이있다.)  

1
2
3
4
5
6
7
8
9
<!-- ibatis 방식-->
<insert id="insertQuery" parameterType="java.util.Map">
    INSERT INTO table (id , name, title) VALUES (#id:VARCHAR#, #name:VARCHAR#, #title:VARCHAR#)
</insert>
 
<!-- mybatis 방식 -->
<insert id="insertQuery">
    INSERT INTO table (id , name, title) VALUES (#{id, jdbcType=VARCHAR}, #{name, jdbcType=VARCHAR}, #{title, jdbcType=VARCHAR})
</insert>

위와 같이 전달되는 파라미터 값의 jdbcType이 무엇인지를 정해 주면 쿼리는 자연스럽게 null로 변경되어 insert query가 수행된다.(물론 해당 column이 NULL값을 저장가능한 column 이어야 한다) 지원하는 jdbcType은 아래와 같다.

  1. BIT
  2. FLOAT
  3. CHAR
  4. TIMESTAMP
  5. OTHER
  6. UNDEFINED
  7. TINYINT
  8. REAL
  9. VARCHAR
  10. BINARY
  11. BLOB
  12. NVARCHAR
  13. SMALLINT
  14. DOUBLE
  15. LONGVARCHAR
  16. VARBINARY
  17. CLOB
  18. NCHAR
  19. INTEGER
  20. NUMERIC
  21. DATE
  22. LONGVARBINARY
  23. BOOLEAN
  24. NCLOB
  25. BIGINT
  26. DECIMAL
  27. TIME
  28. NULL
  29. CURSOR

쿼리마다 적당이 jdbcType을 지정해서 사용하자.


출처 : http://krespo.net/163

반응형
반응형

]vi .bashrc

alias goXXX='cd dddd'

에서 내용 등록 후 저장


source .bashrc 로 등록 하면 끝!!!!


반응형
반응형

WS-Security (Web Services Security, short WSS) is an extension to SOAP to apply security to web services. It is a member of the WS-* family of web service specifications and was published by OASIS.

The protocol specifies how integrity and confidentiality can be enforced on messages and allows the communication of various security token formats, such as SAML, Kerberos, and X.509. Its main focus is the use of XML Signature and XML Encryption to provide end-to-end security.



[추가필요한 lib]


<!-- WS-Security -->

<dependency>

<groupId>org.apache.ws.security</groupId>

<artifactId>wss4j</artifactId>

<version>1.6.4</version>

</dependency>

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-rt-ws-security</artifactId>

<version>2.4.1</version>

</dependency>

<dependency>

<groupId>com.sun.xml.ws</groupId>

<artifactId>jaxws-rt</artifactId>

<version>2.2.9-b14002</version>

</dependency>

[ClientPasswordCallback.java 추가생성]


import java.io.IOException;


import javax.security.auth.callback.Callback;

import javax.security.auth.callback.CallbackHandler;

import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.ws.security.WSPasswordCallback;

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

import org.springframework.stereotype.Component;


@Component

public class ClientPasswordCallback implements CallbackHandler

{

@Value("${webservice.wssecurity.accept.passwd}")

private String wssecurityAcceptId;

   public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException

   {

      WSPasswordCallback pc = (WSPasswordCallback)callbacks[0];

         pc.setPassword(wssecurityAcceptId);

   }

}



[consumer에 추가할 코드]


xxxxxClass {

@Value("${webservice.wssecurity.accept.id}")

private String wssecurityAcceptId;


try{

       JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

       factory.setServiceClass(PSFmsTOneossGetOrgCarPort.class);


       factory.setAddress("http://osb/ABCD/GetsdtddodoDfc");


       PSFmsTOneossGetOrgCarPort port = (PSFmsTOneossGetOrgCarPort)factory.create();


       Client client = ClientProxy.getClient(port);

       Endpoint cxfEndpoint = client.getEndpoint();

       Map<String, Object> outProps = new HashMap<String, Object>();

       

       outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);       

       outProps.put(WSHandlerConstants.USER, wssecurityAcceptId);

       outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);       

       outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, ClientPasswordCallback.class.getName());


       WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);

       cxfEndpoint.getOutInterceptors().add(wssOut);

       

       위 코드 추가 후....

       위에서 생성된 port로 웹서비스 호출하면 끝

       

   }

   


   

   

ps. 물론 provider에도 인증 계정정보 셋팅 필요


       

          

반응형

'WebService' 카테고리의 다른 글

WSDL  (0) 2015.12.31
반응형

maven을 사용하고 있다면 아래의 jar파일을 우선적으로 가져와야한다.

 

# pom.xml 설정

 

dependencies에 아래와 같이 선언한다.

 

 <dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-neo4j-tx</artifactId>
  <version>2.1.0.RELEASE</version>
  <exclusions>
   <exclusion>
    <artifactId>cglib</artifactId>
    <groupId>cglib</groupId>
   </exclusion>
  </exclusions>
 </dependency>
 <dependency>
  <groupId>org.neo4j</groupId>
  <artifactId>neo4j-kernel</artifactId>
  <version>1.8</version>
 </dependency>

 

 

 

 

 

# 데이터소스 설정

  데이터소스는 dbcp로 설정!!

  
 <!-- DataSource from DBCP -->
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
       <property name="driverClassName" value="${database.driver.ClassName}" />
      <property name="url" value="${database.url}" />
      <property name="username" value="${database.username}" />
      <property name="password" value="${database.password}" />
 </bean>

 

<bean id="dataSource_remote" class="org.apache.commons.dbcp.BasicDataSource">

    블라~블라~
</bean>

 

 

 

 

# context 설정

 

 <tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/> 

 -> proxy-target-class="true"는 class class 기반 일경우에 true~!!! Interface 기반이면 삭제 해도 무관하다 default가 false 이다!

 

 <bean id="transactionManagerAcet"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />
 </bean>


 <bean id="transactionManagerAcetRemote"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource_remote" />
 </bean>

 

 <bean id="transactionManager"    <--- 대표가 되는 트랜잭션 manager~!
  class="org.springframework.data.neo4j.transaction.ChainedTransactionManager"
  lazy-init="false">
  <constructor-arg>
   <list>
    <ref bean="transactionManagerAcet" />
    <ref bean="transactionManagerAcetRemote" />
   </list>
  </constructor-arg>
 </bean>     

 

반응형
반응형


2개의 logger가 같은 appender를 사용하면, 로그가 중복으로 출력된다.
이때, additivity=false 로 해주면, 중복적인 출력이 방지된다.

즉,
<logger name="com.a" additivity="true">
    <level value="DEBUG" />
               <appender-ref ref="test_file" />
</logger>

<logger name="com.a.b.c" additivity="false">
<level value="DEBUG" />
  <appender-ref ref="test_file" />
  <appender-ref ref="test_console" />
  <appender-ref ref="test_package" />
</logger>


additivity="false" 를 true로 하게되면, com.a.b.c 소스에 대한 로그가 test_file 에 2번 찍히게 된다.

따라서, false 해주어 중복로깅 방지처리가 필요하다.



반응형
반응형

ERROR:  not all tokens processed


********** 오류 **********


ERROR: not all tokens processed

SQL 상태:42601








인 경우 to_date( '4', 'yyyyMMdd' ),   와 같이 date 함수에 값을 이상하게 넣는 경우이다.

하나의 예 


반응형
반응형
어느 날 회사 출근해서 이클립스를 띄웠는데 갑자기 뜨질 않았다.

이클립스 하단의 상태표시줄에 building workspace 0%.. 까지만 뜨고 응답없음.

메모리 수치도 바꿔보고 이것 저것 해보다가 안대서 검색해보니 여러가지 방법이 있었는데..

메뉴의 Window - Preferences - General - Workspace 에서 Build automatically 를 체크해제하라는 답이 가장 괜찮아 보였다. 하지만 이클립스가 아예 뜨지 않는 상황이라서 -_-;;

좀 더 찾아보니 우리의(?) 스택 오버플로우 사이트에서 아래와 같은 답변을 찾음!


그래서 워크스페이스 폴더의 .metadata\.plugins\org.eclipse.core.resources\projects 에 들어가서 프로젝트들 폴더를 다른 곳으로 옮겨놓고 시동하니 잘됨.

그런데 폴더가 없어서 문제가 되는 프로젝트도 있어서, 하나씩 다시 원래 위치로 옮겨놓았더니 아무런 에러없이 잘된다.

이상, 뭔가 아예 시동이 안될 경우 해볼 수 있는 팁이였다 -_-ㅋ


반응형

'각종Tip모음' 카테고리의 다른 글

apache poi 메모리 이슈해결  (0) 2019.01.26
apache poi 메모리 해결을 위한 팁- StreamingReader  (0) 2018.10.18
@SuppressWarnings  (0) 2013.11.28
반응형



[수정전]

response.setContentType("application/x-download");

response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(orgFileName, "UTF-8"));

response.addHeader("Pragma", "no-cache");

response.addHeader("Expires", "0");


[수정후]

response.setHeader("Expires", "");

response.setHeader("Cache-Control", "");

response.setHeader("Pragma", "");

response.setContentType("application/x-download");

response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(orgFileName, "UTF-8"));

보안 사항은 모르겠고~~~

ㅋ 어쨋든 해결


반응형
반응형

SSL 참고: http://www.ibm.com/developerworks/kr/library/ac-iscssl1/index.html

HTTPS 란 SSL 소켓을 이용한 HTTP 프로토콜이다.
TCP 소켓 대신 SSL 소켓을 이용해서 서로 통신하고 HTTP 프로토콜에 맞게 데이터를 주고 받는 방식이 되겠다.

SSL 소켓을 이용하게 되면 대략 아래와 같은 접속 순서를 갖게 된다. (자세히 설명하지 않음)
1. 클라이언트가 서버에 접속한다.
2. 서버가 클라이언트에 인증서를 보낸다.
3. 클라이언트는 인증서를 검사한다.
4. 성공인 경우 통신을 시작한다.

만약 서버측도 클라이언트를 인증해야 하는 경우 아래와 같다. (Mutual authentication)
1. 클라이언트가 서버에 접속한다.
2. 서버가 클라이언트에 인증서를 보낸다.
3. 클라이언트는 인증서를 검사한다.
4. 성공이고 서버가 클라이언트 인증서를 요구하는 경우 서버로 클라이언트 인증서를 전송한다.
5. 서버가 클라이언트 인증서를 검사한다.
6. 성공인 경우 통신을 시작한다.

!) 인증 당하는 주체는 key 가 필요하고 인증을 하는 주체는 key를 인증하는 인증서가 필요하다.

Apache Tomcat 서버 SSL 설정하기

1. Portecle

Keystore 생성/편집 작업을 편리하게 해주는 도구
다운로드: http://portecle.sourceforge.net/
key 저장소를 만들 수도 있고 신뢰할 수 있는 인증서 저장소를 만들 수도 있다.

2. Keystore 만들기
서버 key 저장소를 만든다. Tomcat 서버가 클라이언트로 보낼 key 를 만든다.
2.1. portecle 를 실행한다.


2.2. JKS 저장소를 생성한다.


2.3. key 를 생성한다.



Common Name 에 호스트 이름을 적어준다.
Hostname 을 비교하는 클라이언트의 경우 Common Name 이 접속한 hostname 과 다르면 연결 실패하는 경우가 있다.

Alias 는 원하는대로 정한다.



2.4. JKS 저장소를 저장한다.

3. [Tomcat 설정] server.xml 수정
예) [Tomcat 경로]/keystore/ 에 server-keystore.jks 라는 파일명으로 keystore 를 저장했다.

3.1. [Tomcat 경로]/conf/server.xml 파일 수정하기
아래 내용을 찾아 주석을 풀어준다.

<!--
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
    maxThreads="150" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS" />
-->

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
    maxThreads="150" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS" />

3.2. keystore 파일 위치와 keystore 비밀번호를 설정한다.

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
    keystoreFile="keystore/server-keystore.jks" keystorePass="changeit"
    maxThreads="150" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS" />

3.3. Tomcat server 를 시작한다.
 [Tomcat 경로]/bin/startup.bat 또는 startup.sh 를 실행

4. 테스트
4.1. 크롬 브라우저로 접속
!) 포트 번호에 주의한다. 위 server.xml 파일 수정한 부분에 port 번호로 접속해야 한다.

4.2. 개인이 만든 인증서 이기 때문에 안전하지 않다는 메시지를 보게 될 것이다.

4.3. 무시하면 접속이 된다.

서버에 접속하게 되면 서버가 클라이언트로 서버측 인증서를 전송하게 된다.
클라이언트는 자신이 갖고 있는 신뢰할 수 있는 인증서 목록을 이용하여 인증서를 검사한다.



추가 사항) curl 로 테스트하기

공인 인증 기관으로 부터 인증된 서버에 접속할 때는 공인 인증된 인증서 파일을 이용해서 인증할 수 있다.
curl 용 인증서 파일은 아래에서 다운로드 받을 수 있다. PEM 포맷이다.
대부분의 인터넷에 공개된 사이트들은 위 인증서 파일로 인증 가능할 것이다.

curl 실행시 인증서 파일을 지정하려면 -- cacert 옵션을 이용한다.
--cacert 옵션
예) curl --cacert cacert.pem https://<url>:<port>

구글에 접속해 보았다.
$ curl --cacert caert.pem https://www.google.com

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="https://www.google.co.kr/">here</A>.
</BODY></HTML>

302 (redirect) 코드를 따라 가려면 -L 옵션을 주면 된다.
$ curl --cacert caert.pem -L https://www.google.com

JKS 저장소 를 PEM 으로 변환해야 curl 에서 사용할 수 있다.
 - JKS 를 PEM 파일로 변환하기
참고: http://www.swview.org/node/191
 ㄱ. Portecle 를 이용해 JKS 파일을 PKCS#12 형태로 export 한다.
 ㄴ. openssl 을 이용해서 pem 파일로 변환한다.
  예) $ openssl pkcs12 -in mystore.p12 -out mystore.pem -passin pass:mysecret -passout pass:mysecret
 ㄷ. 당연한 이야기 이지만 pem 파일의 읽기 권한을 줘야 한다.
  예) $ chmod 655 mystore.pem

!) JKS 를 PKCS#12로 변경하려 할 때 에러가 나는 경우가 있다.
참고: http://tjjava.blogspot.com/2011/07/invalidkeyexception-illegal-key-size.html

 - 자바 사이트에서 JCE(Java Cryptography Extension) 를 다운로드 받아 덮어쓰기 하면 된다.

설치된 Java 버전에 맞는 파일을 다운로드 받는다.

[JRE 경로]/lib/security/ 에 덮어쓰기한다. (혹시 모르니 기존 파일을 백업해 두자)
 - Mac OS JRE 경로 : /Library/Java/Home
 - 윈도 JRE 경로 : c:/program files/java/jre

테스트 예)
$ curl --cacert mystore.pem https://localhost:8443


추가 사항) 서버측도 클라이언트를 인증 하고자 하는 경우(Mutual authentication)
ㄱ. Trust store (신뢰할 수 있는 인증서 저장소) 만들기
  1) 우선 해당 클라이언트를 검증할 인증서 파일이 필요하다. 검증 가능한 인증서는 key 를 갖고 있는 주체가 생성하여 전달해야 한다.
  2) keystore 를 만드는 과정과 비슷하다. Portecle 를 이용해 JKS 저장소를 만들고 클라이언트 인증서 파일을 import 하면 된다.
ㄴ. server.xml 파일 수정
  - truststore 의 위치와 패스워드를 입력한다.
  - clientAuth 를 true 로 설정해야 한다.

예) [tomcat 경로]/keystore/ 에 truststorejks 라고 저장했다고 가정

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
    keystoreFile="keystore/server-keystore.jks" keystorePass="changeit"
   truststoreFile="keystore/truststore.jks" truststorePass="changeit"
    maxThreads="150" scheme="https" secure="true"
    clientAuth="true" sslProtocol="TLS" />


반응형
반응형

사설인증서 생성을 위한 OpenSSL (for Windows) 사용방법

사설인증서 생성을 위한 OpenSSL 사용방법 입니다.

간단하게 Access Gateway (Netscaler) 를 통해 생성하셔도 되고.. OpenSSL을 통해 생성하셔도 되겠습니다.

 

1. OpenSSL 다운로드

http://code.google.com/p/openssl-for-windows/downloads/list 에서 32비트 또는 64비트 버전을 다운로드 합니다.

2. 압축해제 후 해제된 폴더의 libeay32.<wbr />dll, ssleay32.<wbr />dll 파일을 %Systemroot%\System32 폴더에 붙여넣습니다.

3. OpenSSL 폴더 하위에 아래그림과 같이 demoCA 폴더를 생성합니다.

 

4. DemoCA 폴더 하위에 serial 이라는 파일을 생성합니다. (주의) 확장자가 없습니다.

5. index.txt 텍스트 파일을 생성합니다. index.txt 파일에 00 (숫자) 입력 후 저장합니다.

 

6. OpenSSL 폴더 하위에 있는 openssl.cnf 파일을 OpenSSL > Bin 폴더로 복사합니다.

이제 OpenSSL 사용을 위한 준비는 완료되었습니다..

 

7. CMD 실행 후 OpenSSL > BIN 폴더로 이동합니다.

 

 

*** 사설인증서 생성

1. CA 인증서 생성

1.1 CA인증서의 키를 생성하기 위해 아래 명령어를 입력합니다. 완료 후 CA.key 생성

C:\openssl\bin>openssl genrsa -des3 -out CA.key 1024
Loading 'screen' into random state - done
Generating RSA private key, 1024 bit long modulus
....................++++++
....................++++++
e is 65537 (0x10001)
Enter pass phrase for CA.key: XXXX
Verifying - Enter pass phrase for CA.key: XXXX

 

1.2 CA인증서를 생성하기 위해 아래 명령어를 입력합니다. 완료 후 CA.crt 생성됨.

C:\openssl\bin>openssl req -new -x509 -days 365 -key CA.key -out ca.crt -config openssl.cnf
Enter pass phrase for CA.keyCakey의 pass Phrase 입력
Loading 'screen' into random state - done
You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank.

Country Name (2 letter code) [AU]: 
State or Province Name (full name) [Some-State]: 
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []: CA인증서의 도메인 명이 되므로 신중하게 입력 (ex. CA.daou.com)
Email Address []:

 

2. 서버인증서 생성

2.1 서버인증서의 키를 생성하기 위해 아래 명령어를 입력합니다. 완료 후 Server.key 생성됨.

C:\openssl\bin>openssl genrsa -des3 -out Server.key 1024
Loading 'screen' into random state - done
Generating RSA private key, 1024 bit long modulus
.......................................................++++++
.........................................................++++++
e is 65537 (0x10001)
Enter pass phrase for ad.key:
Verifying - Enter pass phrase for ad.key:

2.2 서버인증서의 CSR 생성을 위해 아래 명령어를 입력합니다. 완료 후 Server.csr 생성됨.

C:\openssl\bin>openssl req -new -days 365 -key Server.key -out Server.csr -config openssl.cnf
Enter pass phrase for ad.key:
Loading 'screen' into random state - done
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []: DNS에 등록된 도메인명과 동일하여야 함. 불일치 시 오류. ex) vpn.daou.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

 

2.3 CA로 부터 생성된 CSR 이슈 및 서버인증서를 생성합니다. 완료 후 Server.crt 생성됨.

(중요) 대소문자 주의

C:\openssl\bin>openssl x509 -req -in Server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out Server.crt -days 365
Loading 'screen' into random state - done
Signature ok
subject=/C=bb/ST=bb/L=bb/O=bb/OU=bb/CN=KRXAD1.oa.org/emailAddress=bb@bb.bb
Getting CA Private Key
Enter pass phrase for ca.key:

 

생성된 Server.crt, Server.key를 메모장으로 연 후 Server.key의 내용이 위쪽에 오도록 파일을 병합합니다.

병합 후 Server.crt 로 저장합니다.

 

생성된 CA.crt(루트인증서), Server.crt(서버인증서) 를 이용하시면 되겠습니다..

더 많은 OpenSSL 이용방법은 http://www.openssl.org/docs/apps/openssl.html 를 참고 하세요..




반응형

+ Recent posts