Entity Logging

Entity:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Entity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;
    private String phone;

    // 생성자, getter/setter, equals/hashcode 메소드 등 생략
}

엔티티에 있는 속성들을 log 에 출력하기 위해 아래와 같이 사용하는 경우 주의해야 한다.

log.info(" # [Entity] {}", entity);

이 때, Entity 의 toString() 이 호출된다. @ToString 어노테이션을 사용하지 않거나 오버라이딩 하지 않는 경우 객체의 주소값이 출력된다.

문제는 참조 관계에 있는 엔티티간에 toString() 이 무한으로 호출될 가능성이 있다.

  • A 엔티티의 toString() 에서 B 엔티티의 프로퍼티를 출력하는 경우 + 그 반대

따라서 toJson(), toLog() 같은 메서드를 엔티티에 제공하는 것도 방법이다.

public interface EntityLogger {
    /**
     * <b>FetchType 이 Lazy 인 참조 엔티티의 프로퍼티를 출력하는 것은 꼭 필요한지 재고</b>
     * @return stringify entity properties
     */
    String toJson();
}

이제 엔티티 로깅이 필요한 경우 위 인터페이스를 구현하여 사용하면 된다.