SSAFIT | 3일차. 기본기능 수정 및 통합

호떡·2022년 11월 16일
0

💡 깃에 강지수, 이지우 부분 백만 올림


백엔드 - 강지수, 이지우 : 영상 조회 시 [category별 + range별 +검색어] 조합으로 검색할 수 있도록 수정
백엔드 - 최희수, 장유범 : 로그인 기능 구현 부분 수정함. JWT 이용하여 로그인 승인을 할 수 있도록 구현
프론트엔드 - 임영묵, 권오영, 남기정 : 로그인 기능 구현 부분 수정함. JWT 이용하여 로그인 승인할 수 있도록 구현
백+프론트 - 백끼리 구현한 부분 통합, 테스트도 모두 통과. 프론트와도 통합. 프론트+백 통합본은 테스트 진행하지 않음. 로그인 기능 아직 완성하지 못함

영상 검색 | videoList 컨트롤러 구현



📌 영상 검색 시 부위별로 카테고리를 나누고, 전체/ 제목/ 채널명을 기준으로 한 키워드로 검색할 수 있도록 구현하였다.
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로 처리하여 문제를 해결하였다.

0개의 댓글