들어가며
프로젝트 개발하는 도중 테스팅을 위해 실행시켰지만 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