[TIL] 22.12.27 Stream 함수이용하여 댓글리스트 객체 구현

hyewon jeong·2022년 12월 27일
0

TIL

목록 보기
54/138
post-thumbnail

1. 문제

선택한 게시글을 조회 할 때 댓글도 함께 조회 가능 하도록 코드 구현하기

2. 시도한 점

어떻게 구현 해야 할까 부터 뭔가 막연 했다.

  • Post entity Class 에서 구현?
  • 구현 한다 해도 다시 반환해줘야 하지 않나?
  • 그럼 댓글리스트를 가져 와야 하는데 자바 강의에서 배웠던 Stream을 이용하면
    가독성 있는 코드로 가지고 올 수 있지 않을까?
  • 해서 Stream 문법 공부를 집중적으로 했다.

3. 해결

posts.getComments().stream().map(CommentResponse::new).collect(Collectors.toList());
    private List<CommentResponse> comments ;

// * Entity 클래스를 생성자 파라미터로 받아 데이터를 Dto로 변환하여 응답
// * 별도의 전달 객체를 활용해 연관관계를 맺은 엔티티간의 무한참조를 방지
//comments 필드의 List 타입을 DTO 클래스로해서 엔티티간 무한 참조를 방지해줬다.
/* Entity -> Dto*/
    public PostsResponse(Posts posts) {
        this.id = posts.getId();
        this.title = posts.getTitle();
        this.username = posts.getUser().getUsername();
        this.content = posts.getContent();
        this.comments = posts.getComments().stream().map(CommentResponse::new).collect(Collectors.toList());
    }

4. 알게 된점

함수형 인터페이스(Functional Interface) 란?

이제 우리는 람다식으로 순수 함수를 선언할 수 있게 되었다. 하지만 Java는 기본적으로 객체지향 언어이기 때문에 순수 함수와 일반 함수를 다르게 취급하고 있으며, Java에서는 이를 구분하기 위해 함수형 인터페이스가 등장하게 되었다.

📢함수형 인터페이스란 함수를 1급 객체처럼 다룰 수 있게 해주는 어노테이션으로, 인터페이스에 선언하여 단 하나의 추상 메소드만을 갖도록 제한하는 역할을 한다. 함수형 인터페이스를 사용하는 이유는 Java의 람다식이 함수형 인터페이스를 반환하기 때문이다.

[ 메소드 참조(Method Reference) ]

📢메소드 참조란 함수형 인터페이스를 람다식이 아닌 일반 메소드를 참조시켜 선언하는 방법이다. 일반 메소드를 참조하기 위해서는 다음의 3가지 조건을 만족해야 한다.

  • 함수형 인터페이스의 매개변수 타입 = 메소드의 매개변수 타입
  • 함수형 인터페이스의 매개변수 개수 = 메소드의 매개변수 개수
  • 함수형 인터페이스의 반환형 = 메소드의 반환형
  • 참조가능한 메소드는 일반 메소드, Static 메소드, 생성자가 있으며 클래스이름::메소드이름 으로 참조할 수 있다. 이렇게 참조를 하면 함수형 엔터페이스로 반환이 된다. 3가지의 메소드에 대해 메소드 참조 예시를 자세히 살펴보도록 하자.

생성자 참조

생성자도 메소드 참조를 할 수 있다. 생성자는 new로 생성해주므로 클래스이름::new로 참조할 수 있다. Supplier는 매개변수가 없이 반환값만을 갖는 인터페이스이기 때문에, 매개변수 없이 String 객체를 새롭게 생성하는 String의 생성자를 참조하여 Supplier로 선언할 수 있다.

Supplier<String> supplier = String::new;

5. 기타 공부

Stream문법 공부

profile
개발자꿈나무

0개의 댓글