해결된 질문
작성
·
293
·
수정됨
1
안녕하세요 강의 잘 듣고 있습니다.
게시글 CRUD 부분에서 오류가 발생하는데
yml 설정은 강의랑 똑같이 해줬습니다.
서버 실행시키면
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
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:116) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) ~[hibernate-core-6.5.2.Final.jar:6.5.2.Final]
이런 오류가 발생하고
테스트 실행시키면
Invalid status line: "ÿ900"
at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:575)
at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:498)
at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.retrieve(DefaultRestClient.java:460)
at kuke.board.article.api.ArticleApiTest.create(ArticleApiTest.java:24)
at kuke.board.article.api.ArticleApiTest.createTest(ArticleApiTest.java:14)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
Caused by: java.net.ProtocolException: Invalid status line: "ÿ900"
at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:962)
at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:133)
at org.springframework.http.client.JdkClientHttpRequest.executeInternal(JdkClientHttpRequest.java:102)
이런 오류가 발생합니다.
구글링 해보고 권한 설정이랑 인코딩 설정도 다 했는데 도저히 안돼서 질문 남깁니다..
추가)
server:
port: 9000
spring:
application:
name: kuke-board-article-service
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/article
username: root
password: root
jpa:
database-platform: org.hibernate.dialect.MySQLDialect
open-in-view: false
show-sql: true
hibernate:
ddl-auto: none
yml 설정입니다.
추가)
artile의 build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.mysql:mysql-connector-j'
implementation project(':common:snowflake')
}
이 부분은 강의 코드 보면서 그대로 쳤어서 runtimeOnly 'com.mysql:mysql-connector-j'는 원래 있었습니다.
스프링 버전 관련
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.2'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'kuke'
version = '1'
allprojects {
java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
}
강의에 나온 버전 그대로 맞췄습니다.
DB관련
아이디 root에 비밀번호 root로 하면 접속 잘 되고 DB랑 테이블도 article로 통일했습니다.
MySQLDialect -> MySQL8Dialect로 변경해도 안되는데 이유를 모르겠네요!...
추가)
이렇게 나오는데 USER는 본명이라 가렸습니다!..
추가)
테스트 실행시키면 발생하는 오류입니다..
package kuke.board.article.api;
import kuke.board.article.service.response.ArticleResponse;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.junit.jupiter.api.Test;
import org.springframework.web.client.RestClient;
public class ArticleApiTest {
RestClient restClient = RestClient.create("http://localhost:9000");
@Test
void createTest() {
ArticleResponse response = create(new ArticleCreateRequest(
"hi", "my content", 1L, 1L
));
System.out.println("response = " + response);
}
ArticleResponse create(ArticleCreateRequest request) {
return restClient.post()
.uri("/v1/articles")
.body(request)
.retrieve()
.body(ArticleResponse.class);
}
@Getter
@AllArgsConstructor
static class ArticleCreateRequest {
private String title;
private String content;
private Long writerId;
private Long boardId;
}
@Getter
@AllArgsConstructor
static class ArticleUpdateRequest {
private String title;
private String content;
}
}
코드는 강의랑 똑같은데 왜그럴까요..
답변 2
0
show_3_님, 안녕하세요!
위 로그만으로는 확인이 어려울 것 같습니다!
짐작 가는 부분으로는 yml 파일 설정에 오타가 있을지 싶은데, 전체 설정 코드 올려주시겠어요?
article의 build.gradle > dependencies에 아래 코드도 추가되어 있을까요?
runtimeOnly 'com.mysql:mysql-connector-j'
위 내용이 적용되어 있는지, 강의와 스프링부트 버전이 동일한지도 확인 부탁드립니다!
docker mysql 컨테이너 실행 및 데이터베이스 생성 시에, DB명/username/password 모두 강의와 동일하게 설정된 것인지도 검토 바랍니다!
database-platform 설정을 MySQLDialect -> MySQL8Dialect로도 변경해보시겠어요?
음.. 이상은 없어보이는데 로컬에 대한 문제라면 제가 파악하기엔 어려움이 있네요 ㅠㅠ
제 프로필에 메일이 있는데, 전체 프로젝트 압축해서 보내보시겠어요?
코드 설정 상에 오류가 있을지 직접 실행해서 살펴보겠습니다!
show_3_님, 혹시 이전에 mysql 로컬에 따로 설치 및 실행하신 적이 있나요!?
lsof 명령어 결과를 보니 로컬에 이미 실행중인 mysql이 있어서,
컨테이너로 접근하는게 아니라 로컬 mysql 서버로 접근하며 충돌이 있던 것 같습니다..!
로컬에 mysql 실행되어 있는 것 종료해보시겠어요?
명령어 결과에 나온 mysqld라는 이름의 PID를, kill -9 <PID> 명령어로 프로세스 강제 죽일 수도 있습니다.
com.docke 하나만 있으면 됩니다!
알려주신대로 해봤는데 서버 실행이 잘 되네요 감사합니다!!
Mysql 끄고 도커 컨테이너 띄운 건데 알고보니 데몬이 자동 실행 계속해서
자동 실행 설정 끄니까 잘 되네요!!
근데 테스트도 바로 돌려봤는데 안돼서 오류 사진 본문 맨 아래에 첨부했는데
답변 주시면 감사하겠습니다ㅠ
0
안녕하세요, 인프런 AI 인턴입니다. show_3_님.
오류로 인해 실행 중인 게시글 CRUD 구현에 문제가 발생하고 있는 것으로 보입니다. 설명하신 두 가지 오류는 서로 다른 원인일 수 있지만, 두 문제 모두 시스템 설정과 관련되어 있을 가능성이 큽니다. 아래는 문제 해결을 위한 몇 가지 가능한 접근 방법입니다:
이 오류는 주로 Hybernate 설정 관련 문제일 때 발생합니다.
- Hibernate 설정 확인: application.yml
이나 application.properties
파일에서 Hibernate 관련 설정이 올바른지 확인해보세요. 잘못된 dialect
설정이나 JDBC URL이 원인일 수 있습니다. 일반적으로 MySQL을 사용하는 경우 MySQLDialect
혹은 MySQL8Dialect
를 사용하는지 확인하세요.
- Dialect 버전 확인: 사용할 데이터베이스 버전에 맞는 dialect
가 설정되어 있는지 확인하세요.
이 오류는 웹 클라이언트가 서버로부터 예상치 못한 응답을 받을 때 주로 발생합니다.
- 웹 서버 및 클라이언트 설정 검토: 서버와 클라이언트 간의 호환성 문제일 수 있습니다. spring-boot-starter-web
및 클라이언트 라이브러리의 버전을 확인하여 호환되는지 검토하세요.
- 테스트 환경 확인: 테스트 시 사용할 포트 혹은 URL이 정확하게 설정되어 있는지 확인합니다. 중복되거나 잘못된 포트로 커넥션 시도 시 생길 수 있는 문제일 수 있습니다.
추가적으로, 다음 리소스를 통해 문제 해결에 도움이 될 수 있는 정보를 찾을 수 있습니다:
- Spring Boot Hibernate 설정 문제 해결 (게시글 제목)
- HTTP 프로토콜 및 상태 코드 오류 해결 방법 (게시글 제목)
위 방법으로 문제가 해결되지 않으면, 각 오류의 Stack Trace를 더 자세히 분석하고 해당 라인 번호를 바탕으로 발생 지점을 찾아내는 것도 중요한 방법입니다. 또, application.yml
및 application.properties
설정 파일 내용을 공유해주시면 더 많은 분들께서 문제를 함께 분석해보실 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
yml 추가해서 올렸습니다!