선택한 게시글을 조회 할 때 댓글도 함께 조회 가능 하도록 코드 구현하기
어떻게 구현 해야 할까 부터 뭔가 막연 했다.
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());
}
이제 우리는 람다식으로 순수 함수를 선언할 수 있게 되었다. 하지만 Java는 기본적으로 객체지향 언어이기 때문에 순수 함수와 일반 함수를 다르게 취급하고 있으며, Java에서는 이를 구분하기 위해 함수형 인터페이스가 등장하게 되었다.
📢함수형 인터페이스란 함수를 1급 객체처럼 다룰 수 있게 해주는 어노테이션으로, 인터페이스에 선언하여 단 하나의 추상 메소드만을 갖도록 제한하는 역할을 한다. 함수형 인터페이스를 사용하는 이유는 Java의 람다식이 함수형 인터페이스를 반환하기 때문이다.
📢메소드 참조란 함수형 인터페이스를 람다식이 아닌 일반 메소드를 참조시켜 선언하는 방법이다. 일반 메소드를 참조하기 위해서는 다음의 3가지 조건을 만족해야 한다.
생성자도 메소드 참조를 할 수 있다. 생성자는 new로 생성해주므로 클래스이름::new로 참조할 수 있다. Supplier는 매개변수가 없이 반환값만을 갖는 인터페이스이기 때문에, 매개변수 없이 String 객체를 새롭게 생성하는 String의 생성자를 참조하여 Supplier로 선언할 수 있다.
Supplier<String> supplier = String::new;