게시판 - 글 상세 조회 기능 구현 (23.08.22)

·2023년 8월 22일
0

Spring

목록 보기
19/36
post-thumbnail

🌷 게시글 상세 조회


이번 포스팅에서는 게시글 내용을 상세 조회하는 기능을 구현해 볼 것이다.
더불어 댓글 목록 조회, 이미지 목록 조회, 좋아요 기능 또한 함께 구현해 보자. 😉


👀 코드로 살펴보기

🌼 Oracle DBMS

🌱 SQL문 작성

-- 게시글 상세 조회
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 = 1
AND BOARD_NO = 2000;

SELECT * FROM BOARD_LIKE;

SELECT * FROM BOARD ORDER BY 1 DESC;


-- 게시글 좋아요 샘플 데이터 삽입
INSERT INTO BOARD_LIKE VALUES(2000, 1);
INSERT INTO BOARD_LIKE VALUES(2000, 2);

COMMIT;


-- 특정 게시글의 좋아요 개수 카운트
SELECT COUNT(*)
FROM BOARD_LIKE L
WHERE L.BOARD_NO = 2000;
      
      
-- 특정 게시글에 대한 이미지 조회(IMG_ORDER 오름차순)
SELECT * FROM BOARD_IMG
WHERE BOARD_NO = 2000
ORDER BY IMG_ORDER;


-- BOARD_IMG 테이블 샘플 데이터 삽입
INSERT INTO BOARD_IMG
VALUES(SEQ_IMG_NO.NEXTVAL,
    '/resources/images/board/',
    '20230821141913_00002.png',
    'bear2.png',
    1, 2000);
    
INSERT INTO BOARD_IMG
VALUES(SEQ_IMG_NO.NEXTVAL,
    '/resources/images/board/',
    '20230821141913_00003.jpg',
    'bear3.jpg',
    2, 2000);

COMMIT;


-- 특정 게시글에 대한 댓글 목록 조회(바뀔 예정)
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 = 2000
ORDER BY COMMENT_NO
;


-- 회원 프로필 이미지 변경
UPDATE MEMBER SET
PROFILE_IMG = '/resources/images/member/nnn.jpg'
WHERE MEMBER_NO = 1;

COMMIT;


-- 좋아요 여부 확인
SELECT COUNT(*) FROM BOARD_LIKE
WHERE BOARD_NO = 2000 -- 게시글 번호
AND MEMBER_NO = 1 -- 로그인한 회원 번호
;

🌼 VS Code

🌱 boardDetail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"  %>

<c:forEach items="${boardTypeList}" var="boardType">
    <c:if test="${boardType.BOARD_CODE == boardCode}" >
        <c:set var="boardName" value="${boardType.BOARD_NAME}"/>
    </c:if>
</c:forEach>

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>${boardName}</title>

    <link rel="stylesheet" href="/resources/css/board/boardDetail-style.css">
    <link rel="stylesheet" href="/resources/css/board/comment-style.css">

