회사 프로젝트에서 Felix 기반 OSGi 환경에서 SQL Server에 연결하려고 할 때 다음과 같은 오류가 발생했다.
java.sql.SQLException: No suitable driver found for jdbc:sqlserver://[host]:[port];database=[db];user=[user];password=[password];
1. 오류 원인
해당 오류는 Java 애플리케이션이 JDBC 드라이버를 찾지 못할 때 발생한다.
일반적인 Java 프로젝트에서는 classpath에 .jar 파일만 추가하면 해결되지만, Felix OSGi 환경에서는 클래스 로딩 방식이 달라 문제 해결이 조금 더 복잡하다.
2. Felix 환경에서 발생한 추가 오류
JDBC 드라이버를 classpath에 추가하고 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");도 호출했지만, 다음과 같은 오류가 발생했다.
java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
OSGi 환경에서는 번들 내에서 명시적으로 Import-Package로 선언되지 않은 패키지를 사용할 수 없기 때문이다.
3. 해결 방법: JDBC 드라이버를 OSGi 번들로 만들기
Maven의 maven-bundle-plugin을 사용하여 mssql-jdbc를 OSGi 번들로 포함시켰다.
pom.xml 설정 예시
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>6.4.0.jre8</version>
</dependency>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.5.3</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Embed-Dependency>mssql-jdbc</Embed-Dependency>
<Embed-Directory>bundle.hmi</Embed-Directory>
</instructions>
</configuration>
</plugin>
4. 새로운 문제: GSSException 클래스 누락
JDBC 드라이버 내부에서 Kerberos 인증 처리를 위해 org.ietf.jgss.GSSException 클래스를 참조하는데, 이 또한 Felix에서 직접 접근할 수 없어 다음과 같은 오류가 발생했다.
java.lang.NoClassDefFoundError: org/ietf/jgss/GSSException
해결 방법
pom.xml의 Import-Package에 다음을 추가했다:
<Import-Package>
org.ietf.jgss,
...
</Import-Package>
또는 임시 해결책으로 실행 시 다음과 같은 JVM 옵션을 추가할 수도 있다:
-Dorg.osgi.framework.bootdelegation=org.ietf.jgss
이는 모듈 경계를 무시하고 클래스를 로드하는 방식이므로, 가능하면 Import-Package를 사용하는 것이 가장 바람직한 해결 방법이다.
5. 최종 결과
- Felix 번들 내부에 JDBC 드라이버 포함 완료
- Class.forName() 호출로 드라이버 명시 로딩 처리
- org.ietf.jgss 패키지 문제 해결
- SQL Server 정상 연결 확인
마무리
Felix 기반의 OSGi 환경에서는 일반적인 Java 프로젝트와 다른 classpath 접근 구조를 갖고 있기 때문에, 드라이버 로딩부터 클래스 접근까지 모두 번들의 구조에 맞지 않으면 작동하지 않는 경우가 많다.
이 경험을 통해 OSGi 환경의 클래스 로딩 구조와 Felix의 번들 처리 방식에 대해 많은 것을 배울 수 있었다.
'트러블 슈팅' 카테고리의 다른 글
Intellij에서만 다른 버전의 JAVA를 사용하고 싶은 경우 (0) | 2025.05.22 |
---|---|
리눅스에서 .sh 실행 시 ^M (bad interpreter) 오류 트러블슈팅 (0) | 2025.04.24 |
String을 Timestamp로 변환할 때 생기는 ClassCastException 문제 분석 (0) | 2025.04.18 |
윈도우에서 특정 포트로 외부 요청이 들어오지 않을 때 확인할 것들 (0) | 2025.04.04 |
[Java]UnsupportedClassVersionError 해결하기(JDK 8로 다시 컴파일하는 방법) (0) | 2025.03.18 |