트러블 슈팅

[Java/Felix] SQL Server JDBC 연결 오류 트러블슈팅

kchs0529 2025. 4. 21. 11:28

회사 프로젝트에서 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의 번들 처리 방식에 대해 많은 것을 배울 수 있었다.