원래는 회원의 아이디, 비밀번호 찾기를 개발할 예정이었으나
위 두가지 이유로 영화 관련 기능을 먼저 개발하기로 결정했다.
왓챠피디아, cgv등을 참고하여 영화 정보 엔티티에 어떤 속성들이 필요할지를 먼저 생각해보았다.
제목, 출연진, 개봉일, 상영시간,,, 매우 많다... 이런 기본 영화 정보외에는
작성, 수정 관리를 위한 datetime 타입의 애트리뷰트들 그리고 영화의 포스터와 프리뷰 이미지들을 위한 애트리뷰트들을 생각했다.
위부터 제목, 감독, 출연진, 국가, 장르, 상영 시간, 관람등급, 평점, 개봉일, 줄거리, 작성일, 수정일, 포스터 이미지 경로, 프리뷰 이미지 경로이다.
대부분 가변길이 문자열로 선언했고 개봉일은 날짜까지만, 작성, 수정일은 시간까지 기록하기 위해 날짜타입을 구분을 해주었고
평점의 경우 평점의 합산값과 총 평가수를 total_ratings로 기록한뒤에 평균 평점을 계산하는 메서드를 따로 넣어줄 계획이다.
관람등급의 경우 enum으로 구분을 지을 생각이고 장르의 경우는 아직 고민중이다.
이렇게 장르가 복합적으로 들어가기 때문에 추후에 영화 장르 검색을 개발할 때 다시 고려해보기로 하고 코드에서도 string으로 선언해두기로 했다.
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "movies")
public class Movie {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "movie_id", nullable = false)
private Long id;
@Column(name = "title", nullable = false)
private String title;
@Column(name = "director", nullable = false)
private String director;
@Column(name = "cast", nullable = false)
private String cast;
@Column(name = "country", nullable = false)
private String country;
@Column(name = "genre", nullable = false)
private String genre;
@Column(name = "runtime", nullable = false)
private String runtime;
@Column(name = "age", nullable = false)
private String age;
@Column(name = "sum_of_rating")
private double sumOfRating;
@Column(name = "total_ratings", nullable = false)
private String totalRatings;
@Column(name = "content", nullable = false)
private String content;
@Column(name = "poster_img_path")
private String posterImgPath;
@Column(name = "preview_img_path")
private String previewImgPath;
@Column(name = "opening_date")
private LocalDate openingDate;
@CreatedDate
@Column(name = "create_at")
private LocalDateTime createAt;
@LastModifiedDate
@Column(name = "updated_at")
private LocalDateTime updatedAt;
@Builder
public Movie(String title, String director, String cast, String country, String genre, String runtime, String age, double sumOfRating, String totalRatings, String content, String posterImgPath, String previewImgPath, LocalDate openingDate) {
this.title = title;
this.director = director;
this.cast = cast;
this.country = country;
this.genre = genre;
this.runtime = runtime;
this.age = age;
this.sumOfRating = sumOfRating;
this.totalRatings = totalRatings;
this.content = content;
this.posterImgPath = posterImgPath;
this.previewImgPath = previewImgPath;
this.openingDate = openingDate;
}
}
애트리뷰트가 정말 많다.
@NoArgsConstructor(access = AccessLevel.PROTECTED)로 외부의 객체 생성을 막아 불완전한 객체의 생성을 제한하고
id, 생성일, 수정일을 제외한 파라미터를 받는 생성자에 @Bulider를 달아서
생성자는 하나만 이용하기로 했다.
id, 생성일, 수정일은 자동 생성되게 구현을 하였다
어떤 기능들을 만들지에 대한 정리이다
아직 예매율에 따른 영화 순위 기능은 아직 구현에 대해 논의중이라 순위 기능을 제외한
crud 기능들을 생각해보았고 요청과 반환에 대해서만 정리를 한 상태이다
후에 기능 구현전 해당 기능들의 블랙박스 시퀀스 다이어그램을 다시 그릴 예정이다.
Response 형식은 code, message, data로 통일할 생각이고 영화 전체조회의 경우 페이지와 조회할 숫자를 넘겨 원하는 만큼의 데이터만 슬라이스할 계획이다.
브랜치 체크아웃 사용 미숙
이번 프로젝트에서는 엔티티 별로 브랜치를 만들고 develop 브랜치로 병합
-> main으로 병합 하는 순서로 형상 관리를 하기로 했는데 팀원분과 나 둘다
브랜치를 체크아웃 하면서 개발하는게 처음이라 팀원분께서는 개발한 코드들을 날리셨고 나는 영화 엔티티의 브랜치를 만들고 체크아웃 하는데 꽤 시간이 오래걸렸다.
레퍼런스는 많았지만 예전에 잘못된 병합으로 작성한 코드를 날린적이 있어서
불안함에 많은 레퍼런스를 확인하느라 시간이 오래 걸린것 같다.
yml 파일 관리 문제
yml 파일을 서로의 로컬에 저장하고 git에는 올리지 않기로 약속을 했었다.
따라서 yml파일은 커밋이 되지 않은 파일이었고 체크아웃을 하자 yml파일이 사라졌다.
매번 yml 파일을 넣어주는것도 번거롭고 내가 수정을 할 때마다 팀원분께 코드를 전달해드리는것도 매우 비효율적이라는 생각이 들어서 설정 파일들을 어떻게
관리하는지를 찾아 보았는데
설정 파일의 관리
위의 블로그를 참고하여 yml파일도 커밋하되 숨겨야 하는 부분들만 환경변수로 처리하여 값이 노출되지 않도록 하기로 했다.
password: ${rds_secret_key}
현재 배포환경이 구성되지 않은 상황이고 팀원분과 나 둘다 인텔리제이를 사용하여 위와 같은 방법으로 각자 환경변수를 설정하고 앞으로 yml 파일도 같이 커밋을 하기로 했다. 배포 환경이 구성되면 배포 서버의 운영체제에 환경변수를 설정하는 방식으로 변경할 예정이다.
계획에 수정이 생긴 날이었다.
오랜만에 팀원분과 만나서 회의를 진행했는데 팀원분께서 맡은신 리뷰 부분이
영화, 회원과 참조 관계가 있어서 실제 데이터가 있으면 좋겠다는 말씀을 해주셨고
우선 순위를 바꿔서 개발중이던 나머지 회원 관련 기능의 구현을 미루기로 하였다.
그리고 팀원분께서 참조 관계에 대해 어떻게 구현을 해야 좋은 코드일지 많은 고민을 하고 계셔서 같이 방법을 찾기로 했는데
다음주에 구현할 영화예매 기능에도 많은 참조가 발생하기에 이번에 확실히 방법을 정하고 넘어가는게 좋을것 같다고 생각을 했고 같이 방법을 정한후 각자 다음 과정을 진행하기로 했다.
팀원분도 나도 열심히 진행중이라 계획한대로 저번보다 훨씬 나은 프로젝트가
완성이 될 것 같아 기분이 좋다
이제 엔티티간 참조를 어떤식으로 할 지 빨리 고민 해봐야겠다,,,
감사합니다. 이런 정보를 나눠주셔서 좋아요.