</head>
<body>
    <main>
        <jsp:include page="/WEB-INF/views/common/header.jsp"/>

        <section class="board-detail">  
            <!-- 제목 -->
            <h1 class="board-title">${board.boardTitle}  <span> - ${boardName}</span>    </h1>

            <!-- 프로필 + 닉네임 + 작성일 + 조회수 -->
            <div class="board-header">
                <div class="board-writer">

                    <!-- 프로필 이미지 -->
                    <c:choose>
                        <c:when test="${empty board.profileImage}">
                            <%-- 프로필 이미지가 없을 경우 기본 이미지 출력 --%>
                            <img src="/resources/images/user.png">
                        </c:when>

                        <c:otherwise>
                            <%-- 프로필 이미지가 있을 경우 출력 --%>
                            <img src="${board.profileImage}">
                        </c:otherwise>
                    </c:choose>

                    <span>${board.memberNickname}</span>

                    
                    <!-- 좋아요 하트 -->
                    <span class="like-area">

                        <!-- 좋아요를 누른 적이 없거나, 로그인 X -->
                        <c:if test="${empty likeCheck}">
                            <i class="fa-regular fa-heart" id="boardLike"></i>
                        </c:if>
                        
                        <!-- 좋아요를 누른 적이 있을 때 -->
                        <c:if test="${!empty likeCheck}">
                            <i class="fa-solid fa-heart" id="boardLike"></i>
                        </c:if>

                        <span>${board.likeCount}</span>
                    </span>

                </div>

                <div class="board-info">
                    <p> <span>작성일</span> ${board.boardCreateDate} </p>     

                    <!-- 수정한 게시글인 경우 -->
                    <c:if test="${!empty board.boardUpdateDate}">
                        <p> <span>마지막 수정일</span> ${board.boardUpdateDate} </p>   
                    </c:if>

                    <p> <span>조회수</span> ${board.readCount} </p>                    
                </div>
            </div>

            <!-- 이미지가 있을 경우 -->
            <c:if test="${!empty board.imageList}">
                <!-- 썸네일 영역(썸네일이 있을 경우) -->

                <%-- 
                    - 이미지는 IMG_ORDER 오름차순으로 정렬된다.
                    - IMG_ORDER의 값이 0인 이미지가 썸네일이다.
                    -> imageList에 썸네일이 있다면
                        조회되었을 때 IMG_ORDER가 0인 이미지가
                        imageList[0]에 저장되었을 것이다.
                 --%>

                <c:if test="${board.imageList[0].imageOrder == 0}">
                    <h5>썸네일</h5>
                    <div class="img-box">
                        <div class="boardImg thumbnail">
                            <img src="${board.imageList[0].imagePath}${board.imageList[0].imageReName}">
                            <a href="${board.imageList[0].imagePath}${board.imageList[0].imageReName}"
                                download="${board.imageList[0].imageOriginal}">다운로드</a>         
                        </div>
                    </div>
                </c:if>

            </c:if>

            <%-- 썸네일을 제외하고 나머지 이미지의 시작 인덱스 번호 --%>
            <%-- 썸네일이 있을 경우 --%>
            <c:if test="${board.imageList[0].imageOrder == 0}">
                <c:set var="start" value="1"/>
            </c:if>

            <%-- 썸네일이 없을 경우 --%>
            <c:if test="${board.imageList[0].imageOrder == 0}">
                <c:set var="start" value="0"/>
            </c:if>

            <%-- ${fn:length(board.imageList)} : imageList의 길이 --%>

            <!-- 일반 이미지가 있는 경우 -->
            <c:if test="${fn:length(board.imageList) > start}">
                <!-- 업로드 이미지 영역 -->
                <h5>업로드 이미지</h5>
                <div class="img-box">
                    
                    <c:forEach var="i" begin="${start}" end="${fn:length(board.imageList)-1}">
                        <div class="boardImg">
                            <c:set var="path"
                                value="${board.imageList[i].imagePath}${board.imageList[i].imageReName}"/>

                            <img src="${path}">
                            <a href="${path}"
                                download="${board.imageList[i].imageOriginal}">다운로드</a>                
                        </div>
                    </c:forEach>

                </div>
            </c:if>

            <!-- 내용 -->
            <div class="board-content">${board.boardContent}</div>


            <!-- 버튼 영역-->
            <div class="board-btn-area">

                <!-- 로그인한 회원과 게시글 작성자 번호가 같은 경우-->
                <c:if test="${loginMember.memberNo == board.memberNo}">
                    <button id="updateBtn">수정</button>
                    <button id="deleteBtn">삭제</button>
                </c:if>

                <button id="goToListBtn">목록으로</button>
            </div>


        </section>

        <!-- 댓글 include-->
        <jsp:include page="comment.jsp"/>
    </main>

    <jsp:include page="/WEB-INF/views/common/footer.jsp"/>

    <%-- 로그인한 회원 번호 얻어오기 방법 3가지 --%>

    <script>
        // JSP에서 작성 가능한 언어/라이브러리
        // -> html, css, js, java, EL, JSTL

        // JSP 해석 우선 순위 : Java/EL/JSTL > HTML, CSS, JS

        // 게시글 번호 전역 변수로 선언
        const boardNo = "${board.boardNo}";

        // 로그인한 회원 번호를 전역 변수로 선언
        // -> EL 구문을 '', "" 문자열로 감싸기
        const loginMemberNo = "${loginMember.memberNo}";

        console.log(boardNo);
        console.log(loginMemberNo);
    </script>

    <%-- boardDetail.js 연결 --%>
    <script src="/resources/js/board/boardDetail.js"></script>

</body>
</html>

🌱 comment.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>

