Spring - 게시판 상세조회

맑은 눈의 코드 👀·2023년 8월 22일
0

06_framework 이론

목록 보기
16/23
post-thumbnail

🎂게시글 상세 조회를 아래 순서로 만들어 보자!

1) DB데이터 삽입
2) boardController(@PathVariable/ map활용)
3) boardService 인터페이스/ boardServiceImpl
4) boardDAO
5) mybatis-config.xml에 별칭
5) boardMapper(collection태그)
6) boardList / boardDetail

  • 상세 게시글에서 로그인 했을 시 좋아요 여부 확인 !

🎁boad.model.dto

🎀BoardImage.java

	package edu.kh.project.board.model.dto;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class BoardImage {

	private int imageNo;
	private String imagePath;
	private String imageReName;
	private String imageOriginal;
	private int imageOrder;
	private int boardNo;
}

🎀Comment.java

package edu.kh.project.board.model.dto;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Setter
@Getter
@ToString
public class Comment {
	private int commentNo;
	private String commentContent;
	private String commentCreateDate;
	private int boardNo;
	private int memberNo;
	private String commentDeleteFlag;
	private int parentNo;
	private String memberNickname;
	private String profileImage;
}

🎁board.controller

🎀BoardController.java

@PathVariable : 주소에 지정된 부분을 변수에 저장 + request scope에 추가

package edu.kh.project.board.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttribute;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import edu.kh.project.board.model.dto.Board;
import edu.kh.project.board.model.service.BoardService;
import edu.kh.project.member.model.dto.Member;

@SessionAttributes({"loginMember"})
@RequestMapping("/board")
@Controller
public class BoardController {

	@Autowired
	private BoardService service;
	
	//게시글 목록 조회
	@GetMapping("/{boardCode}")
	public String selectBoardList(@PathVariable("boardCode") int boardCode
			, @RequestParam(value="cp", required = false, defaultValue = "1") int cp
			, Model model) {
		
		// boardCode 확인
		//System.out.println("boardCode: "+ boardCode);
		
		// 게시글을 목록 조회하는 service호출 
		Map<String, Object> map = service.selectBoardList(boardCode, cp);
		
		//조회 결과를 request scope에 세팅 후 forward
		model.addAttribute("map", map);
		
		return "board/boardList";
		
		
	}
	
	//@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");
			}
			
			//---------------------------------------------------
			
			// foward 할 jsp경로
			path = "board/boardDetail";
			model.addAttribute("board", board);
			
			
		}else { //조회 결과가 없을 경우
			path = "redirect:/board/"+ boardCode; //게시판 첫 페이지로 리다이렉트
			ra.addFlashAttribute("message", "해당 게시글이 존재하지 않습니다.");
		}
		
		return path;
	}
}

🎁board.model.service

🎀BoardService.java

package edu.kh.project.board.model.service;

import java.util.List;
import java.util.Map;

import edu.kh.project.board.model.dto.Board;

public interface BoardService {

	/** 게시판 종류 목록 조회
	 * @return boardTypeList
	 */
	List<Map<String, Object>> selectBoardTypeList();

	
	/** 게시글 목록 조회
	 * @param boardCode
	 * @param cp
	 * @return map
	 */
	Map<String, Object> selectBoardList(int boardCode, int cp);


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


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

🎀BoardServiceImpl.java

package edu.kh.project.board.model.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import edu.kh.project.board.model.dao.BoardDao;
import edu.kh.project.board.model.dto.Board;
import edu.kh.project.board.model.dto.Pagination;

@Service
public class BoardServiceImpl implements BoardService{
	
	@Autowired
	private BoardDao dao;
	
	//게시글 상세 조회
	@Override
	public Board selectBoard(Map<String, Object> map) {
		
		return dao.selectBoard(map);
	}
	
	// 좋아요 여부 확인
	@Override
	public int boardLikeCheck(Map<String, Object> map) {
		return dao.boardLikeCheck(map);
	}
}

🎁board.model.dao

🎀BoardDAO.java

package edu.kh.project.board.model.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.RowBounds;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import edu.kh.project.board.model.dto.Board;
import edu.kh.project.board.model.dto.Pagination;

/**
 * @author user1
 *
 */
@Repository
public class BoardDao {
	
