#9 영화 엔티티 수정

seojin's 개발블로그·2023년 8월 20일
0

영화 사이트 제작

목록 보기
9/19

📌 문제 상황

  1. 이미지 파일의 경로가 길어서 에러가 발생함
  2. 영화 줄거리 길이가 길면 에러가 발생
  3. 영화 장르를 어떻게 처리할지 결정해야함

나머지 Api 개발전 영화 정보 등록 api를 테스트하던중 1, 2번 문제가
발생을 하였고 그리고 장르별 조회를 구현하기위해 3번 문제를 해결해야했다.

📌 해결

1. 이미지 파일의 경로가 길어서 에러가 발생함

2. 영화 줄거리 길이가 길면 에러가 발생

애트리뷰트의 최대 길이를 늘려주어서 해결했다.

@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으로 설정을 해주었다.

3. 영화 장르를 어떻게 처리할지 결정해야함

프리뷰 이미지 경로를 별도의 테이블로 만들어준 것 처럼
별도의 테이블로 만들어 주기로 결정했는데 이유는

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)

📌 후기

장르를 어떻게 할 지 고민한것부터 반성해야겠다.
여러 장르를 한꺼번에 저장하는건 원자성을 위반하는데도 어떤 방법이 나을까
고민했던게 바보 같다 ㅠㅠ

앞으로 학교에서 배운것들을 잘 되새겨야겠다,,,,

profile
개발 공부하는 블로그

0개의 댓글