인프런 커뮤니티 질문&답변
답변 3
1
별님이 그려주신 것 처럼 같은 다른 테이블인데 같은 FK id가 들어가기 때문에 안되는 것이 맞습니다.
질문을 주실 때 고민을 많이 하고, 또 친절하게 그림으로 설명해주셔서 고맙습니다^^
1
답변 정말 감사합니다.!!
패치조인하면서 where로 테이블 이름을 적어줬기에 post안에는 파일번호 1,2가 들어 있는데요.
p = Post(id=1, title=포스트, files=
[File(id=1, postId=1, type=post, fileName=111111),
File(id=2, postId=1, type=post, fileName=222222)])
post만 조회하고나서 post.files를 했을때는 연관관계가 없다보니 그냥 post의 번호로만 조인해서 보여주니
다른 테이블에서 넣어주는 파일도 포함이 되어버렸습니다. 이때문에 복합키를 연관관계로 해야하나 고민해서 책을 읽어봤는데 그러면 post와 연관된 다른 테이블도 복합키로 해야해서 복잡해지더라구요.
@Test
void showLazyPost() {
JPAQueryFactory query = new JPAQueryFactory(em);
QPost post = new QPost("post");
Post findPost = query
.selectFrom(post)
.fetchOne();
System.out.println(findPost.getFiles());
}
select
post0_.id as id1_2_,
post0_.title as title2_2_
from
post post0_
select
files0_.post_id as post_id3_1_0_,
files0_.id as id1_1_0_,
files0_.id as id1_1_1_,
files0_.file_name as file_nam2_1_1_,
files0_.post_id as post_id3_1_1_,
files0_.type as type4_1_1_
from
file files0_
where
files0_.post_id=?
[File(id=1, postId=1, type=post, fileName=111111),
File(id=2, postId=1, type=post, fileName=222222),
File(id=3, postId=1, type=anotherPost, fileName=3333333),
File(id=4, postId=1, type=anotherPost, fileName=4444444)])
그냥 파일 테이블을 분리하는게 가장 단순한 방법이 될거 같습니다.
너무 하나의 테이블로 하려는 집착을 해버렸네요.
0
안녕하세요. 별님 좋은 질문입니다.
충분히 많이 고민하신게 느껴지네요. 질문을 풀어서 하나하나 답변 드릴께요.
1. 게시판을 조회할때 파일도 같이 패치조인하면 post.files같은 객체그래프가 되기는하는데 post만 조회하고나서 하는 객체그래프는 연관관계가 제대로 되어 있지 않아 원하는 값을 얻지를 못하더라구요.?
(수정)아래 그려주신 것 처럼 각 테이블의 아이디가 같기 때문에 문제가 발생하는게 맞습니다.
2. 다중성 설정할 때는 반드시 연관관계가 있게 설계하는게 바람직 할까요?
사실 이런류의 테이블들이 있습니다. 특정 연관관계 보다는 단순히 애플리케이션 전체에서 공통으로 사용하는 테이블들이지요. 지금처럼 파일을 보관하는 테이블이나, 공통 코드를 모아둔 테이블, 또는 로그를 저장하는 테이블 등이 있습니다. 저의 경우 이런 공통 테이블은 연관관계를 맺지 않도록 설계합니다. 사실 연관관계를 맺어도 크게 얻을 수 있는 이점이 많지 않습니다.
3. 어떻게든 연관관계를 갖게 하기 위해 게시판 테이블을 합칠지, 파일 테이블을 분리해야할지 고민을 너무 오래해서 조언 부탁드립니다.!
이런 고민이 될때는 사실 가장 단순한 방법을 선택하는 것이 좋습니다. 단순하게 선택하고 나중에 변경하는 것이지요. 만약 file 테이블이 전체 애플리케이션에서 2개 밖에 안된다면, 그냥 2개를 분리하는게 더 나은 선택일 가능성이 높습니다. 그러면 JPA 모델링을 깔끔하게 가져갈 수 있습니다. 그런데 공통으로 사용할 file 테이블이 계속 많아질 것으로 예상되면, 2번에서 설명드린 것 처럼 연관관계를 빼고 사용하는게 더 나은 선택이 될 수 있습니다.
사실 여기서 중요한 것은 비즈니스가 어떻게 진행될지에 따라서 적절한 결정을 해야 합니다. 저는 실무에서 정말 하나의 테이블로 파일 관리를 한다? 이런 경우를 많이 보지는 못했습니다. 왜냐하면, 각각 파일 테이블이라고 해도 용도가 조금씩 다르고, 어떤 파일 테이블은 이력관리도 필요하고 이미지 관련 정보 등등, 부가적인 속성도 더 많이 필요했습니다. 반면에 어떤 파일 테이블은 정말 단순히 파일만 보관하면 되었구요. 물론 정말 모든곳에 공통된 파일 포멧이 필요하다면 연관관계 없이 별도의 파일 테이블을 관리하시면 좋을 것 같습니다.
도움이 되셨길 바래요.





