Entity를 작성하면서 관계를 맺던 중 들었던 생각
OneToOne 관계는 솔직히 쉬워서 굳이 길게 생각할 필요가 없지만
1 : N 관계는 뭔가 작성을 할 때 생각을 하게 되는 것 같다.
우선 이 글에서 사용할 Entity들이다.
@Data
@Entity
@Table(name = "SkillTag")
public class SkillTagEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@OneToMany(mappedBy = "skillTag")
private List<ProjectSkillTagMappingEntity> projectSkillTagMappings;
}
@Data
@Entity
@Table(name = "ProjectSkillTagMapping")
public class ProjectSkillTagMappingEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToOne
@JoinColumn(name = "project")
private ProjectEntity project;
@ManyToOne
@JoinColumn(name = "skillTag")
private SkillTagEntity skillTag;
}
이게 ManyToOne은 그냥 One에 해당하는 Entity를 가지고 있기만 하면 된다.
어차피 One쪽에서 Many를 관리할 일이 없다면 굳이 One 쪽에 데이터들을 가지고 있을 필요 없이 그냥 Many쪽에 외래키 하나만 넣어주면 해결되는 아주 깔끔한 문제
@ManyToOne
@JoinColumn(name = "skillTag")
private SkillTagEntity skillTag;
만약 이 Entity에서 SkillTag에 대한 데이터를 얻고 싶다면 그냥 여기서 간단하게 읽어오면 된다.
하지만 One이 한 번에 Many를 관리할 경우인 OneToMany가 문제이다.
@OneToMany(mappedBy = "skillTag")
private List<ProjectSkillTagMappingEntity> projectSkillTagMappings;
이렇게 작성을 한다고 해서 당연히 DB에 해당하는 Entity가 List로 저장이 되지는 않을 것이다.
이렇게 작성을하면
이런 식으로 One 쪽에 해당하는 외래키가 생성이 되게 된다.
이 부분이 초반에 굉장히 헷갈렸던 게, 물론 당연히 DB에 리스트로 저장이 되지 않을 것은 알고 있었지만 OneToMany를 만든 쪽에서 DB에 Column이 생성되는 것이 아닌, OneToMany를 받는 쪽에 Column이 생성이 된다.
처음에는 OneToMany를 그냥 다 ManyToOne으로 바꾸면 더 명시적으로 사용할 수 있지 않을까? 라는 생각에 다 바꿔보기도 했지만 분명 OneToMany를 사용해야 하는 순간이 온다.
물론 진짜 안쓰려고 한다면 안 쓸 수는 있을 것 같다.
얻어온 데이터로 다시 where문을 작성해서 데이터를 읽거나 쓰도록 코드를 작성한다면 말이다.
하지만 이렇게 작성하면 왜 외래키를 사용하지? 왜 RDS를 사용하지? 라는 생각이 들었다.
DB에 접근하는 코드를 반복문으로 사용한다는 것도 큰 부담이었다.
그래서 내가 생각한 최적의 방법은 OneToMany를 사용할 때 반대편 부분에도 해당하는 ManyToOne 관계를 걸어주는 것이다.
반대편 부분에서 ManyToOne 관계를 사용할 경우가 없다고 하더라도 어차피 이쪽 부분에 Column이 추가가 되고, 이렇게 작성을 해준다면 더 명시적으로 사용할 수 있기 때문이다.
'블로그 개발 프로젝트' 카테고리의 다른 글
CORS Error (0) | 2023.07.28 |
---|---|
JPA으로 Paging (0) | 2023.07.24 |
JPA TopBy (0) | 2023.07.24 |
Swagger 작성 (0) | 2023.07.24 |
스프링 초반 구조 설계 (0) | 2023.07.20 |