👾 문제식별
요즘 김영한 선생님의 JPA 강의를 듣고 있다.
강의를 보면서 환경설정부터 따라하고 있는데, h2 db접속 정보를 application 파일에 입력한 후, 어플리케이션을 실행시켰다.
아래와 같은 에러가 발생하면서 로컬 서버가 켜지지 않는다.
🔍 원인분석
* application.yaml
에러문구 중 몇 개를 살펴봤다.
1. NullPointerException
java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(java.sql.SQLException, String)" because the return value of "org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.sqlExceptionHelper()" is null
=> Hibernate에서 SQL 예외를 처리하는 동안 발생한 에러,
구체적으로, org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert 메서드를 호출하려고 했지만, sqlExceptionHelper()의 반환 값이 null이어서 발생한 오류.
2. BeanCreationException org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution [Unsupported connection setting "MVCC" [90113-224]] [n/a]
=>Spring Boot 애플리케이션에서 entityManagerFactory를 생성하는 과정에서 발생한 에러,
Hibernate가 JDBC 연결을 열 수 없다..!
🤔 해결방법시도
- MVCC=TRUE 삭제 , MVCC=TRUE 옵션은 여러 커넥션이 한번에 db에 접근 했을때 좀 더 빨리 처리할 수 있게 하는 옵션이라고 핬는데 빼도 무방하다고 하셔서 삭제 :
콘솔 에러로그에 계속 나오던 MVCC에 관련된 내용은 이제 없어졌지만 여전히 서버 켜지지 않음.
오히려 이전에 못본 에러로그가 나왔다.
Connection is broken: "java.net.ConnectException: Connection refused: localhost"
확실하게 내 로컬에 설치된 h2 db에 접근이 안되는 걸 알았다.
2. db 주소 확인
application.yaml파일에 적힌 url로 h2 콘솔 로그인화면에 입력하면, 접속을 성공한다. url을 잘못 작성하지는 않은것같다.
✅ 최종해결방법
갑작스러운 해결...
💡 해결 방법 설명
해결 방법은.. 그저 db 서버를 실행시켰을 뿐이다.
db 서버를 실행시키지 않고, 나의 application에서 입력된 주소의 db서버와 접속 시도를 하였기 때문에 계속 오류가 발생했었다.
url을 확인하려 h2.sh파일을 실행시키고, 콘솔 로그인을 한 이후로 application실행이 아주 잘 되었다...
📝 재발 방지 대책
h2 db가 어떤 db인지 깊게 생각하지 않고 사용한게 삽질을 하게된 이유라고 생각한다.
사용하고 있는 환경에 대해서 어떻게 동작하는지, 어떤 특징이 있는지 알아야 할 것 같다...
그래서 h2에 대해서 간략히 알아보자.
H2 데이터베이스는 Java 기반의 경량 데이터베이스 관리 시스템(DBMS)이다.
주로 개발 및 테스트 환경에서 사용되며, 다음과 같은 특징이 있다.
주요 특징
- 인메모리 데이터베이스:
- H2는 인메모리 데이터베이스로 사용할 수 있어, 성능이 매우 빠르다. 데이터가 메모리에 저장되므로 디스크 I/O가 필요 없어 빠른 응답 속도를 제공한다.
- 어플이 실행 되면서 db object들이 생성되고 종료되면 모두 삭제된다.
- 경량:
- H2 데이터베이스는 설치가 간단하고 경량화되어 있어, Java 애플리케이션에 쉽게 포함시킬 수 있다. JAR 파일 하나로 배포가 가능하여, 추가적인 설치 과정이 필요 없다.
- SQL 표준 준수:
- H2는 SQL 표준을 지원하며, MySQL, PostgreSQL, Oracle 등의 다른 데이터베이스와 유사한 SQL 문법을 사용한다. 이는 다른 DBMS에서 H2로의 전환을 용이하게 한다.
- 웹 기반 콘솔:
- H2는 웹 기반의 관리 콘솔을 제공하여, 데이터베이스를 쉽게 관리하고 쿼리를 실행할 수 있다. 기본적으로 http://localhost:8082에서 접근할 수 있다.
- 다양한 모드 지원:
- H2는 인메모리 모드, 파일 기반 모드, 서버 모드 등 다양한 운영 모드를 지원한다. 이로 인해 필요에 따라 유연하게 사용할 수 있다.
- 강의에서의 H2모드는 서버 모드이다. 서버모드는 실행파일을 다운로드 받아야하고, 사용하려면 터미널에서 파일을 실행 시켜야 했다.
- H2의 모드에 대해서 참고한 블로그 글을 남긴다.
- https://dfdfg42.tistory.com/m/entry/H2-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%9D%98-3%EA%B0%80%EC%A7%80-%EB%AA%A8%EB%93%9C-ServerEmbededIn-memory-H2-database
- JDBC 지원:
- H2는 JDBC 드라이버를 제공하여 Java 애플리케이션에서 쉽게 연결할 수 있다. Spring과 같은 프레임워크와도 잘 통합된다.
'개발 공부 > 트러블슈팅' 카테고리의 다른 글
AWS EC2 상태검사가 1/2만 검사 통과 상태 일때 (0) | 2024.10.24 |
---|---|
@OneToMany 관계 정의 후, getter 호출 시 NullPointerException이 발생하는 원인과 문제 해결 (0) | 2024.09.29 |
[Spring Security] permit을 적용한 API를 테스트 했을때 401 에러가 발생하는 원인과 해결방법 (2) | 2024.08.31 |
@Valid 가 작동하지 않는 원인과 해결방법 (0) | 2024.08.26 |
@RequestBody로 객체를 받을 때 @Builder만 있으면 발생하는 400 에러 원인과 해결방법 (0) | 2024.08.25 |