<div id="commentArea">
    <!-- 댓글 목록 -->
    <div class="comment-list-area">
        
        <ul id="commentList">

            <c:forEach items="${board.commentList}" var="comment">
                <!-- 부모 댓글 -->
                <li class="comment-row">
                    <p class="comment-writer">

                        <!-- 프로필 이미지 -->
                        <c:if test="${empty comment.profileImage}">
                            <%-- 없을 경우 기본 이미지 --%>
                            <img src="/resources/images/user.png">
                        </c:if>

                        <c:if test="${!empty comment.profileImage}">
                            <%-- 있을 경우 기본 이미지 --%>
                            <img src="${comment.profileImage}">
                        </c:if>

                        <!-- 닉네임 -->
                        <span>${comment.memberNickname}</span>
                        
                        <!-- 작성일 -->
                        <span class="comment-date">${comment.commentCreateDate}</span>
                    </p>
                    
                    <!-- 댓글 내용 -->
                    <p class="comment-content">${comment.commentContent}</p>


                    <!-- 버튼 영역 -->
                    <div class="comment-btn-area">
                        <button>답글</button>   
                            
                        <c:if test="${loginMember.memberNo == comment.memberNo}">
                            <!-- 로그인 회원과 댓글 작성자가 같은 경우 -->  
                            <button>수정</button>     
                            <button>삭제</button>
                        </c:if>
                    </div>
                </li>
            </c:forEach>

            <!-- 자식 댓글 -->
            <li class="comment-row child-comment">
                <p class="comment-writer">

                    <!-- 프로필 이미지 -->
                    <img src="/resources/images/user.png">

                    <!-- 닉네임 -->
                    <span>닉네임</span>
                    
                    <!-- 작성일 -->
                    <span class="comment-date">2023년 05월 9일 12시 20분 10초</span>
                </p>
                
                <!-- 댓글 내용 -->
                <p class="comment-content">자식 댓글 입니다</p>


                <!-- 버튼 영역 -->
                <div class="comment-btn-area">
                    <button>답글</button>   
                        
                </div>
            </li>

        </ul>
    </div>
    

    <!-- 댓글 작성 부분 -->
    <div class="comment-write-area">
        <textarea id="commentContent"></textarea>
        <button id="addComment">
            댓글<br>
            등록
        </button>
 
    </div>

</div>

🌱 boardDetail-style.css

/* 상세조회 전체 영역 */
.board-detail{
    width: 1000px;
    min-height: 700px;
    border:  1px solid #ccc;
    margin: 50px auto;
    padding: 20px;
}


/* 게시글 제목 */
.board-title{
    margin : 0;
    padding: 20px 0;
    font-size: 2em;
    border-bottom : 3px solid #ccc;
}

.board-title > span{
    font-size: 16px;
    color: gray;
}


/* 게시글 헤더 */
.board-header{
    padding: 20px 0;
    border-bottom : 3px solid #ccc;
    display: flex;
    justify-content: space-between;
}

/* 작성자 영역 */
.board-writer{
    display: flex;
    align-items: center;
}

/* 프로필 */
.board-writer > img{
    width: 40px;
    height: 40px;
}

/* 닉네임 */
.board-writer > span{
    font-weight: bold;
    margin-left : 10px;
}

/* 게시글 정보 */
.board-info{
    width: 320px;
    font-size: 0.8em;
}

.board-info > p{
    margin: 0;
}

.board-info span{
    width: 120px;
    display: inline-block;
    font-weight: bold;
}

.board-detail h5{
    clear: both;
    margin: 10px 0;
}


/* 이미지를 감싸는 div */
.boardImg{
    width: 25%;
    height: 240px;
    float: left;
    text-align: center;
}

/* 이미지 */
.boardImg img{
    max-width: 90%;
    max-height: 90%;
}

/* 썸네일만 이미지 크게 */
.thumbnail{
    width: 300px;   
    height: 300px;
}

/* 다운로드 a태그 */
.boardImg a{
    display: block;
    text-align: center;
    color: black;
    text-decoration: none;
    font-size: 12px;
    margin-top: 5px;
}

/* 내용 */
.board-content{
    clear: both;
    padding: 30px 0;
    margin: 30px 0;
    border-top : 3px solid #ccc;
    border-bottom : 3px solid #ccc;

    font-size: 18px;

    white-space: pre-wrap;
}

/* 버튼 영역 */
.board-btn-area{
    text-align: right;
}

/* 버튼 */
.board-btn-area button{
    width: 80px;
    height: 30px;

    font-weight: bold;
    border: 0;
    background-color: #455ba8;
    color : white;

    cursor: pointer;
}

.board-btn-area button:hover{
    background-color: white;
    color : #455ba8;
    border: 2px solid #455ba8;
}


/* 좋아요 */
.like-area{
    margin-left: 30px;
}

#boardLike{
    font-size: 1.5em;
    color: red;
    cursor: pointer;
}

🌱 comment-style.css

