문제 해결

LatteJava·2024년 4월 7일

JPA

양방향 연관관계 시 무한참조 발생

  • 엔티티를 JSON으로 직렬화할 때 발생
    A 엔티티와 B엔티티가 서로 참조하는 양방향 연관관계에 있을 때 A를 직렬화하려고 한다면 A는 B를 참조하고 다시 B는 A를 참조함으로 계속해서 서로를 참조하는 무한 참조가 발생하게 된다.

  • 해결책

  1. @JsonIgnore 애노테이션으로 직렬화 대상에서 특정 필드를 제외시킨다.
  • 주로 관계의 다(N)에 해당하는 쪽에 설정된다.
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;


    @OneToMany(mappedBy = "member", fetch = FetchType.LAZY)
    // 양방향 관계에서 직렬화 수행 시 무한 참조를 방지하기 위함
    @JsonIgnore
    private List<Post> posts = new ArrayList<Post>();
}
  1. @JsonManagedReference와 @JsonBackReference를 사용하여 양방향 참조 관계에서 한쪽을 직렬화에 포함시키고, 다른 한쪽은 무시합니다.
  2. 엔티티 대신 DTO를 사용한다.

테스트 작성 시 객체 비교 오류

  • 원인
  1. db에서 엔티티를 조회할 때마다 새로운 인스턴스가 생성
  2. 각 테스트는 별도의 트랜잭션과 영속성 컨텍스트를 사용한다.
  • 해결책
  1. equals() 메소드를 오버라이드하여 엔티티의 식별자로 동일성을 간주시킨다.
  2. @Transactional 애노테이션을 부여한다.
    -> 테스트 메서드가 실행될 때 자동으로 트랜잭션을 시작하고, 테스트 메서드가 완료될 때 트랜잭션을 롤백합니다.

Optional

  1. 비어있는 Optional 객체에 get() 메소드를 호출한 경우 NoSuchElementException 이 발생
예외발생 상황
NoSuchElementException비어있는 Optional 객체에 get() 메소드를 호출한 경우
MemberNotFoundException-
  1. Optional.orElse() vs Optional.orElseGet()
비교Optional.orElse()Optional.orElseGet()Optional.ifPresent()
파라미터 메소드 실행값 null or 값 존재값 null값이 존재할 경우만 다룬다
  1. 언박싱 비용을 고려한 코딩
profile
devlog

0개의 댓글