[Spring] 다대다 관계의 엔티티를 사용하는 프로젝트 생성

[Spring] 다대다 관계의 엔티티를 사용하는 프로젝트 생성

다대다 관계의 엔티티를 사용하는 프로젝트 생성해봅시다.


앞서 게시판과 댓글 기능을 제공하는 게시판을 만들어 N:1 관계를 처리했다면 이번엔 이미지를 업로드할 수 있는 영화 리뷰 게시판을 만들어 N:M 관계를 처리해보고자 합니다.



1. mreview 프로젝트 생성



1

생성하는 프로젝트의 이름은 mreivew로, Gradle과 War 패키징을 지정합니다.

2. 의존성 주입



2

주입하는 의존성은 위의 그림과 같습니다.

3. Movie 생성



3

영화의 정보를 담을 Movie 엔티티 위 그림의 경로와 같이 생성합니다.
Movie 엔티티는 board 프로젝트 생성에서 사용한 BaseEntity를 작성한 뒤 상속하여 작성합니다.
Movie 엔티티는 단순히 영화 제목만을 가지는 구조로 작성합니다.

4. MovieImage 생성



4

사진을 다룰 MovieImage 엔티티를 생성합니다.
테이블로 생성될 때 movie 테이블이 PK를 가지고, moive_image 테이블은 FK를 가지게 되므로 @ManyToOne을 적용해 이를 표시합니다.

5. movie와 movie_image ERD 확인



5

프로젝트를 실행한 뒤 생성된 테이블의 ERD를 확인합니다.
앞서 board 프로젝트에서 다루었던 N:1 관계로 생성된 것을 확인할 수 있습니다.

6. Member 생성



6

회원의 역할을 할 Member 엔티티를 생성합니다.
멤버의 고유한 번호, 이메일, 아이디, 비밀번호, 닉네임을 가지도록 설계합니다.

7. Review 생성



7

Review 엔티티는 Movie와 Member 모두 참조하고, toString() 호출 시 다른 엔티티를 사용하지 않도록 exclude 속성을 지정합니다.

8. review와 m_member, movie와 movie_image ERD 확인



8

프로젝트를 실행한 뒤 생성된 테이블의 ERD를 확인합니다.
생성된 review 테이블은 매핑 테이블입니다.
매핑 테이블이란 주로 동사를 의미하는 테이블입니다. ‘회원이 영화에 대해서 평점을 준다’ 에서 ‘평점을 준다’는 행위가 매핑 테이블이 필요한 부분입니다.
매핑 테이블은 두 테이블 사이에서 양쪽의 PK를 참조하는 형태로 구성됩니다.

9. MovieRepository 생성



9

위의 그림과 같은 경로에 MovieRepository 인터페이스를 생성합니다.

10. MovieImageRepository 생성



10

마찬가지로 MovieImageRepository 인터페이스 역시 생성합니다.

11. MovieRepositoryTests - insertMovies() 작성



11

test 폴더 내에 repository 패키지를 추가한 뒤 Repository 테스트를 위한 MovieRepositoryTests 클래스를 추가합니다.
그 후 영화와 영화 이미지를 추가하는 테스트 코드를 위와 같이 작성합니다.
영화와 영화 이미지는 같은 시점에 insert 처리가 되어야 합니다. 때문에 우선 Movie 객체를 save()한 뒤 Movie 객체의 mno를 이용해 영화의 이미지를 추가합니다. 영화의 이미지는 5장까지 임의로 저장됩니다.
영화의 이미지의 경우 java.util.UUID를 이용해 고유한 번호를 생성해 저장하도록 작성합니다.

12. MovieRepositoryTests - insertMovies() 결과 1



12

실행 결과 Movie 엔티티가 데이터베이스의 movie 테이블에 정상적으로 100개의 영화가 저장된 것을 확인할 수 있습니다.

13. MovieRepositoryTests - insertMovies() 결과 2



13

MovieImage 엔티티의 경우 특정 영화에는 이미지가 많이 들어가도록 저장된 것을 확인할 수 있습니다. 99번 영화의 경우 3장의 이미지가, 98번 영화의 경우 5장의 이미지가 존재하는 것을 알 수 있습니다.

14. MemberRepository 생성



14

회원의 처리도 동일하게 MemberRepository를 구성합니다.

15. MemberRepositoryTests - insertMembers() 작성



15

100명의 회원을 추가하기 위한 테스트 코드를 작성합니다.

16. MemberRepositoryTests - insertMembers() 결과



16

실행 결과 데이터베이스의 m_member 테이블에 정상적으로 Member 엔티티가 저장된 것을 확인할 수 있습니다.

17. ReviewRepository 생성



17

Movie와 Member 엔티티의 설계와 필요한 더미 데이터의 준비가 되었다면 매핑 테이블에 데이터를 추가합니다. 이를 위한 ReviewRepository를 생성합니다.

18. ReviewRepositoryTests - insertMovieReviews() 작성



18

데이터베이스 내에 100개의 영화와 100명의 회원이 존재하므로, 이를 이용해 1~5점까지의 평점과 리뷰 내용을 등록하는 테스트 코드를 작성합니다.
200개의 리뷰를 데이터베이스 내에 존재하는 mno와 mid를 임의로 생성하여 처리합니다.

19. ReviewRepositoryTests - insertMovieReviews() 결과



19

실행 결과 데이터베이스의 review 테이블에 정상적으로 review 엔티티가 저장된 것을 확인할 수 있습니다. 임의로 생성했기 때문에 리뷰가 작성되지 않은 영화도 존재합니다.


© 2022. All rights reserved.