[Spring] 다대다 관계의 엔티티를 사용하는 프로젝트 생성
![[Spring] 다대다 관계의 엔티티를 사용하는 프로젝트 생성](/assets/img/web/spring/logo.png)
다대다 관계의 엔티티를 사용하는 프로젝트 생성해봅시다.
- 1. mreview 프로젝트 생성
- 2. 의존성 주입
- 3. Movie 생성
- 4. MovieImage 생성
- 5. movie와 movie_image ERD 확인
- 6. Member 생성
- 7. Review 생성
- 8. review와 m_member, movie와 movie_image ERD 확인
- 9. MovieRepository 생성
- 10. MovieImageRepository 생성
- 11. MovieRepositoryTests - insertMovies() 작성
- 12. MovieRepositoryTests - insertMovies() 결과 1
- 13. MovieRepositoryTests - insertMovies() 결과 2
- 14. MemberRepository 생성
- 15. MemberRepositoryTests - insertMembers() 작성
- 16. MemberRepositoryTests - insertMembers() 결과
- 17. ReviewRepository 생성
- 18. ReviewRepositoryTests - insertMovieReviews() 작성
- 19. ReviewRepositoryTests - insertMovieReviews() 결과
앞서 게시판과 댓글 기능을 제공하는 게시판을 만들어 N:1 관계를 처리했다면 이번엔 이미지를 업로드할 수 있는 영화 리뷰 게시판을 만들어 N:M 관계를 처리해보고자 합니다.
1. mreview 프로젝트 생성
생성하는 프로젝트의 이름은 mreivew로, Gradle과 War 패키징을 지정합니다.
2. 의존성 주입
주입하는 의존성은 위의 그림과 같습니다.
3. Movie 생성
영화의 정보를 담을 Movie 엔티티 위 그림의 경로와 같이 생성합니다.
Movie 엔티티는 board 프로젝트 생성에서 사용한 BaseEntity를 작성한 뒤 상속하여 작성합니다.
Movie 엔티티는 단순히 영화 제목만을 가지는 구조로 작성합니다.
4. MovieImage 생성
사진을 다룰 MovieImage 엔티티를 생성합니다.
테이블로 생성될 때 movie 테이블이 PK를 가지고, moive_image 테이블은 FK를 가지게 되므로 @ManyToOne
을 적용해 이를 표시합니다.
5. movie와 movie_image ERD 확인
프로젝트를 실행한 뒤 생성된 테이블의 ERD를 확인합니다.
앞서 board 프로젝트에서 다루었던 N:1 관계로 생성된 것을 확인할 수 있습니다.
6. Member 생성
회원의 역할을 할 Member 엔티티를 생성합니다.
멤버의 고유한 번호, 이메일, 아이디, 비밀번호, 닉네임을 가지도록 설계합니다.
7. Review 생성
Review 엔티티는 Movie와 Member 모두 참조하고, toString() 호출 시 다른 엔티티를 사용하지 않도록 exclude 속성을 지정합니다.
8. review와 m_member, movie와 movie_image ERD 확인
프로젝트를 실행한 뒤 생성된 테이블의 ERD를 확인합니다.
생성된 review 테이블은 매핑 테이블입니다.
매핑 테이블
이란 주로 동사를 의미하는 테이블입니다. ‘회원이 영화에 대해서 평점을 준다’ 에서 ‘평점을 준다’는 행위가 매핑 테이블이 필요한 부분입니다.
매핑 테이블은 두 테이블 사이에서 양쪽의 PK를 참조하는 형태로 구성됩니다.
9. MovieRepository 생성
위의 그림과 같은 경로에 MovieRepository 인터페이스를 생성합니다.
10. MovieImageRepository 생성
마찬가지로 MovieImageRepository 인터페이스 역시 생성합니다.
11. MovieRepositoryTests - insertMovies() 작성
test 폴더 내에 repository 패키지를 추가한 뒤 Repository 테스트를 위한 MovieRepositoryTests 클래스를 추가합니다.
그 후 영화와 영화 이미지를 추가하는 테스트 코드를 위와 같이 작성합니다.
영화와 영화 이미지는 같은 시점에 insert 처리가 되어야 합니다. 때문에 우선 Movie 객체를 save()한 뒤 Movie 객체의 mno를 이용해 영화의 이미지를 추가합니다. 영화의 이미지는 5장까지 임의로 저장됩니다.
영화의 이미지의 경우 java.util.UUID를 이용해 고유한 번호를 생성해 저장하도록 작성합니다.
12. MovieRepositoryTests - insertMovies() 결과 1
실행 결과 Movie 엔티티가 데이터베이스의 movie 테이블에 정상적으로 100개의 영화가 저장된 것을 확인할 수 있습니다.
13. MovieRepositoryTests - insertMovies() 결과 2
MovieImage 엔티티의 경우 특정 영화에는 이미지가 많이 들어가도록 저장된 것을 확인할 수 있습니다. 99번 영화의 경우 3장의 이미지가, 98번 영화의 경우 5장의 이미지가 존재하는 것을 알 수 있습니다.
14. MemberRepository 생성
회원의 처리도 동일하게 MemberRepository를 구성합니다.
15. MemberRepositoryTests - insertMembers() 작성
100명의 회원을 추가하기 위한 테스트 코드를 작성합니다.
16. MemberRepositoryTests - insertMembers() 결과
실행 결과 데이터베이스의 m_member 테이블에 정상적으로 Member 엔티티가 저장된 것을 확인할 수 있습니다.
17. ReviewRepository 생성
Movie와 Member 엔티티의 설계와 필요한 더미 데이터의 준비가 되었다면 매핑 테이블에 데이터를 추가합니다. 이를 위한 ReviewRepository를 생성합니다.
18. ReviewRepositoryTests - insertMovieReviews() 작성
데이터베이스 내에 100개의 영화와 100명의 회원이 존재하므로, 이를 이용해 1~5점까지의 평점과 리뷰 내용을 등록하는 테스트 코드를 작성합니다.
200개의 리뷰를 데이터베이스 내에 존재하는 mno와 mid를 임의로 생성하여 처리합니다.
19. ReviewRepositoryTests - insertMovieReviews() 결과
실행 결과 데이터베이스의 review 테이블에 정상적으로 review 엔티티가 저장된 것을 확인할 수 있습니다. 임의로 생성했기 때문에 리뷰가 작성되지 않은 영화도 존재합니다.