레거시는 공허하다.
무에서 유를 창조하기 위한 선조의 노력을 현대에 맞게 발전시켜야함에 따라.
나는 다음과 같은 레거시 데이터베이스를 만나게 되었다.
TB_VEHICLE
------------
company_id
driver_id
------------
차량을 소유하는 주체는 업체(company)와 개인(driver)로 나누어진다. 레거시 DB에서는 두 형태를 각각의 column에 id를 넣는 것으로 되었다.
ex)
업체 소유 차량 -> update compamy_id
개인 소유 차량 -> update driver_id
(소유 형태를 확인/변경 하기 위해 null값을 사용해야 하는 것이 아쉽다. 만약 두 칼럼 모두 null이거나 유효한 값이 들어갈 경우 소유 형태가 불명확해지는 단점이 있다.)
엔티티는 다음과 같다.
@Entity
@Table(name="TB_VEHICLE")
public class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="vehicle_idx")
private Long id;
...
@OneToOne
@JoinColumn(name = "driver_id")
private Driver driver;
@ManyToOne
@JoinColumn(name = "company_id")
private Company company;
}
위에서 언급한 바와 같이 company 혹은 driver 가 유효할 경우 소유 형태를 확인 할 수 있다.
이전 포스트에서 봤던 JPA의 영속 메소드 호출 순서다.
하단 managed 부분을 보면 @PostLoad를 확인 할 수 있다.
말 그대로 객체가 로드 된 뒤에 호출되는 메소드다.
@PostLoad를 사용해 다음과 같이 추가 되었다.
@Entity
@Table(name="TB_VEHICLE")
public class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="vehicle_idx")
private Long id;
...
@OneToOne
@JoinColumn(name = "driver_id")
private Driver driver;
@ManyToOne
@JoinColumn(name = "company_id")
private Company company;
@Transient
private OwnType ownType;
@PostLoad
public void setOwnType(){
if(ObjectUtils.isNotEmpty(this.company))
this.ownType = OwnType.BUSINESS;
if(ObjectUtils.isNotEmpty(this.driver))
this.ownType = OwnType.PERSONAL;
}
}
@ToString
@Getter
public enum OwnType{
PERSONAL,
BUSINESS;
}
ENUM으로 소유형태(OwnType)을 정의하고 이를 @Transient필드로 사용한다.
(@Transient는 테이블과 매핑되지 않는 엔티티 필드)
@PostLoad를 사용해 각 소유 주체의 유효성을 체크한다.
간단하지만 레거시 데이터베이스를 사용하다보면 빈번하게 발생할 내용으로 보인다.
선조들의 유산을 지키는 노하우를 차곡차곡 쌓아가는 걸로..