본문 바로가기
spring_boot/Error

BeanCreationException2-kotlin

by 잡다한 개발자 정모씨 2024. 6. 18.

들어가며

프로젝트 개발하는 도중 테스팅을 위해 실행시켰지만 Bean에러가 나는 상황. 저번에는 Caused by로 에러를 어느정도 알려주어 알 수 있었지만 지금은 아래와 같이 애매모호하게 뜨는 상황;;

더보기

> Task :test

GbApplicationTests > coextLoads() FAILED
    java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180
        Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1786
            Caused by: org.hibernate.AnnotationException at CollectionBinder.java:1622
        Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1786

            Caused by: org.hibernate.AnnotationException at CollectionBinder.java:1622


5 tests completed, 1 failed

> Task :test FAILED

그럼 우선 AnnotationException 이니까 실행해서 관련 에러를 파악해보자.

 

package com.gachi.gb.rez.domain

import com.gachi.gb.bus.domain.Bus
import com.gachi.gb.user.domain.User
import jakarta.persistence.*
import java.time.LocalDateTime
import java.util.UUID

@Entity
class BusReservation (
  @Id
  @GeneratedValue(strategy = GenerationType.UUID)
  var id: UUID?,

  //호차 정보
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "bus_id")
  var busInfo: Bus,

  //최종 목적지
  @Column(nullable = false)
  var endCity: String,

  @Column(nullable = false, updatable = false)
  var createAt: LocalDateTime,

  @Column(nullable = true, updatable = true)
  var updateAt: LocalDateTime?,

  @OneToOne(fetch = FetchType.LAZY)
  var user: User,
) {
}

 

busReservation이라는 테이블에서 기준이 되는 컬럼인 busInfo 즉 bus class를 살펴준다.

package com.gachi.gb.bus.domain

import com.gachi.gb.rez.domain.BusReservation
import jakarta.persistence.*
import java.time.LocalDateTime

@Entity
class Bus (
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  var id: Int?,

  //호차 번호
  @Column(nullable = false)
  var busNumber: Int,

  //호차 이름
  @Column(nullable = false)
  var busName: String,

  //중간 지점
  @OneToOne
  @JoinColumn(name = "busCity_id")
  var middleCity: BusCity,

  //종착지
  @OneToOne
  @JoinColumn(name = "endCity_id")
  var endCity: BusCity,

  //좌석 수
  @Column(nullable = false)
  var maxTable: Int = 45,

  @Column(nullable = false)
  var createdAt: LocalDateTime,

  @Column(nullable = true)
  var updateAt: LocalDateTime,

  @OneToMany(mappedBy = "busReservation")
  var busReservation: MutableList<BusReservation>?
) {
}

 

bus 테이블에 busReservation 컬럼을 보면 mappedBy가 "busReservation"으로 적용되어 있는 것을 알 수 있다. 그럼 mappedBy에 대해서 알아보자. 

 

MappedBy란?

만약 테이블을 설계하는 과정에서 bus와 busReservation이라는 테이블들이 서로 접근이 가능한 상태에서 각 필드를 통해 접근이 가능하기에 bus와 busReservation이 Join테이블을 서로 변경하려고 하면 무결성을 해칠 수 있다. 이때!

두 객체중에서 한개의 객체만 테이블을 관리할 수 있도록 하는 것에 MappedBy 속성이다.

즉 여러 테이블 중에서 모든 친구들이 함부로 괴롭히면 안되는 것 처럼 "얘는 나만 괴롭힐 수 있어!" 라고 "나"를 지칭해주는 것에 MappedBy 라고 할 수 있겠다. 

 

 

문제가 되는 bus 테이블에 busReservation 컬럼을 보면 mappedBy가 busReservation으로 지정되어 있다. 진짜 생각을 안하고 짠 것 같다. 그러면 이제 bus로 수정해주자;;

  @OneToMany(mappedBy = "bus")
  var busReservation: MutableList<BusReservation>?

이렇게 코드를 짜니 이제 bus 관련해서는 에러가 안뜨는 것 같다...

다른 에러가 뜬다 ㅎㅎ

 

저는 그럼 다른 에러 고치러 20000