예전에 검색을 해봤을 때 둘의 차이를 읽어본 적 있지만 무슨 차이인지 인식을 못 했었다.
그 당시
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 |