JPA

less than 1 minute read

들어가며

최근 JPA 관련 스터디 모임을 하고 있어 공부한 것을 정리하기 위한 글 입니다.

JPA 란?

Java Persistent API로 Java ORM에 대한 인터페이스 입니다.
그럼 여기서 ORM이 무엇인지 먼저 알고 지나가야겠죠?
ORM은 Object Relation Mapping 으로 RDB 객체를 객체지향적으로 사용하기
위한 기술입니다. ORM을 사용하기 위한 프레임워크는 여러 개가 있지만 Hibernate를
주로 사용하고 있습니다.

Paging

JPA는 페이징을 손쉽게 만들 수 있도록 제공하고 있습니다.
아래와 같이 Controller에서 작성한 후 service에서 repository.findAll을
사용하여 작성하면 페이징 관련이 완성 됩니다.
정말 간단하쥬?

Page<User> getAll(Pageable pageable) {
	return LogicService.getAll(pageable);
}

Problem

근데 테스트 도중에 에러가 발생합니다…
콘솔창을 보니 Infinite recursion (StackOverflowError) 라고 나옵니다.
콘솔창에 찍힌 쿼리도 엄청나게 길게 찍힙니다.

JPA를 공부할 때 JPA 연관관계에서 양방향 매핑을 선언할 경우 lombok에서
자동으로 생성해주는 toString()으로 무한루프 문제를 방지하기 위해 상단에
아래와 같은 코드를 추가했었습니다.

@ToString(exclude = { "table" })

그런데도 왜 무한루프 문제가 발생하는지…

Solution

한참을 검색해보니 @JsonManagedReference, @JsonBackReference를 사용하라고 나옵니다.

@JsonManagedReference
- 참조가 되는 앞부분을 의미, 정상적으로 직렬화를 수행한다.
- Collection Type에 적용된다.

@JsonBackReference
- 참조가 되는 뒷부분을 의미, 직렬화를 수행하지 않는다.

이와 같이 해당되는 부분을 찾아 추가하였더니 정상적으로 동작하는 것을
확인할 수 있었습니다 !

Cause

자바 직렬화때문에 이와 같은 에러가 발생했다고 합니다.
원인은 이해가 잘되지 않아 저도 직렬화부터 먼저 찾아봐야할 것 같습니다.

Reference

Leave a comment