나머지 Api 개발전 영화 정보 등록 api를 테스트하던중 1, 2번 문제가
발생을 하였고 그리고 장르별 조회를 구현하기위해 3번 문제를 해결해야했다.
애트리뷰트의 최대 길이를 늘려주어서 해결했다.
@Column(name = "content", nullable = false, length = 1000)
private String content;
@Column(name = "poster_img_path", length = 500)
private String posterImgPath;
@ElementCollection
@CollectionTable(name = "preview_images", joinColumns = @JoinColumn(name = "movie_id"))
@Column(name = "preview_image_path", length = 500)
private List<String> previewImgPath = new ArrayList<>();
길이 기준은 한글의 경우 2바이트 영어는 1바이트로 저장이 되므로
줄거리의 경우 length를 1000으로 두어 500자 제한
이미지 경로의 경우 250~350사이로 저장이 되는것을 확인했는데 혹시 더 크게 저장이 되는 경우를 위해 500으로 설정을 해주었다.
프리뷰 이미지 경로를 별도의 테이블로 만들어준 것 처럼
별도의 테이블로 만들어 주기로 결정했는데 이유는
i. 여러 장르를 같이 저장할 시 원자성을 해침
- 하나의 애트리뷰트에 하나의 값만 담아야 하나 드라마/스릴러/액션 처럼 작성시 여러 값이 들어가는 모양이 되므로 원자성을 해치게됨 이 이유만으로도 사용하면 안됨
ii. 쿼리문의 복잡성
- String으로 굳이 작성을 하더라도 DB 검색시 쿼리문이 지저분해짐
iii. 데이터 중복 저장 가능성
- 드라마/드라마 처럼 저장이 되더라도 사람이 인지하지 못하면 그대로 중복 저장이됨
위 세가지 이유로 별도의 테이블로 저장을 해주기로 결정을 했다.
@ElementCollection
@CollectionTable(name = "movie_genres", joinColumns = @JoinColumn(name = "movie_id"))
@Column(name = "genre")
private Set<String> genre = new HashSet<>();
SELECT * FROM movies WHERE '가족' IN (SELECT genre FROM movie_genres WHERE movie_id = movies.movie_id)
장르를 어떻게 할 지 고민한것부터 반성해야겠다.
여러 장르를 한꺼번에 저장하는건 원자성을 위반하는데도 어떤 방법이 나을까
고민했던게 바보 같다 ㅠㅠ
앞으로 학교에서 배운것들을 잘 되새겨야겠다,,,,