• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

연관관계없이 테이블 설계 및 JPA Domain Class 작성 문의

23.08.08 13:03 작성 23.08.08 13:10 수정 조회수 685

0

안녕하세요. 현재 김영한님의 JPA관련 강의들을 수강하면서 기존 프로젝트에서 JPA 로 변경시 문제가 있어 문의드립니다.

배운 것을 실적용할 경우 문제는, 테이블 설계시 제약사항이 테이블 간 연관관계 설정을 하지 않는 것입니다.

이 경우 도메인클래스를 어떻게 작성해야 할지 적절한 기준과 방법을 몰라 문의드립니다.

간략히 예를들어 DBA권고에 따라 외래키 설정은 모두 하지 않는다고 가정해서 아래와 같이 테이블을 생성했을 시에

|    COMMENT    |                  |   COMMENT_IMAGE   |
| comment_id(PK)|                  | comment_img_id(PK)|
| user_name(PK) | ------- X ------ | comment_img_name  |
                                   | comment_id        |
/* DO NOT USE CONSTRAINT foreign key() references */

따라서 기존에 아래와 같은 DTO가 있다면,

public class Comment {
    ....
    
    private Long id;
   
    private String name;
    
    private List<CommentImage> commentImages;
    ....
}

로 작성되어 있을 경우 아래와 같이 수정중인데

...
@IdClass(CommentId.class)
public class Comment {
    ....
    @Id
    private Long id;
    @Id
    private String name;
    //@?
    private List<CommentImage> commentImages;
    ....
}

기존에는 따로 CommentImage List<>를 조회해서 넣어주면 됐지만

cmt = DAO.getComment(id, name);
cmt.setCommentImages( DAO.getCommentImageList( cmt.getId() ) );
return cmt;

/*
getComment SQL
SELECT * FROM COMMENT WHERE COMMENT_ID = :id AND USER_NAME = :name;
getCommentImageList SQL
SELECT * FROM COMMENT_IMAGE WHERE COMMENT_ID = :comment_id;
*/

 

JPA의 경우 Domain 클래스에서 Join관련 어노테이션 설정이 없으면 Could not determine recommended JdbcType 오류가 발생합니다. 이 경우 연관관계 생성없이 도메인을 설계하고 사용하는 방법을 알 수 있을까요?

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.08.10

안녕하세요, 인프런 AI 인턴이에요.
JPA를 사용하여 기존 프로젝트에서 테이블을 변경할 때, 테이블 간 연관관계를 설정하지 않았을 경우에 대해 문의하셨군요.

일반적으로 JPA에서는 엔티티간의 연관관계를 설정하여 사용하는 것이 권장됩니다. 하지만 테이블 설계에 대한 특정 제약사항으로 인해 외래키 설정을 하지 않아야 하는 경우, 연관관계를 설정하는 방법에 대해 알아보겠습니다.

연관관계를 설정하지 않은 경우, 일반적으로는 @OneToMany, @ManyToMany와 같은 어노테이션을 이용하여 연관관계를 표현할 수 있습니다. 하지만 이 경우 JPA가 엔티티들 사이의 관계를 관리하지 않기 때문에 개발자가 직접 연관관계를 관리해야 합니다.

먼저, Comment 엔티티 클래스에서 CommentImage 엔티티와의 연관관계를 설정하는 방법을 살펴보겠습니다. Comment 엔티티 클래스에서는 CommentImage 엔티티 리스트를 멤버 변수로 가지고 있습니다.

그리고 CommentImage 엔티티 클래스도 Comment와의 관계를 매핑하려면 어노테이션을 통해 해당 관계를 표현해야 합니다.

예를 들어, Comment 엔티티 클래스에서 CommentImage 엔티티 리스트에 @ElementCollection 어노테이션을 사용하여 매핑할 수 있습니다. 다음은 예시 코드입니다.

@Entity
public class Comment {
    // ...
    
    @Id
    private Long id;
    @Id
    private String name;
    
    @ElementCollection
    private List<CommentImage> commentImages;
    
    // ...
}
@Embeddable
public class CommentImage {
    private String commentImageName;
    // ...
}

이렇게 연관관계를 설정하고, JPA에서는 Comment 엔티티를 조회할 때 CommentImage 엔티티 리스트도 함께 로딩됩니다.

하지만 주의하셔야 할 점은, 테이블 설계와 연관관계 설정이 상충할 수 있다는 점입니다. 테이블 설계에 제약사항이 있다면 해당 제약사항에 맞게 연관관계 설정을 해야 합니다.

더 자세한 내용이나 다른 방법에 대해서는 김영한 강사님의 JPA 강의를 참고하시기를 권장드리며, JPA 관련 질문이 있다면 언제든지 물어보세요. 원활한 도움을 드리겠습니다. 감사합니다.