	@Autowired
	private SqlSessionTemplate sqlSession;


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

}

🎁xml

🎀mybatis-config.xml

	<!-- 별칭 작성 부분 -->
	<!-- VO클래스의 패키지명 + 클래스명 작성하는 것이 불편하기 때문에 짧은 별칭 부여 -->
	<typeAliases>
		<typeAlias type="edu.kh.project.member.model.dto.Member" alias="Member" />
		<typeAlias type="edu.kh.project.board.model.dto.Board" alias="Board" />
		<typeAlias type="edu.kh.project.board.model.dto.Comment" alias="Comment" />
		<typeAlias type="edu.kh.project.board.model.dto.BoardImage" alias="BoardImage" />
	</typeAliases>

🎀board-mapper.xml

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

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

resultMap태그 안에 들어가 있어 resultMap태그가 수행되면서 자동으로 collection태그 안에 있는 select id의 select 구문이 수행된다.
<?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">

	<!--boardDTO에 대한 ReaultMap -->
	<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)에 담아
      		지정된 필드에 세팅
      		
      		property : List를 담을 DTO의 필드명
      		select   : 실행할 select의 id
      		column   : 조회 결과 중 지정된 컬럼의 값을 파라미터로 전달
      		javaType : List(컬렉션)의 타입 지정
			ofType   : 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="boardNo" column="BOARD_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"/>
	</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>
</mapper>

🎁VS Code

🎀boardList.jsp

@PathVariable
${boardCode} : @PathVariable로 request scope에 추가된 값

<a>href="/board/${boardCode}/${board.boardNo}?cp=${pagination.currentPage}">
			${board.boardTitle}</a>

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

<%-- map에 저장된 값을 각각 변수에 저장 --%>
<c:set var="pagination" value="${map.pagination}"/>
<c:set var="boardList" value="${map.boardList}"/>

