간단한 API를 직접 만들어보자(4) Status code 500 해결

2024. 5. 21. 12:51TIL

✔오늘 배운 중요한 🔑 point

  • 오류가 발생하면 콘솔창을 확인해서 오류가 난 부분을 확인해보자
  • JPA Entity 클래스는 기본생정자를 필요로하기 때문에 build.gradle.kts에 no-Arg플러그인과 allOpen 플러그인을 추가해주면 된다.

🎯 오늘 배운 내용

 

지난번 간단한 API작성 중 발견한 ERROR : STATUS CODE 500

 

status code 500 에러는 서버에 접속을했을때 발생하는 오류이므로 작성중인 코드를 살펴볼 필요가 있다

 

[ERROR: relation "card" does not exist

실행된 콘솔창을 보면 어떤 오류가 발생했는지가 나오는데 현재 "card"라는 부분에서 오류가 난것을 확인할수 있다

 

 

그리고 직접적으로 어느 부분에서 오류가 발생했는지를 확인할 수 있다.

지금 상황에서는 cardServiceImpl과 CardController를 확인해보자

at org.example.spartatodolist.domain.card.service.CardServiceImpl.getCardById(CardServiceImpl.kt:25


at org.example.spartatodolist.domain.card.controller.CardController.getCard(CardController.kt:25

 

먼저 CardServiceImpl의 25번째 줄을 확인해보면

override fun getCardById(cardId: Long): CardResponse {
        val card=cardRepository.findByIdOrNull(cardId) ?: throw ModelNotFoundException("Card",cardId)
        return card.toResponse()
    }

getCardById함수를 확인할수 있고  cardRepository의 findById에 오류가 있나 확인을 해보자

 

package org.example.spartatodolist.domain.card.repository

import org.example.spartatodolist.domain.card.model.Card
import org.springframework.data.jpa.repository.JpaRepository

interface CardRepository: JpaRepository<Card,Long> {
}

findById함수는 JpaRepositroy에 내장되어있는 함수이므로 정상적으로 잘 적용이 되어있는것을 확인할 수 있으니

Card Entity를 체크해보자

 Card 부분에 빨간 경고표시가 되어있는것을 확인했다.

아무래도 이 부분 때문에 오류가 발생한 것으로 보인다

오류 원인은 바로 Card가 기본생성자가 없는 것이다.

JPA Entity class는 기본생성자를 필요로 하기때문에 기본생성자를 생성해줘야한다

 

build.gradle.kts 파일에 해당 코드를 추가

noArg {
    annotation("jakarta.persistence.Entity")
    annotation("jakarta.persistence.MappedSuperclass")
    annotation("jakarta.persistence.Embeddable")
}

allOpen {
    annotation("jakarta.persistence.Entity")
    annotation("jakarta.persistence.MappedSuperclass")
    annotation("jakarta.persistence.Embeddable")
}

 

noArg 플러그인의  annotaion("jakarta.persistence.Entity") 부분이

@Entity 어노테이션이 붙은 클래스에 기본 생성자를 추가하는 코드이고

noArg {
annotation("jakarta.persistence.Entity")
}

 

 

allOpen 플러그인의 annotation("jakarta.persistence.Entity")부분이

@Entity 어노테이션이 붙은 클래스의 함수를 오픈하는 코드이다

allOpen {
    annotation("jakarta.persistence.Entity")
}

 

즉 noArg와 allOpen 플러그인을 사용하여 JPA와 관련된 클래스들에 필요한 기본생성자와 함수 오픈을 자동으로 추가하는 설정을 적용했다고 볼수 있다. 이를 통해서 JPA와의 호환성을 유지하고 필요한 설정을 자동화할 수 있게 되었다.

 

적용을 마친후 Card 클래스에 있던 경고표시가 사라진것을 확인할 수 있다.

 

오류가 사라진줄 알았으나 다시 한번 ERROR가 발생했다

 

그래서 이번에는 

org.hibernate.exception.SQLGrammarException: JDBC exception executing SQL [select c1_0.id,c1_0.description,c1_0.title from card c1_0 where c1_0.id=?] [ERROR: relation "card" does not exist

에러가 발생한 첫부분인 이 부분을 해석해보자

SQLGrammarException 오류 메시지는 현재 데이터베이스에 card라는 테이블이 존재하지 않아서 발생한 오류이다.

 

card 테이블이 존재하지 않으니 card테이블로 값을 저장할 수도 없는 상황.......

 

 

따라서 application.yml파일 설정에 jpa가 데이터베이스 스키마를 자동으로 생성하고 업데이트하도록 해당 코드를 추가한다.

spring:
  datasource:
    url: jdbc:postgresql://*********************
    username: ***********************
    password: **********************
  jpa:
    hibernate:
      ddl-auto: update

 

하나를 해결했더니 또다른 오류 발생!

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table user (id bigserial not null, login_id varchar(255), login_password varchar(255), login_nickname varchar(255), role varchar(255) check (role in ('ADMIN','NORMAL')), primary key (id))" via JDBC [ERROR: synt

user라는 이름은 데이터베이스에서 예약어이기때문에 테이블 이름으로 사용해서는 안된다는 오류가 나왔다...

 

 

name을 app_users로 수정후 실행

 

 

오류 없이 잘 작동하는 것을 확인할 수 있다!!!!

 

데이터베이스에도 값이 잘 저장된것으로 보인다.

 

마찬가지로 card생성시에도 잘 작동한다

 

 

 

 

🤔 어떻게 활용할까?

기본적인 API와 데이터베이스와의 연결까지 정상적으로 잘 작동을 하니, 댓글 생성,수정,삭제에 대한 기능을 추가하여 더 완성도 있는 프로젝트를 구현할 계획이다

📓 오늘의 한줄

"No pressure, no diamonds."

- Thomas Carlyle -

 

 

'TIL' 카테고리의 다른 글

간단한 API를 직접 만들어보자 (5) -환경변수 활용 및 댓글 기능 추가-  (1) 2024.05.23
인증  (0) 2024.05.22
JPA  (0) 2024.05.20
(SQL) 식품 종류별 비싼 식품 정보 조회하기  (0) 2024.05.19
(알고리즘) 과일장수  (0) 2024.05.18