💡 깃에 강지수, 이지우 부분 백만 올림
백엔드 - 강지수, 이지우 : 영상 조회 시 [category별 + range별 +검색어] 조합으로 검색할 수 있도록 수정
백엔드 - 최희수, 장유범 : 로그인 기능 구현 부분 수정함. JWT 이용하여 로그인 승인을 할 수 있도록 구현
프론트엔드 - 임영묵, 권오영, 남기정 : 로그인 기능 구현 부분 수정함. JWT 이용하여 로그인 승인할 수 있도록 구현
백+프론트 - 백끼리 구현한 부분 통합, 테스트도 모두 통과. 프론트와도 통합. 프론트+백 통합본은 테스트 진행하지 않음. 로그인 기능 아직 완성하지 못함
📌 영상 검색 시 부위별로 카테고리를 나누고, 전체/ 제목/ 채널명을 기준으로 한 키워드로 검색할 수 있도록 구현하였다.
VideoSearchCondition라는 dto를 만들어 검색 조건들을 담을 객체를 하나 만들었다.
public class VideoSearchCondition {
// 필드 부분
private String[] category;
private String[] range;
private String keyword;
...
}
📌 mapper 작성 시 동적 쿼리, LEFT OUTER JOIN, trim 등을 활용하였다.
<select id="getVideoList" parameterType="VideoSearchCondition" resultType="Video">
SELECT v.v_id as `v_id`, v_writer, reg_date, view_cnt, category, title,
count(⭐f.v_id) as favorite_cnt FROM video v
LEFT OUTER JOIN favorite f ON v.v_id = f.v_id
<trim prefix="WHERE">
<if test="category.length != 0">
category IN
<foreach collection="category" item="type"
open="(" close=")" separator=",">
⭐⭐#{type}
</foreach>
AND
</if>
<if test="range.length != 0">
<foreach collection="range" item="sel"
open="(" close=")" separator=" OR ">
⭐⭐${ sel } LIKE CONCAT('%', #{keyword} ,'%')
</foreach>
</if>
</trim>
GROUP BY v.v_id
</select>
⭐ f.v_id
v.v_id로 하면 (video-왼 테이블과 favorite-오 테이블을 LEFT OUTER JOIN한 상태에서 )video 테이블의 v_id 기준으로 count하기 때문에 favorite_cnt 컬럼에 모두 1이 저장된다.
⭐⭐ #{type}/ ${sel}
(<foreach index=idx >로 설정한 상태에서) #{type[idx]}/ ${ sel[idx] }로 작성하였더니 작동하지 않았다.
👉 favorite 테이블에 저장되지 않은 즉, 좋아요가 없는 영상도 출력하기 위해 video 테이블을 기준으로 LEFT OUTER JOIN을 하였다.
👉 <foreach >에 저렇게 많은 설정들이 들어갈 수 있는지 몰랐다.
프론트단에서 category를 여러개 선택할 수 있고, range도 전체(제목과 채널명 둘 다) 조회가 가능하기 때문에 category와 range를 배열형태로 전달한다. keyword는 사용자가 입력하는 String 1개이다.
@GetMapping("/video")
public ResponseEntity<List<Video>> videoList(String[] category, @RequestParam(defaultValue = "")String keyword, String range){
if(keyword.equals("")) {
return new ResponseEntity<>(null, HttpStatus.NOT_ACCEPTABLE);
}
String[] ranges = new String[0];
if(range.equals("전체")) {
ranges = new String[2];
ranges[0] = "title";
ranges[1] = "v_writer";
} else if(range.equals("제목")){
ranges = new String[1];
ranges[0] = "title";
} else {
ranges = new String[1];
ranges[0] = "v_writer";
}
if(category == null) {
category = new String[0];
}
List<Video> videoList = videoService.findVideoList(
new VideoSearchCondition(category, ranges, keyword)
);
if(videoList.size() == 0) {
return new ResponseEntity<>(null, HttpStatus.NO_CONTENT);
} else {
return new ResponseEntity<>(videoList, HttpStatus.OK);
}
}
📌 DB에서 favorite 테이블의 v_id 컬럼을 video 테이블의 v_id(PK)를 FK로 참조한다. 따라서 DB에선 우리 회원이 아닌 사람이 좋아요 기능을 실행할 순 없다. (favorite 테이블에 우리 회원이 아닌 사용자의 아이디로는 INSERT가 안 된다는 것)
서버에서 이를 if-else로 처리하여 문제를 해결하였다.