본문 바로가기

항해99

항해 99 - 2023.02.16 TIL

매 주 목요일은 한 주 학습 주제에 대한 퀴즈를 풀고 한 주를 마무리하는 날이다.

오늘로 스프링 숙련 주차를 마치게 되었다.

 

퀴즈의 난이도는 그다지 어렵진 않았지만, 가장 어렵게 느껴졌던 JPA 상관관계가 나와서 많이 헷갈렸다.

 

JPA 상관관계가 계속 정리가 잘 되지 않는 느낌이라, 상관관계와 외래키에 대해서 공부하고, 내용을 정리하여 블로그에 포스팅 했다.

 

https://9401ndk.tistory.com/49

 

Spring Boot - JPA 연관관계

JPA 연관관계가 너무 어렵게 느껴져서 따로 공부한 내용을 정리해보려고 한다. Foreign Key (외래키) 우선적으로 외래키의 의미와 기능을 온전히 이해하지 못했던 것 같아 개념을 학습했다. https://bru

9401ndk.tistory.com

 

 

 

숙련 주차에서 주어졌던 lv2, lv3의 과제 중 lv3까지 모두 완성해서 제출할 수 있었다.

 

 

게시물 별 댓글의 내림차순 정렬

발목을 잡았던 것이 댓글의 작성시간 기준으로 내림차순 정렬하는 기능을 구현하는 것이였다.

 

댓글 리스트 자체가 따로 컬럼이 존재하지 않고, 상관관계에 의해서 JOIN 쿼리를 날려 받아오는 값이였기 때문에 감을 잡기가 어려웠다.

 

DTO를 담을 객체 배열을 선언하고, 배열에 add할 때 마다 DTO 생성자를 통해서 내림차순 정렬된 댓글을 객체배열로 다시 담아주는 방법으로 해결해보았다.

 

 

Service 단

    @Transactional(readOnly = true)
    public List<PostCommentSortDto> getPost(HttpServletRequest request) {
        Claims claims = jwtUtil.combo(request);

        User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(NotFoundUserException::new);

        //작성 시간별 내림차순으로 게시물 반환
        List<Post> postList = postRepository.findAllByUserIdOrderByCreatedAtDesc(user.getId());
        List<PostCommentSortDto> postCommentSortList = new ArrayList<>();

        for(Post post : postList){
            postCommentSortList.add(new PostCommentSortDto(post));
        }

        return postCommentSortList;
    }

 

DTO

package com.sparta.hanghaespringexpertlv3.dto;

import com.sparta.hanghaespringexpertlv3.entity.Comment;
import com.sparta.hanghaespringexpertlv3.entity.Post;
import lombok.Getter;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

@Getter
public class PostCommentSortDto {
    private String title;
    private String content;

    private String username;
    private List<Comment> comments;


    public PostCommentSortDto(Post post) {
        this.title = post.getTitle();
        this.content = post.getContent();
        this.username = post.getUser().getUsername();

        if(post.getComments()!=null){
            Collections.sort(post.getComments(),
                    Collections.reverseOrder(Comparator.comparing(Comment::getCreatedAt)));
        }
        this.comments = post.getComments();
    }
}

ArrayList의 정렬이라해서 간단하게 생각하여 sort 메서드와 reversOrder메서드의 기본값을 사용하면 될 줄 알았는데, 실행해보니 형변환 예외가 발생했다.

 

Collections.resversOrder() 는 기본 값으로 사용할 시에, String과 Integer 배열 등 기본적으로 Comparable이 적용되어 있는 타입에만 적용할 수 있다. 이것은 정렬을 진행할 때 Comparable로 비교 기준이 적용되어 있기 가능한 것이다.

 

하지만 내가 따로 생성한 객체인 Comment에 대해서는 어떠한 비교기준도 선언되어 있지 않기 때문에, 이것을 어떻게 정렬할 것인지 알지 못해서 형변환 에러가 발생하는 것이다.

 

Comparator를 따로 만들어주어도 되지만, 기술 매니저님께서 람다식을 사용하는 방법을 알려주셔서 적용해보았다.

reverseOrder 내에 Comparator를 선언해주고, 비교할 대상을 Comment(엔티티), 비교 기준을 getCreatedAt(작성시간) 으로 설정했다.

 

 Postman으로 실행해보니, 정상적으로 내림차순 정렬이 되는 것을 확인할 수 있었다.

람다식이 생각보다 코드를 많이 줄여주고, 간편하게 로직을 짤 수 있어서 람다와 스트림에 대한 호기심이 생겼다.

 

 

 

느낀 점 

지금껏 진행했던 학습 주차 중에 가장 어렵게 느껴졌던 것 같다. JPA는 아직 개념이 많이 부족해서 따로 책을 구매해서 공부해봐야할 것 같다. Spring과 JPA 둘 다 동작 원리나 이론적 배경에 대한 학습이 필요하다고 느꼈다.

 

심화 주차에는 Spring Security와 카카오 로그인을 구현해볼 예정인데, 기대 반 설렘 반이다.

분발해서 다음 주차에도 심화 난이도 과제까지 전부 수행할 수 있도록 해야겠다.

'항해99' 카테고리의 다른 글

항해 99 - 2023.02.23 TIL  (0) 2023.02.23
항해 99 - 2023.02.18 TIL  (0) 2023.02.18
항해 99 - 2023.02.15 TIL  (0) 2023.02.16
항해 99 - 2023.02.09 TIL  (0) 2023.02.10
항해 99 - 2023.02.07 TIL  (0) 2023.02.07