Spring 게시글 상세 조회 + 좋아요 기능

밍드라이브·2023년 8월 22일
1

Spring

목록 보기
5/6
post-thumbnail

복습

@PathVariable
// URL 경로에 있는 값을 매개변수로 이용할 수 있게 하는 어노테이션
// + request scope에 세팅을 해준다

collection 태그

select로 조회된 결과를 컬렉션(List)에 담아 지정된 필드에 세팅해준다.

  • property : List를 담을 DTO의 필드명
  • select : 실행할 select의 id
  • column : 조회 결과 중 지정된 컬럼의 값을 파라미터로 전달
  • javaType : List(컬렉션)의 타입을 지정한다
  • ofType : List(컬렉션)의 제네릭 (타입 제한) 지정

예를 들면 mapper에 resultMap태그 안에서 이렇게 작성할 수 있다

	<collection property="imageList"
				select="selectImageList"
				column="BOARD_NO"
				javaType="java.util.ArrayList"
				ofType="BoardImage">
	</collection>	

BoardDTO의 필드는 이렇게 되어 있다 DTO를 보고 작성해주면 된다!!!

private List<BoardImage> imageList;

- Controller

	// 게시글 상세 조회
	@GetMapping("/{boardCode}/{boardNo}")
	public String boardDetail(@PathVariable("boardCode") int boardCode
			                 ,@PathVariable("boardNo") int boardNo,
							  Model model // 데이터 전달용 객체
						     ,RedirectAttributes ra // 리다이렉트 시 데이터 전달용 객체
						     ,@SessionAttribute(value="loginMember", required=false) Member loginMember) {
							// 세션에서 loginMember를 얻어오는데 없으면 null, 있으면 회원 정보 저장

		Map<String, Object> map = new HashMap<String, Object>();
		map.put("boardCode", boardCode);
		map.put("boardNo", boardNo);

		// 게시글 상세 조회 서비스 호출
		Board board = service.selectBoard(map);
		
		String path = null;
		
		if(board != null){ // 조회 결과가 있을 경우
			
			// ------------------------------------------------
			// 현재 로그인 상태인 경우
			// 로그인한 회원이 해당 게시글에 좋아요를 눌렀는지 확인
			// ------------------------------------------------
			if(loginMember != null) { // 로그인 상태인 경우
            
				// 회원번호를 map에 추가
				// map(boardCode, boardNo, memberNo)
				map.put("memberNo", loginMember.getMemberNo());
				
				// 좋아요 여부 확인 서비스 호출
				int result = service.boardLikeCheck(map);
				
				// 누른적이 있을 경우
				if(result > 0) model.addAttribute("likeCheck", "on");	
			}
			
			// forward할 jsp 경로
			path = "board/boardDetail";
			model.addAttribute("board", board);
			
		}else { // 조회 결과가 없을 경우
			
			// 게시판 첫 페이지로 리다이렉트
			path = "redirect:/board/" + boardCode;
			
			ra.addFlashAttribute("message", "해당 게시글이 존재하지 않습니다.");
			
		}
		
		return path;
	}

- BoardService interface

	/** 게시글 상세 조회
	 * @param map
	 * @return board 
	 */
	Board selectBoard(Map<String, Object> map);

	/** 좋아요 여부 확인 서비스
	 * @param map
	 * @return result
	 */
	int boardLikeCheck(Map<String, Object> map);

- BoardServiceImpl

	// 게시글 상세 조회 서비스
	@Override
	public Board selectBoard(Map<String, Object> map) {
				
		return dao.selectBoard(map);
		
	}

	// 좋아요 여부 확인 서비스
	@Override
	public int boardLikeCheck(Map<String, Object> map) {
		
		return dao.boardLikeCheck(map);
	}

BoardDAO

	/** 게시글 상세 조회 
	 * @param map
	 * @return board 
	 */
	public Board selectBoard(Map<String, Object> map) {
		
		
		return sqlSession.selectOne("boardMapper.selectBoard", map);
	}

	/** 좋아요 여부 확인
	 * @param map
	 * @return result
	 */
	public int boardLikeCheck(Map<String, Object> map) {
		
		return sqlSession.selectOne("boardMapper.boardLikeCheck", map);
	}
resultMap안에 ↓ 이렇게 컬렉션 추가해줬다 (자세한 내용은 맨위에 있음!!)
<collection property="imageList"
			select="selectImageList"
			column="BOARD_NO"
			javaType="java.util.ArrayList"
			ofType="BoardImage">
</collection>

<collection property="commentList"
			select="selectCommentList"
			column="BOARD_NO"
			javaType="java.util.ArrayList"
			ofType="Comment">
</collection>
        
<!-- 게시글 상세 조회  -->
	<select id="selectBoard" resultMap="board_rm">
		SELECT BOARD_NO, BOARD_TITLE,
		BOARD_CONTENT, BOARD_CODE,
		READ_COUNT, MEMBER_NICKNAME, MEMBER_NO,
		PROFILE_IMG,
		TO_CHAR(B_CREATE_DATE, 'YYYY "년" MM "월" DD"일" HH24:MI:SS')
		B_CREATE_DATE,
		TO_CHAR(B_UPDATE_DATE, 'YYYY "년" MM "월" DD"일"
		HH24:MI:SS')
		B_UPDATE_DATE,
		(SELECT COUNT(*)
		FROM BOARD_LIKE L
		WHERE L.BOARD_NO = B.BOARD_NO) LIKE_COUNT
		FROM BOARD B
		JOIN MEMBER
		USING(MEMBER_NO)
		WHERE BOARD_DEL_FL = 'N'
		AND BOARD_CODE = #{boardCode}
		AND BOARD_NO = #{boardNo}
	</select>
	
	<!-- 특정 게시글 이미지 조회 -->
	<select id="selectImageList" resultMap="boardImage_rm">
		SELECT * FROM BOARD_IMG
		WHERE BOARD_NO = #{boardNo}
		ORDER BY IMG_ORDER	
	</select>
	
	<!-- 특정 게시글 댓글 조회(바뀔 예정) -->
	<select id="selectCommentList" resultMap="comment_rm">
		SELECT COMMENT_NO, COMMENT_CONTENT,
			    TO_CHAR(C_CREATE_DATE, 'YYYY"년" MM"월" DD"일" HH24"시" MI"분" SS"초"') C_CREATE_DATE,
			    BOARD_NO, MEMBER_NO, MEMBER_NICKNAME, PROFILE_IMG, PARENT_NO, COMMENT_DEL_FL
		FROM "COMMENT"
		JOIN MEMBER USING(MEMBER_NO)
		WHERE BOARD_NO = #{boardNo}
		ORDER BY COMMENT_NO
	
	</select>
	
	<select id="boardLikeCheck" resultType="_int" >
		SELECT COUNT(*) FROM BOARD_LIKE
		WHERE BOARD_NO = #{boardNo}
		AND MEMBER_NO = #{memberNo}
	</select>

여기까지 코드를 적은 후 게시판에 들어가서 확인해보면

로그인 X

로그인 O

로그인하고 내가 좋아요 한 게시물에 들어가면 이렇게 귀욥게 나온다 ㅎㅎ

profile
민주입니다

0개의 댓글