@PathVariable
// URL 경로에 있는 값을 매개변수로 이용할 수 있게 하는 어노테이션
// + request scope에 세팅을 해준다
collection 태그
select로 조회된 결과를 컬렉션(List)에 담아 지정된 필드에 세팅해준다.
예를 들면 mapper에 resultMap태그 안에서 이렇게 작성할 수 있다
<collection property="imageList"
select="selectImageList"
column="BOARD_NO"
javaType="java.util.ArrayList"
ofType="BoardImage">
</collection>
BoardDTO의 필드는 이렇게 되어 있다 DTO를 보고 작성해주면 된다!!!
private List<BoardImage> imageList;
// 게시글 상세 조회
@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;
}
/** 게시글 상세 조회
* @param map
* @return board
*/
Board selectBoard(Map<String, Object> map);
/** 좋아요 여부 확인 서비스
* @param map
* @return result
*/
int boardLikeCheck(Map<String, Object> map);
// 게시글 상세 조회 서비스
@Override
public Board selectBoard(Map<String, Object> map) {
return dao.selectBoard(map);
}
// 좋아요 여부 확인 서비스
@Override
public int boardLikeCheck(Map<String, Object> map) {
return dao.boardLikeCheck(map);
}
/** 게시글 상세 조회
* @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>
여기까지 코드를 적은 후 게시판에 들어가서 확인해보면
로그인하고 내가 좋아요 한 게시물에 들어가면 이렇게 귀욥게 나온다 ㅎㅎ