작성
·
367
·
수정됨
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
안녕하세요! 선생님 강의를 수강하고 현재 플젝을 진행중에 값타임 컬렉션 처리와 관련해서 고민하면서 강의를 다시 보았는데도 해결방안이 잘 떠오르지 않아서 질문드렸습니다. 현재 Post 폼에서 장기 Post와 단기 Post를 나누어서 각각 작성된 폼을 DB에 저장하는데 장기 Post에서는 LocalDateTime 필드들이 리스트형식으로 있는 필드들과 다른 필드들이 함께 객체로 프론트에서 넘어오고, 단기 Post에서는 String 타입의 리스트들과 다른 필드들이 객체 형식으로 넘어옵니다. 또한 Post는 수정을 통해 날짜도 변경할 수 있습니다.
따라서 @ElementCollcetion을 사용할 경우, 만약 LocatDateTime과 관련된 날짜들이 여러 개 넘어 올 경우, 날짜 각각이 insert되고, 만약 수정한다면 선생님의 말씀처럼 값타입으로 불필요한 값들까지 모두 삭제되고 다시 갱신되므로,
일대다관계를 생각해보았습니다. 일대다관계일 경우 각각의 LocalDateTime 갯수만큼 insert문으로 DB에 저장될 것이고, Entity이므로 수정의 경우 필요한 부분만 수정하면 된다고 생각하였습니다. 하지만, 예를 들어 하나의 Post당 날짜 필드들이 20개라고 친다면 insert문이 20개 들어갈 것이고, Post의 갯수가 많아진다면 그에 따른 성능이나 비용측면에서 단점이 되지 않을까 생각하였습니다.
그래서 다음으로는 @Converter를 사용하여 들어오는 리스트들의 값을 String 타입으로 변환하고 하나의 Column안에 넣어서 관리하는 방법을 생각하였습니다. 해당 방법은 insert문은 하나만 들어가기 때문에 성능에서 큰 문제를 일으키지 않을 것 같았는데, 만약 수정한다면 해당 컬럼을 삭제하고 다시 추가해야하고, 로직이 복잡해질 것 같습니다.
선생님께서는 현업에서 selectedbox같은 것을 처리할 때 일대다 관계를 이용해서 처리한다고 하셨는데 저와 같은 경우에도 일대다 관계 방법이 좋은 방법일지 아님 더 좋은 방법이 있을지 질문드리게 되었습니다.
답변 1
0
안녕하세요, 인프런 AI 인턴이에요.
값타입 컬렉션에 대한 일대다 관계에 대해서 질문하셨군요. 장기 Post와 단기 Post를 나누어서 각각 작성된 폼을 DB에 저장하는 상황에서 LocalDateTime 필드들이 리스트 형식으로 있는 필드들과 다른 필드들이 함께 객체로 프론트에 전달되는 것을 해결하고 싶으시다는 말씀이신가요?
처음으로 확인해야 할 부분은, LocalDateTime이 값 타입인지 엔티티인지에 대한 판단입니다. 값 타입일 경우 장기 Post의 필드로 포함시키기보다는, 별도의 테이블로 정규화하여 일대다 관계로 표현하는 것이 일반적입니다.
따라서 장기 Post와 단기 Post는 별도의 엔티티이고, 장기 Post에서 LocalDateTime 필드들의 일대다 관계를 구성할 수 있을 것입니다. 이때, LocalDateTime 필드들을 별도의 엔티티로 추출하고, 장기 Post와 OneToMany 또는 ManyToMany 관계를 설정하면 될 것입니다.
만약 LocalDateTime 필드들이 리스트 형식으로 있는 필드들과 함께 하나의 객체로 프론트에 전달되어야 한다면, DTO(Daata Transfer Object)를 통해 필요한 필드만 전달하도록 하는 방법을 고려해보세요. DTO를 통해 특정 필드들만 선택하여 전달할 수 있으므로, 필요한 필드만 전달할 수 있습니다.
추가적으로, 상세한 코드나 구체적인 상황을 알려주신다면 더욱 정확한 도움을 드릴 수 있을 것 같습니다. 감사합니다!