S3를 통해 비디오,썸네일, 프로필 이미지를 업로드 , 삭제 , 수정을 공부했다. 따로 S3Service 단을 분리하고 처리해 3개 모두 편하게 처리할 수 있는 방법에 대해 공부했다.
S3 키 보안의 중요성을 알고, 배포 환경에 따로 업로드 해 처리할 수 있는 방법을 공부했다.
프론트에서 multipart & info json을 동시에 받아서 처리할 수 있는 방법에 대해 고민했다. 해결 방법으로 @RequestPart
를 통해 동시에 받을 수 있었다.
파일을 업로드 한 후 s3의 주소로 접근할 시 파일을 조회하지 않고 다운로드가 동시에 진행되는 문제가 발생했다. 이 문제를 해결하기 위해
metadata contentType
을 설정해야 함을 알 수 있었다.
JPA
와 관련된 공부가 많이 부족함을 알 수 있었다.querydsl
을 적용하여 생각한 흐름으로 filtering + pagination 을 할 수 있음을 알게되었지만 시간 상의 문제로 각각 if 문을 통해 다른 @Query
로 필터링을 만들었다.@Query(value = "select distinct v from Video v\\n" +
"left join VideoCategory vc\\n" +
"on vc.video.idx = v.idx\\n"+
"where v.uploader.userInfo.genderType = :gender\\n" +
"or vc.category.categoryName in (:categories)\\n" +
"order by v.idx desc")
List<Video> findByGenderFiltering(GenderType gender, Collection categories);
@Query(value = "select distinct v from Video v\\n" +
"left join VideoCategory vc\\n" +
"on vc.video.idx = v.idx\\n"+
"where (v.uploader.userInfo.city = :city and v.uploader.userInfo.district = :district)\\n" +
"or vc.category.categoryName in (:categories)\\n" +
"order by v.idx desc")
List<Video> findByLocationFiltering(String city,String district,Collection categories);
@Query(value = "select distinct v from Video v\\n" +
"left join VideoCategory vc\\n" +
"on vc.video.idx = v.idx\\n"+
"where vc.category.categoryName in (:categories)\\n" +
"order by v.idx desc")
List<Video> findByCategoriesFiltering(Collection categories);
1:N 과 pagination 문제
1:N
관계였다. 이 두 entity를 join 을 통해 정보를 가져왔어야 했다. 모든 video를 고려할려면 아무런 cateogry에 속하지 않는 비디오를 처리하기 위해 left outer join
을 했어야했다. 이런 경우에 N:1 의 경우에는 문제가 발생하지 않지만, 1:N 의 경우 pagination이 적용되지 않는 문제가 발생했다.count
문을 명시해보기도 하고, 직접 paging을 해보기도 했지만 모두 적용이 되지 않았다.querydsl
을 적용하여 dynamic 하게 쿼리문을 만들고, pagination을 할 수 있음을 알게되었다.// pagenation -> 1:N join 문제로,,수동으로
List<Video> result = new ArrayList<>();
int count = 0;
for(int i = 0; i < filtered.size();i++){
if(filtered.get(i).getIdx() < lastVideoId){
result.add(filtered.get(i));
count += 1;
}
if(count == size) break;
}
https://www.youtube.com/watch?v=bS08FFG20eQ
또는 https://youtu.be/bS08FFG20eQ
이렇게 두가지 방식이 존재함을 알 수 있었다. 결론적으로 youtube 영상 링크의 끝에서 부터 11자리가 비디오아이디임을 알 수 있었다. 이것을 추출해 [http://img.youtube.com/vi/[비디](<http://img.youtube.com/vi/>[비디어)오 아이디]/[썸네일 번호].jpg
이런 형식으로 접근할 경우 대표 썸네일, 부분 썸네일까지 유튜브에서 자체적으로 추출한 이미지에 접근할 수 있는 방법을 알게되었다./** 유튜브 썸네일 이미지 추출 **/
public String getThumbNailYouTube(String videoUrl) {
// 비디오 아이디 값 추출
// 유튜브 비디오 아이디 끝에서 부터 11자리!
System.out.println(Arrays.toString(videoUrl.split("<https://www.youtube.com/watch?v=>")));
String youTubeID = videoUrl.substring(videoUrl.length()-11);
return ("<http://img.youtube.com/vi/>" + youTubeID + "/0.jpg");
}