<%-- <c:set var="boardName" value="${boardTypeList[boardCode-1].BOARD_NAME}"/> --%>
<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></title>

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

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

       
       <section class="board-list">

           <h1 class="board-name">${boardName}</h1>


           <div class="list-wrapper">
               <table class="list-table">
                   
                   <thead>
                       <tr>
                           <th>글번호</th>
                           <th>제목</th>
                           <th>작성자</th>
                           <th>작성일</th>
                           <th>조회수</th>
                           <th>좋아요</th>
                       </tr>
                   </thead>

                   <tbody>
                       <c:choose>
                          <c:when test="${empty boardList}">
                               <%-- 조회된 게시글 목록 비어있거나 null인 경우 --%>
                               
                               <!-- 게시글 목록 조회 결과가 비어있다면 -->
                               <tr>
                                   <th colspan="6">게시글이 존재하지 않습니다.</th>
                               </tr>
                          </c:when>
                       
                          <c:otherwise>

                           <c:forEach items="${boardList}" var="board">
                               <!-- 게시글 목록 조회 결과가 있다면-->
                               <tr>
                                   <td>${board.boardNo}</td>
                                   <td> 
                                       <%-- 썸네일이 있을 경우 --%>
                                       <c:if test="${!empty board.thumbnail}" >
                                           <img class="list-thumbnail" src="${board.thumbnail}">
                                       </c:if>



                                       <%-- ${boardCode} : @PathVariable로 request scope에 추가된 값 --%>
                                       <a href="/board/${boardCode}/${board.boardNo}?cp=${pagination.currentPage}">${board.boardTitle}</a>   
                                       [${board.commentCount}]                       
                                   </td>
                                   <td>${board.memberNickname}</td>
                                   <td>${board.boardCreateDate}</td>
                                   <td>${board.readCount}</td>
                                   <td>${board.likeCount}</td>
                               </tr>
                           </c:forEach>
                          </c:otherwise>
                       </c:choose>
                   </tbody>
               </table>
           </div>


           <div class="btn-area">

           <!-- 로그인 상태일 경우 글쓰기 버튼 노출 -->
               <button id="insertBtn">글쓰기</button>                     

           </div>


           <div class="pagination-area">


               <ul class="pagination">
               
                   <!-- 첫 페이지로 이동 -->
                   <li><a href="/board/${boardCode}?cp=1">&lt;&lt;</a></li>

                   <!-- 이전 목록 마지막 번호로 이동 -->
                   <li><a href="/board/${boardCode}?cp=${pagination.prevPage}">&lt;</a></li>

              
                   <!-- 특정 페이지로 이동 -->
                   <c:forEach var="i" begin="${pagination.startPage}"
                               end="${pagination.endPage}" step="1">
                       <c:choose>
                          <c:when test="${i== pagination.currentPage}">
                               <!-- 현재 보고있는 페이지 -->
                               <li><a class="current">${i}</a></li>
                          </c:when>
                       
                          <c:otherwise>
                               <!-- 현재 페이지를 제외한 나머지 -->
                               <li><a href="/board/${boardCode}?cp=${i}">${i}</a></li>
                          </c:otherwise>
                       </c:choose>
                   </c:forEach>
                   
                   <!-- 다음 목록 시작 번호로 이동 -->
                   <li><a href="/board/${boardCode}?cp=${pagination.nextPage}">&gt;</a></li>

                   <!-- 끝 페이지로 이동 -->
                   <li><a href="/board/${boardCode}?cp=${pagination.maxPage}">&gt;&gt;</a></li>

               </ul>
           </div>


        <!-- 검색창 -->
           <form action="#" method="get" id="boardSearch">

               <select name="key" id="searchKey">
                   <option value="t">제목</option>
                   <option value="c">내용</option>
                   <option value="tc">제목+내용</tion>
                   <option value="w">작성자</option>
               </select>

               <input type="text" name="query"  id="searchQuery" placeholder="검색어를 입력해주세요.">

               <button>검색</button>
           </form>

       </section>
   </main>
   
   
   <!-- 썸네일 클릭 시 모달창 출력 -->
   <div class="modal">
       <span id="modalClose">&times;</span>
       <img id="modalImage" src="/resources/images/user.png">
   </div>

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

</body>
</html>

🎀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">
                        <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"/>
</body>
</html>

🎁DB 데이터 삽입

--게시글 상세 조회
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= 1498;
        
        
SELECT * FROM BOARD_LIKE;
        
--게시글 좋아요 샘플데이터 삽입
INSERT INTO BOARD_LIKE VALUES(1498,1);
INSERT INTO BOARD_LIKE VALUES(1498,2);
INSERT INTO BOARD_LIKE VALUES(1498,3);

COMMIT;

-- 특정게시글에 "좋아요" 수 개수 카운트
SELECT COUNT(*) 
FROM BOARD_LIKE L
WHERE L.BOARD_NO = 1498;

--특정게시글에 대한 이미지 조회(IMG_ORDER 오름차순)
SELECT * FROM BOARD_IMG
WHERE BOARD_NO = 1498
ORDER BY IMG_ORDER;

INSERT INTO BOARD_IMG
VALUES(SEQ_IMG_NO.NEXTVAL
    , '/resources/images/board/'
    ,'20230821141913_00002.png'
    ,'빵빵이2'
    ,1,1498);
    
INSERT INTO BOARD_IMG
VALUES(SEQ_IMG_NO.NEXTVAL
    , '/resources/images/board/'
    ,'20230821141913_00003.png'
    ,'빵빵이3'
    ,2,1498);
    

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 = 1498
ORDER BY COMMENT_NO;

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

--좋아요 여부 확인
SELECT COUNT(*) FROM BOARD_LIKE
WHERE BOARD_NO =1498 --게시글번호
AND MEMBER_NO = 1--로그인한회원 번호
;
profile
나를 죽이지 못하는 오류는 내 코드를 더 강하게 만들지ㅋ

0개의 댓글