@PostLoad를 사용해 @Transient를 설정하기

recordsbeat·2020년 5월 12일
0

레거시는 공허하다.

무에서 유를 창조하기 위한 선조의 노력을 현대에 맞게 발전시켜야함에 따라.
나는 다음과 같은 레거시 데이터베이스를 만나게 되었다.

1.현황파악

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 가 유효할 경우 소유 형태를 확인 할 수 있다.

2. JPA 살펴보기

이전 포스트에서 봤던 JPA의 영속 메소드 호출 순서다.

하단 managed 부분을 보면 @PostLoad를 확인 할 수 있다.
말 그대로 객체가 로드 된 뒤에 호출되는 메소드다.

3. 구현해보기

@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를 사용해 각 소유 주체의 유효성을 체크한다.

간단하지만 레거시 데이터베이스를 사용하다보면 빈번하게 발생할 내용으로 보인다.

선조들의 유산을 지키는 노하우를 차곡차곡 쌓아가는 걸로..

profile
Beyond the same routine

0개의 댓글