인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

show_3_님의 프로필 이미지

작성한 질문수

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

게시글 CRUD API 구현

게시글 CRUD 구현 오류 질문입니다.

해결된 질문

작성

·

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관련

스크린샷 2025-02-04 오후 8.28.39.png스크린샷 2025-02-04 오후 8.29.00.png스크린샷 2025-02-04 오후 8.29.14.png

아이디 root에 비밀번호 root로 하면 접속 잘 되고 DB랑 테이블도 article로 통일했습니다.

 

MySQLDialect -> MySQL8Dialect로 변경해도 안되는데 이유를 모르겠네요!...

 

추가)

image.png

이렇게 나오는데 USER는 본명이라 가렸습니다!..

 

추가)

스크린샷 2025-02-06 오후 10.07.49.png

테스트 실행시키면 발생하는 오류입니다..

 

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 파일 설정에 오타가 있을지 싶은데, 전체 설정 코드 올려주시겠어요?

show_3_님의 프로필 이미지
show_3_
질문자

yml 추가해서 올렸습니다!

쿠케님의 프로필 이미지
쿠케
지식공유자

article의 build.gradle > dependencies에 아래 코드도 추가되어 있을까요?

runtimeOnly 'com.mysql:mysql-connector-j'

위 내용이 적용되어 있는지, 강의와 스프링부트 버전이 동일한지도 확인 부탁드립니다!

docker mysql 컨테이너 실행 및 데이터베이스 생성 시에, DB명/username/password 모두 강의와 동일하게 설정된 것인지도 검토 바랍니다!

database-platform 설정을 MySQLDialect -> MySQL8Dialect로도 변경해보시겠어요?

show_3_님의 프로필 이미지
show_3_
질문자

다시 아래에 추가로 수정해서 올렸습니다!

알려주신대로 다 했는데도 안됩니다ㅠ

쿠케님의 프로필 이미지
쿠케
지식공유자

음.. 이상은 없어보이는데 로컬에 대한 문제라면 제가 파악하기엔 어려움이 있네요 ㅠㅠ

제 프로필에 메일이 있는데, 전체 프로젝트 압축해서 보내보시겠어요?

코드 설정 상에 오류가 있을지 직접 실행해서 살펴보겠습니다! 

쿠케님의 프로필 이미지
쿠케
지식공유자

혹시 터미널에서

lsof -i:3306

위 명령어 실행 결과도 캡쳐해주시겠어요?

show_3_님의 프로필 이미지
show_3_
질문자

lsof -i:3306

결과는 맨 밑에 수정해서 올렸습니다

메일로 압축 url 보내드렸습니다!

쿠케님의 프로필 이미지
쿠케
지식공유자

show_3_님, 혹시 이전에 mysql 로컬에 따로 설치 및 실행하신 적이 있나요!?

lsof 명령어 결과를 보니 로컬에 이미 실행중인 mysql이 있어서,

컨테이너로 접근하는게 아니라 로컬 mysql 서버로 접근하며 충돌이 있던 것 같습니다..!

로컬에 mysql 실행되어 있는 것 종료해보시겠어요?

명령어 결과에 나온 mysqld라는 이름의 PID를, kill -9 <PID> 명령어로 프로세스 강제 죽일 수도 있습니다.

com.docke 하나만 있으면 됩니다!

show_3_님의 프로필 이미지
show_3_
질문자

알려주신대로 해봤는데 서버 실행이 잘 되네요 감사합니다!!

Mysql 끄고 도커 컨테이너 띄운 건데 알고보니 데몬이 자동 실행 계속해서

자동 실행 설정 끄니까 잘 되네요!!

근데 테스트도 바로 돌려봤는데 안돼서 오류 사진 본문 맨 아래에 첨부했는데

답변 주시면 감사하겠습니다ㅠ

쿠케님의 프로필 이미지
쿠케
지식공유자

앗 아래 추가해주신 내용을 놓쳤었네요 ㅠㅠ 갑자기 퍼뜩 떠올랐습니다..! 죄송해요 ㅠ

인코딩 이슈 같기도 한데 설정은 하셨다하니 음.. 아직 해결은 안되신걸까요?

show_3_님의 프로필 이미지
show_3_
질문자

9000번 포트도 확인해보니 파이썬이 돌아가고 있어서 오류가 발생한 거였네요!! 포트 확인 알려주셔서 해결 잘 했습니다 감사합니다!

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. show_3_님.

오류로 인해 실행 중인 게시글 CRUD 구현에 문제가 발생하고 있는 것으로 보입니다. 설명하신 두 가지 오류는 서로 다른 원인일 수 있지만, 두 문제 모두 시스템 설정과 관련되어 있을 가능성이 큽니다. 아래는 문제 해결을 위한 몇 가지 가능한 접근 방법입니다:

1. NullPointerException 문제

이 오류는 주로 Hybernate 설정 관련 문제일 때 발생합니다.
- Hibernate 설정 확인: application.yml 이나 application.properties 파일에서 Hibernate 관련 설정이 올바른지 확인해보세요. 잘못된 dialect 설정이나 JDBC URL이 원인일 수 있습니다. 일반적으로 MySQL을 사용하는 경우 MySQLDialect 혹은 MySQL8Dialect 를 사용하는지 확인하세요.
- Dialect 버전 확인: 사용할 데이터베이스 버전에 맞는 dialect가 설정되어 있는지 확인하세요.

2. Invalid status line 오류

이 오류는 웹 클라이언트가 서버로부터 예상치 못한 응답을 받을 때 주로 발생합니다.
- 웹 서버 및 클라이언트 설정 검토: 서버와 클라이언트 간의 호환성 문제일 수 있습니다. spring-boot-starter-web 및 클라이언트 라이브러리의 버전을 확인하여 호환되는지 검토하세요.
- 테스트 환경 확인: 테스트 시 사용할 포트 혹은 URL이 정확하게 설정되어 있는지 확인합니다. 중복되거나 잘못된 포트로 커넥션 시도 시 생길 수 있는 문제일 수 있습니다.

추가적으로, 다음 리소스를 통해 문제 해결에 도움이 될 수 있는 정보를 찾을 수 있습니다:
- Spring Boot Hibernate 설정 문제 해결 (게시글 제목)
- HTTP 프로토콜 및 상태 코드 오류 해결 방법 (게시글 제목)

위 방법으로 문제가 해결되지 않으면, 각 오류의 Stack Trace를 더 자세히 분석하고 해당 라인 번호를 바탕으로 발생 지점을 찾아내는 것도 중요한 방법입니다. 또, application.ymlapplication.properties 설정 파일 내용을 공유해주시면 더 많은 분들께서 문제를 함께 분석해보실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

show_3_님의 프로필 이미지

작성한 질문수

질문하기