/*댓글*/
.comment-write-area {
    display: flex;
    min-height: 85px;
    justify-content: center;
    
    margin: 30px 0;
 }
 
 .comment-write-area > textarea{
    flex-basis: 75%;
     margin-right: 10px;
    resize: none;
 }
 
 .comment-write-area > button{
    flex-basis: 7%;
     height: 85px;
 
    font-weight: bold;
     border: 0;
     background-color: #455ba8;
     color: white;
     cursor: pointer;
 }
 
 #commentList{
    padding: 0;
    list-style: none;
 }
 
 .comment-writer {
    display: flex;
    align-items: center;
 }
 
 .comment-writer > img{
    width: 40px;
     height: 40px
 }
 
 .comment-writer > span{
     font-weight: bold;
     margin-left : 10px;
 }
 
 .comment-date{
    font-size: 0.8em;
    color: #aaa;
 }
 
 
 .comment-btn-area { 
    display: flex;
    justify-content: flex-end;
 }
 
 /* 버튼 */
 .comment-btn-area button{
     width: 50px;
     height: 30px;
    margin-left: 10px;
 
     font-weight: bold;
     border: 0;
     background-color: #455ba8;
     color : white;
 
     cursor: pointer;
 }
 
 .comment-btn-area button:hover{
     background-color: white;
     color : #455ba8;
     border: 2px solid #455ba8;
 }
 
 .update-textarea{
    width: 100%;
     height: 90px;
     resize: none;
 }
 
 .comment-row{
    border-top : 1px solid #ccc;
    padding : 15px 0;
 }
 
 
 .child-comment{
    padding-left : 50px;
    position: relative;
 }
 
 /* 
 .child-comment:before {
    content: "\f0a4";
    font-family: "FontAwesome";
    
    position : absolute;
    left : 0;
    top : 35px;
 } */
 
 
 /* 답글 */
 .commentInsertContent{
    width: 100%;
     height: 90px;
     resize: none;
     margin-top : 20px;
 }

🌼 Spring

🌱 BoardController.java

...
	// @PathVariable : 주소에 지정된 부분을 변수에 저장
	//					+ request scope 세팅
	
	// 게시글 상세 조회
	@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");
			}
			
			// ------------------------------------------------
			
			path = "board/boardDetail"; // forward 할 jsp 경로
			model.addAttribute("board", board);
			
		} else { // 조회 결과가 없을 경우
			path = "redirect:/board/" + boardCode; // 게시판 첫 페이지로 리다이렉트
			
			ra.addFlashAttribute("message", "해당 게시글이 존재하지 않습니다.");
		}
		
		return path;
	}
}

🌱 BoardServiceImpl.java

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

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

🌱 BoardService.java

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

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

🌱 BoardDAO.java

...
	/** 게시글 상세 조회
	 * @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);
	}

🌱 board-mapper.xml

💭 Collection 태그란?

select로 조회된 결과를 컬렉션(List)에 담아 지정된 필드에 세팅해 주는 태그

🔎 속성

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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="boardMapper">

	<!-- Board DTO에 대한 resultMap -->
	<resultMap type="Board" id="board_rm">

		<id property="boardNo" column="BOARD_NO" />

		<result property="boardTitle" column="BOARD_TITLE" />
		<result property="boardContent" column="BOARD_CONTENT" />
		<result property="boardCreateDate" column="B_CREATE_DATE" />
		<result property="boardUpdateDate" column="B_UPDATE_DATE" />
		<result property="readCount" column="READ_COUNT" />
		<result property="commentCount" column="COMMENT_COUNT" />
		<result property="likeCount" column="LIKE_COUNT" />
		<result property="memberNickname" column="MEMBER_NICKNAME" />

		<result property="memberNo" column="MEMBER_NO" />
		<result property="profileImage" column="PROFILE_IMG" />

		<result property="thumbnail" column="THUMBNAIL" />
		
		<!-- collection 태그
			 select로 조회된 결과를 컬렉션(List)에 담아
			 지정된 필드에 세팅
		 -->
		
		<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>
		
	</resultMap>
	
	<!-- boardImage resultMap -->
	<resultMap type="BoardImage" id="boardImage_rm">
		<id property="imageNo" column="IMG_NO"/>
		
		<result property="imagePath" column="IMG_PATH"/>
		<result property="imageReName" column="IMG_RENAME"/>
		<result property="imageOriginal" column="IMG_ORIGINAL"/>
		<result property="imageOrder" column="IMG_ORDER"/>
		<result property="boardNo" column="BOARD_NO"/>
	</resultMap>
	
	<!-- Comment resultMap -->
	<resultMap type="Comment" id="comment_rm">
		<id property="commentNo" column="COMMENT_NO" />
		
		<result property="commentContent" column="COMMENT_CONTENT" />
		<result property="commentCreateDate" column="C_CREATE_DATE" />
		<result property="boardNo" column="BOARD_NO" />
		<result property="memberNo" column="MEMBER_NO" />
		<result property="commentDeleteFlag" column="COMMENT_DEL_FL" />
		<result property="parentNo" column="PARENT_NO" />
		<result property="memberNickname" column="MEMBER_NICKNAME" />
		<result property="profileImage" column="PROFILE_IMG" />
	</resultMap>
    
...

	<!-- 게시글 상세 조회 -->
	<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>
    

💻 구현 화면

profile
풀스택 개발자 기록집 📁

0개의 댓글