CRUD 사이드 프로젝트를 만들고있는데 '게시글리스트 조회'기능에서 게시글 테이블과 양방향관계에 있는 댓글 테이블에서 순환참조 이슈가 발생했다.
이전 포스팅처럼 Entity->DTO 방법으로 사용하고자 했는데 단순 Entity가 아니라 페이징객체의 Entity여서 DTO변환이 고민되었다..
Page객체는 유지하고 내부 타입을 Entity->DTO로 변환 할 수있는 방법을 생각해보았다.
다행히도 Page객체의 메소드중에 map이라는 메소드가 있었고 해당 메소드를 통해 람다식을 통해 DTO타입으로 내부 형변환이 가능했다.
그런데 한가지 문제가 더 있었다..!
게시글과 연관관계 엔티티인 댓글(Comment)객체의 값을 가져오기 위해선 또 다른 형변환이 필요했다.
형변환없이 그대로 가져오면 순환참조를 다시 일으키게 됨으로 필수적으로 형변환이 필요했다.
그리고 댓글수만을 가져오도록 DTO를 만들고자 했다.
그리고 사용할 수 있는 메소드가 있는지 이리저리 찾아보던중 stream이라는 메소드를 통해 문제를 해결했다.
메소드 설명
1. Repository로 부터 반환 받은 Page<Board>형태로 파라미터를 받는다
2. Pageable의 map메소드를 사용하여 내부 형변환(Board(Entity)->DTO)를 Builder패턴을 사용하여 진행한다.
->설명: map 메소드의 v는 Page객체 내부의 값 자체 (Board)를 지칭한다. 즉 Page 내부에 있는 객체를 임의코드로 지정한것이다.
그리고 이 map메소드를 통해 Board 내부의 값들을 get~ 메소드를 통해 가져오고 세팅할수있다.
3. commentCount필드는 연관관계 Entity인 Coment의 값이 들어가야하며, 특정 내부값 참조를 위해 stream()메소드를 사용한다. ( 위에 주석처리된 부분은 같은 의미의 코드이나 밑의 코드가 개인적인 가독성이 높아서 두가지를 적었다)
->설명 :
1) 다른 필드와 마찬가지로 get~ 메소드를 사용하여 값을 가져온다.
2) 그리고 해당 comment 객체는 순환참조를 일으킴+필요한값만 가져오도록 가공이 필요하다.
3) comment객체는 List<Comment>타입이며 이러한 Collection타입은 Stream을 사용하여 쉽게 재가공 할 수 있 다.
4) 댓글의 갯수만 필요하므로 stream().map()을 사용하여 내부 comment의 id값만 가져오고 그 갯수들을 count()메소드로 가져오면 끝!
앞으로 Collection타입의 가공은 Stream을 통해 간편하게 쓸 수 있을것 같다
'BackEnd > Java' 카테고리의 다른 글
[Java] - Thread, ThreadPool (0) | 2025.01.13 |
---|---|
JAVA_printf (서식이 있는 출력) (1) | 2021.11.20 |
JAVA_메모리 힙(Heap)과 스택(Stack) (0) | 2021.11.15 |
JAVA_실수 반올림하기 (Math.round, String.format) (0) | 2021.11.12 |
JAVA_데이터타입 (1)기본타입(Primitive Type) (1) | 2021.11.10 |