회사 내부 과제로 MSSQL 과 JDBC 연동하여 DB를 INESERT하고 있었다.
코드를 작성하고 첫번째 발생한 오류는
com.microsoft.sqlserver.jdbc.SQLServerException: 드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다. 오류: "The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]". ClientConnectionId:661cd102-e250-408a-b966-79141847dd2a at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:3806) at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1906) at com.microsoft.sqlserver.jdbc.SQLServerConn
였는데 해결 방법을 확인해보니 JAVA_HOME/lib/security/java.security 파일의 내용을 수정하면 된다고 했는데
나의 자바는 11버전이어서 그런지 몰라도 security 폴더 자체가 없었다.
우선 java1.8버전을 다시 다운 받아서 버전을 내렸다.
local서버로 테스트했을 때는 실행이 되긴했다.
하지만 runnable jar 파일로 생성했을 때
Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:317) at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:259) at java.util.jar.JarVerifier.processEntry(JarVerifier.java:329) at java.util.jar.JarVerifier.update(JarVerifier.java:239) at java.util.jar.JarFile.initializeVerifier(JarFile.java:404) at java.util.jar.JarFile.ensureInitialization(JarFile.java:641) at java.util.jar.JavaUtilJarAccessImpl.ensureInitialization(JavaUtilJarAccessImpl.java:69) at sun.misc.URLClassPath$JarLoader$2.getManifest(URLClassPath.java:995) at java.net.URLClassLoader.defineClass(URLClassLoader.java:456) at java.net.URLClassLoader.access$100(URLClassLoader.java:74) at java.net.URLClassLoader$1.run(URLClassLoader.java:369) at java.net.URLClassLoader$1.run(URLClassLoader.java:363) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:362) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)
와 같은 에러가 또 한번 발생했다.
에러를 해결하기 위해 온갖 방법을 했는데 잘되지 않아서 여러가지 시도를 해보다가 기존에 받았던 sqljdc_11.2를 삭제하고 sqljdbc4.jar로 다운받아서 실행했더니 되는 것처럼 보였다.
근데, 계속해서 문제가 생겼고 sqljdbc42.jar 내의 META-INF/ MSFTSIG.RSA 파일을 삭제하였다.
근데 intellij내에서 삭제가 되지않아 cmd 터미널을 통해 삭제하였다.
zip -q -d sqljdbc42.jar META-INF/MSFTSIG.RSA
이후에 실행했더니 실행은 되었지만 새로 생긴 문제
源?吏??뿰 ???옣 jiyeonkim@hansol.com ?쑄?젙臾? ?꽑?엫 jmyun@hansol.com ?븞寃쎌닔 梨낆엫 gs.ahn@hansol.com
이런식으로 결과값이 한글이 깨져서 나왔다.
System.setProperty("file.encoding","UTF-8");
Field charset = Charset.class.getDeclaredField("defaultCharset");
charset.setAccessible(true);
charset.set(null,null);
코드를 추가하고 다시 jar 파일을 build하니 제대로 실행됨