Spring

Crud 구현 중에 나타난 오류 고치기

상일동 2023. 5. 24. 13:21

1. 스프링 테스트 한 번에 실행 중 오류

Gradle에 내장된 test를 사용하였다! 테스트를 짠 모든 코드를 한 번에 실행시켜줘서 편하다.

근데..

음 뭐 컨트롤러 테스트에 문제가 없는데

다시 테스트 해보니까 전부 터져버린 모습.. ???????????

 

전부 오류명이 

Failed to load ApplicationContext

java.lang.IllegalStateException: Failed to load ApplicationContext 이고,

 

스프링부트 실행하다 중간에 끊 에러를 봤더니

No class com.example.crud.domain.Posts entity with id 1 exists!
org.springframework.dao.EmptyResultDataAccessException: No class com.example.crud.domain.Posts entity with id 1 exists! 라는 것이다....

 

원인은 PostServiceTest 부분에 오류가 생겼고, 그 오류 때문에 스프링부트가 멈춰서 ControllerTest가 실행이 안된 것이다.

 

 

2. No class com.example.crud.domain.Posts entity with id 1 exists!

ServiceTest 오류 난 곳을 봐보자

글 삭제하는 부분이 문제였다. 

 

Dto 인스턴스를 만들고 Service에 넣어서 Repository에 저장하려다가 110번 줄 과정에서 오류가 생긴 건데 

여기서 두 가지 문제점이 있었다. 

 

하나는 여러 가지 테스트를 진행하면서 id가 쌓여서 삭제할 대상을 못 찾은 것이다.

1번 id를 삭제하라 했는데 4번까지 나와서 망해버렸다. 

 

두 번째는 4번째까지 올라온 id를 찾아서 삭제해야 하는데, Dto 인스턴스는 정보 전달하는 역할이라 @Entity를 안 주고Id도 할당 안 해서 id를 못 찾는다!!!! 테스트 설계 자체가 잘못된 것... 수정해 주자...

글 수정 테스트로 id문제라 수정해 주었다

수정하고 난 뒤

Dto가 아닌 바로 만들어서 Repository로 꽂아준 모습

(참고)글 저장용 클래스와 Dto파일

 

3. 되던 테스트들이 갑자기 에러?

둘 다 각자 테스트 돌리면 아무 이상 없는데 같이 돌리면 터져버리는 모습... 

 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of URL [file:/C:/Programming/Crud/build/resources/main/data.sql]: INSERT INTO user(USER_ID,USERNAME,PASSWORD,EMAIL,AGE,CREATED_AT) VALUES(1,'이름', 1234,'intshc@gmail.com',24,'2023-05-18 19:17:00'); nested exception is org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.""USER""(USER_ID) ( /* key:1 */ CAST(1 AS BIGINT), 24, TIMESTAMP '2023-05-18 19:17:00', 'intshc@gmail.com', '1234', U&'\\c774\\b984')"; SQL statement:
INSERT INTO user(USER_ID,USERNAME,PASSWORD,EMAIL,AGE,CREATED_AT) VALUES(1,'이름', 1234,'intshc@gmail.com',24,'2023-05-18 19:17:00') [23505-214]

스프링 실행 시에 기본 테이블을 생성해 주었는데 id가 중복돼서 터진 것 같다.. 

 

그래서 id를 빼주었는데

ID는 NULL이 될 수 없다는 모습

 

구글링 해보니 h2 데이터베이스 버전이 올라가면서 생기는 오류라 한다.(현재 2.1.14 버전 쓰는 중)

근데 버전 낮춰도 안 고쳐짐, 오히려 다른 오류도 생겨서 자세히 봤는데  

@GeneratedValue에 (strategy = GenerationType.IDENTITY)이 빠진 모습!!!!!!!!!!!!!!!!

😱😱😱😱😱😱😱😱 왜 빠트렸지

 

성공! 근데 실행 마무리가 안되는데... Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no]  로그가 찍히고 계속 버퍼링이다.

 

터미널에 ./gradlew build --scan 입력하고

yes 입력해줬는데 재실행해도 해결이 안 된다;; 그냥 test 폴더 우클릭한 뒤, 실행하는 걸로..