본문 바로가기
프로젝트관련/저스트 보드

DTO와 Entity / JPA Join돼 있는 값 빼오기

by 자비리뷰 2023. 8. 13.

예전에 검색을 해봤을 때 둘의 차이를 읽어본 적 있지만 무슨 차이인지 인식을 못 했었다.

 

그 당시

DTO는 받아온 정보를 넘겨주는 역할

Entity는 테이블의 속성을 똑같이 만들어 두는 역할

 

이정도로 이해하고 넘겼는데.

(물론 그러면서도 Entity만으로 정보를 넘겨 사용했었는데 왜 DTO가 있어야 하는지 몰랐다.)

 

여튼 이번에 알게된 사항은 ChatGPT가 알려준 부분이라 거짓말일 가능성도 있지만,

지금 이해한 것은

Entity는 테이블의 속성을 똑같이 만들어 두는 역할이고,

테이블에서 내가 원하는 항목만 빼오고 싶을 때 DTO를 만들어서 사용한다는 거 같다.

 


JPA Join 돼 있는 값 빼오기

이걸 하려고 거의 세 시간 헛짓 한 거 같다.

그래도 다행인 점은 세 시간을 들여 방법을 찾아냈다는 것..

(이걸 적으면서도 내가 대가리 박아가며 찾지 말고 검색을 했다면 더 빠르지 않았을까? 라는 후회가 든다.)

 

여튼

내 entity는

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "comment")
public class Comment {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String content;
    @ManyToOne
    @JoinColumn(name="member_id")
    private Member memberId;    
    @ManyToOne
    @JoinColumn(name="article_id")
    private Article2 articleId;
    private Date date;
    @Column(name="ref_id")
    private int refId;
    private int step;
    private int ref;
    @Column(name="ref_order")
    private int refOrder;
    @Column(name="answer_num")
    private Long answerNum;    
}

이렇게 구성돼있고

    List<Comment> findByArticleId_Id(Long articleId, Sort sort);

이걸 사용해서 값을 불러오니

join되 있는 member라든지 article2라든지 모든 정보를 다 불러와서, 심지어 비밀번호까지 불러와서,

'이런 식으로 사용하면 안되겠구나'라는 경각심이 들어서

일단 

@Query

를 사용해서 직접 SQL문을 작성하기로 했다.

이러는 과정에서 DTO를 검색하게 됐다.

 

여튼

@Query를 쓰는게 옳고 그른지는 잘 모르겠지만,

금세 해결될 줄 알았던 게 생각보다 뜻대로 되지 않았다.

 

여튼 결론적으로

머리를 박아가며 알게된 건

package com.just_board.just_board.dto;

import java.util.Date;

import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor

public class CommentSummary {
    private Long id;
    private String content;
    @ManyToOne
    @JoinColumn(name="member_id")
    private String memberName;
    
    // @Column(name="member_id")
    // private int memberId;
}

 

package com.just_board.just_board.repository;

import java.util.List;

import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import com.just_board.just_board.dto.CommentSummary;
import com.just_board.just_board.entity.Comment;

public interface CommentRepository extends JpaRepository<Comment,Long>{
    
    @Query("SELECT  new com.just_board.just_board.dto.CommentSummary(c.id, c.content, c.memberId.name, c.date) FROM Comment c WHERE c.articleId.id = :articleId ORDER BY c.ref ASC, c.refOrder ASC")
    List<CommentSummary> findCommentSummaryByArticleId(Long articleId);
    
    // @Query("SELECT  new com.just_board.just_board.dto.CommentSummary(c.id, c.content, c.memberId.Id, c.date) FROM Comment c WHERE c.articleId.id = :articleId ORDER BY c.ref ASC, c.refOrder ASC")
}

이렇게 할 수 있었다는 점이다.

'c.memberId.name' 이라든지 'c.memberId.Id'이걸 확인하는 데 오래걸렸다.

(왜 Id는 i가 대문자이고, name은 n이 소문자여야만 작동하는 지는 아직도 모르겠다.)

 

'프로젝트관련 > 저스트 보드' 카테고리의 다른 글

디버깅  (0) 2023.08.15
@Query와 @Modifying과 @Transactional  (0) 2023.08.15
vue history모드와 hash모드  (0) 2023.08.12
(생각)화면 움직이기?  (0) 2023.08.08
(vue) 부모에서 자식의 매소드 사용하기!  (0) 2023.08.08