❌ Error

[Error] java.lang.IllegalStateException: Failed to load ApplicationContext - h2 DB Connection

박갈 2023. 2. 3. 05:36
반응형

1️⃣ 개요

인프런 김영한님의 '실전! 스프링 부트와 JPA 활용 1' 편을 듣다가 MemberRepositoryTest 도중 발생했다.

데이터베이스 연결하는데에 문제가 있었는지 한참을 찾아봤다.

처음에 커뮤니티를 다 뒤져봐도 해결이 안되길래 전전긍긍하다가 우연히 발견한 방법을 해결했다. 기분 날아갈듯 진짜?

 

보니까 나처럼 비슷한 오류가 발생한 사람이 많은 것 같은데 시도했던 몇 가지 해결법을 작성하겠다.

우선 나는 build.gradle 과 application.yml 파일부터 다시 확인해봤다.

 


2️⃣ 해결 방법

1) build.gradle

 

[1] dependencies

 

우선 build.gradle 파일에서 dependencies를 보면 대부분 자동으로 추가됐겠지만, h2 데이터베이스 관련 내용이 없는 경우가 있다.

이 때는 dependencies 내부에 아래 코드를 추가해주면 된다.

 

runtimeOnly 'com.h2database:h2'

 

 

[2] Java, h2 database version

 

참고로 Spring Boot 3.x 이상 버전을 사용할 경우 Java 17 이상이어야 한다. 이 때 h2 database 는 2.1.214 이상이어야된다고 한다.

또한 javax 패키지가 아닌 jakarta 를 사용해야 한다.

 

아래 코드는 h2 의 버전을 확인하는 코드이다. 그냥 h2 들어가서 해당 코드 작성 후 run 하면 된다.

 

SELECT H2VERSION() FROM DUAL;

 

나는 Java 11 에 h2 2.1.214 사용할 때 오류가 안났다. 아직까지도 버전 관련 문제는 어렵다. (이 부분은 문제가 아니었나보다.)

 

sourceCompatibility = '11'

 

위 코드가 build.gradle 에서 Java 의 버전과 일치하는 값으로, 컴파일에 사용되는 JDK 버전이다.

따라서 버전이 안맞을 경우 다시 다운로드를 하거나 서로 맞춰주어야 한다.

 

 

2) application.yml

[1] url

만약 h2 버전이 1.4.200인 경우 MVCC=TRUE 가 있다면 오류가 난다. 해당 부분을 지우면 된다.

또한 이전 강의에서 진행한 h2 경로 설정을 확인하고 url 부분에 똑같이 옮겨야 한다.

 

[2] 띄어쓰기

해당 파일에서는 띄어쓰기가 중요한데, 간혹 띄어쓰기를 잘못하는 사람들이 있다고 한다. 해당 칸수에 맞게 작성했는지 확인하자.

참고로 순서도 중요하다. (강의를 집중해서 잘 보자)

 

 

3) H2

[1] 실행 여부 확인

h2 를 먼저 실행시키고 테스트를 진행해야 한다. 나도 처음에 h2 안켜놓고 진행했다가 오류가 계속 떴다.

 

사실 h2 를 사용한지 얼마 안되었기 때문에 h2 관련 오류는 아직 잘 모르겠다. 찾아보니 대부분 버전 문제, 경로 설정 문제, 파일 관련 문제가 제일 많았다. 만약 강의를 듣는다면 커뮤니티에 해당 오류 관련 내용이 많으니 해당 글을 참고하면 되겠다.

 

 

4) Annotation 

우선 나는 이 방법으로 해결을 하였다. Member 클래스에 보면 @Id 어노테이션을 사용하였는데, 이놈이 두 가지가 있었다.

처음에 모르고 아무거나 import 하였더니 그게 아니었다.

 

첫 번째로 JPA 엔티티 객체의 식별자로 사용할 필드에 적용하는, JPA 에서 제공하는 애노테이션이 있다. 바로 이걸 사용해야한다.

두 번째로 Spring 데이터에서 제공하는 애노테이션이 있다. 처음에 이걸 사용했다가 계속 오류가 난 것이다.

 

import javax.persistence.Id;	//성공
import org.springframework.data.annotation.Id;	//실패

위 코드에서 첫 번째를 import 하면 된다. 같은 애노테이션이라도 이렇게나 다르다니 억장이 와르르 무너진다.

 

 

* JUnit4 와 JUnit5 사용 방법이 조금 다르다고는 하는데 나는 JUnit4를 사용해서 그대로 진행했다. 버전 확인도 한 번 해보시길*

 


 3️⃣ 느낀점

코딩하면서 오류를 만날때면 억장이 무너진다. 근데 또 구글링 열심히해서 해결했을 때 쾌감은 좋다.

아직 강의 다 들으려면 공부할게 산더미인데 벌써 초기단계에 이런 오류를 만나버리다니...후후

 

그래서 앞으로 금방 해결 못한 오류들은 포스팅하여 나에게도 도움이 되고자 한다.

앞으로 이런 오류 만나도 당황해야겠다!

 

 

흑흑

 

 

출처 : 김영한 - 스프링 핵심 원리(기본편), Spring Q&A, 갓구글

반응형