컬럼 추가

alter table [테이블명] add [컬럼명] [타입] [옵션]; 

ex) alter table [테이블명] add [컬럼명] varchar(100) not null default '0'; 

 

컬럼 삭제

alter table [테이블명] drop [컬럼명];

 

컬럼명 변경 및 타입 변경

alter table [테이블명] change [컬럼명] [변경할컬럼명] varchar(12);

 

컬럼 타입 수정

alter table [테이블명] modify [컬럼명] varchar(14);

 

테이블명 수정

alter table [테이블명] rename [변경할테이블명];

 

테이블 삭제

drop table [테이블명];

 

'DB' 카테고리의 다른 글

DB 시퀀스 없을 시  (0) 2021.05.22
MS-SQL 기간 조회 속도  (0) 2021.05.22

저번장에서는 해당 게시물에 대한 조회수를 나타나게 하는 기능을 추가했습니다.

이번장은 해당 게시물에 있는 댓글을 게시판 목록의 제목옆에 댓글 수를 출력해보도록 하겠습니다.

 

select count(reply_number)
from reply
where board_number= 4;

 

해당 쿼리를 조회하면 4번 게시물에 달린 댓글의 수를 구할 수 있습니다.

이 댓글의 수를 board 테이블의 reply_count 컬럼에 저장 시켜야 합니다.

 

하지만 저희의 DB에는 reply_count 컬럼이 없기 때문에 추가하도록 하겠습니다.

 

alter table board add reply_count int DEFAULT '0';

 

컬럼을 추가했으니 BoardVO 에도 만들어줘야 하겠죠?

 

// BoardVO 추가 후 getter, setter 추가

private int reply_count;

 

댓글의 개수를 구한 후에 reply_count에 값을 저장시켜야 하는데요

서브쿼리를 이용하여 해당 글 번호의 댓글 수를 구한 후

업데이트 시키겠습니다.

 

일단 DB에서 테스트 해볼까요?

 

 

정상적으로 서브쿼리로 조회한 결과를 board 테이블에 reply_count로 업데이트 되었습니다.

 

이제 boardMapper.xml에 추가하도록 하겠습니다.

 

1. boardMapper.xml 추가

 

<update id="updateReplyCount" parameterType="int">
	update board b
	set b.reply_count = (select count(reply_number) from reply where board_number = #{board_number})
	where b.board_number = #{board_number}
</update>

 

2. BoardDAO 추가

 

// BoardDAO.java

public void updateReplyCount(int board_number) throws Exception;

 

// BoardDAOImpl.java

private static String UPDATEREPLYCOUNT = NS + ".updateReplyCount";

@Override
public void updateReplyCount(int board_number) throws Exception {
	session.update(UPDATEREPLYCOUNT, board_number);
}

 

 

3. BoardService 추가

 

// BoardService.java

public void updateReplyCount(int board_number) throws Exception;

 

// BoardServiceImpl.java

@Override
public void updateReplyCount(int board_number) throws Exception {
	boardDAO.updateReplyCount(board_number);
}

 

 

4. BoardController.java 추가

 

저희는 사용자가 게시물 상세보기에서 댓글을 달기 때문에

댓글과 동시에 업데이트 쿼리로 board 테이블에 있는 reply_count에 값을 업데이트 시켜줄 것이기 때문에

 

readReply 메서드에 다음코드를 추가하겠습니다.

 

@RequestMapping(value = "/readView", method = RequestMethod.GET)
public String readReply(BoardVO board, @RequestParam("board_number") Integer board_number, @ModelAttribute("cri") Criteria cri, Model model) throws Exception {
	logger.info("read");
		
	service.viewCount(board_number);
    
	service.updateReplyCount(board_number);   // 게시물에 들어가면 댓글 수 업데이트
    
	model.addAttribute("BoardVO", service.read(board.getBoard_number()));
	model.addAttribute("cri", cri);
		
	List<ReplyVO> replyList = replyService.readReply(board.getBoard_number());
	model.addAttribute("replyList", replyList);
		
	return "board/readView";
}

 

 

5. listPage.jsp 작성

 

<!-- listPage.jsp -->

<div class="container">
		<table class="table table-bordered">
		
			<tr> <!-- 한줄 -->
				<th>번호</th> <!-- 첫번째 칸 -->
				<th>제목</th> <!-- 두번째 칸 -->
				<th>작성자</th> <!-- 세번째 칸 -->
				<th>작성일자</th> <!-- 네번째 칸 -->
				<th>조회수</th>
			</tr>
			
			<c:forEach items="${list}" var="boardVO">
				<tr>
					<td>${boardVO.board_number}</td>
					<td><a href="/board/readView${pageMaker.makeQuery(pageMaker.cri.page)}&board_number=${boardVO.board_number}">${boardVO.title }
						<c:if test="${boardVO.reply_count ne 0}">
							<small><b>[&nbsp;<c:out value="${boardVO.reply_count}"/>&nbsp;]</b></small>
						</c:if>
					</a></td>
					<td>${boardVO.name}</td>
					<td><fmt:formatDate pattern="YYYY-MM-dd" value="${boardVO.create_date}"/></td>
					<td>${boardVO.view_count}</td>
				</tr>
			</c:forEach>
		</table>
	</div>

 

보시다시피 제목을 담당하고 있는 <td> 태그를 보시면

 

<c:if test="${boardVO.reply_count ne 0}">
	<small><b>[&nbsp;<c:out value="${boardVO.reply_count}"/>&nbsp;]</b></small>
</c:if>

 

"${boardVO.reply_count ne 0}" 이 보이실텐데요 

이 ne는 != (같지 않으면) 이라는 의미를 가지고 있기에

댓글의 개수가 0이 아니라면 제목 옆에 댓글의 개수를 적어주겠다!!

라는 의미라고 생각하시면 될것 같습니다.

 

확인해보겠습니다.

 

 

현재 887 게시물에는 댓글이 달려 있지 않습니다.

댓글을 달아 볼까요?

 

 

 

 

 

 

 

정상적으로 댓글의 갯수를 출력합니다!!!

저희가 처음 board 테이블을 생성 했을 때 view_count 컬럼도 있던거 기억하시나요?

 

CREATE TABLE board (
    board_number int NOT NULL AUTO_INCREMENT,
    title varchar(200) NOT NULL,
    contents text,
    name VARCHAR(30) NOT NULL,
    create_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    view_count int DEFAULT 0,
    PRIMARY KEY (board_number)
    );

 

이제 해당 게시물을 클릭했을 때 조회수가 1이 증가 하도록 해볼겁니다.

 

1. boardMapper.xml 추가

 

<!-- boardMapper.xml -->

<update id="viewCount" parameterType="int">
	update board
	set view_count = view_count+1
	where board_number = #{board_number}
</update>

 

boardMapper.xml 에 조회수를 증가시키는 쿼리를 작성했는데요

parameterType(조회결과)을 int로 설정해줍니다.

그러면 사용자가 해당 게시물을 클릭할 때 마다 위의 쿼리를 통해 update하여 조회수를 1씩 증가합니다.

 

 

2. BoardDAO 작성

 

// BoardDAO.java

public int viewCount(int board_number) throws Exception;

 

// BoardDAOImpl.java

private static String VIEWCOUNT = NS + ".viewCount";

@Override
public int viewCount(int board_number) throws Exception {
	return session.update(VIEWCOUNT, board_number);
}

 

boardMapper에 있는 쿼리를 사용할 것이기 때문에 

VUEWCOUNT 변수에 BoardMapper + ".viewCount";하여 

매퍼에 접근할 수 있도록 합니다.

 

3. BoardService 작성

 

// BoardService.java

public int viewCount(int board_number) throws Exception;

 

// BoardService.java

@Override
public int viewCount(int board_number) throws Exception {
	return boardDAO.viewCount(board_number);
}

 

 

4. BoardController 작성

 

해당 쿼리는 해당 게시물을 클릭하면 조회수를 증가시킬것이기 때문에 

readReply메서드(상세보기)에 해당 코드를 추가합니다.

 

@RequestMapping(value = "/readView", method = RequestMethod.GET)
public String readReply(BoardVO board, @RequestParam("board_number") Integer board_number, @ModelAttribute("cri") Criteria cri, Model model) throws Exception {
	logger.info("read");
		
	service.viewCount(board_number); // 조회수 증가
    
	model.addAttribute("BoardVO", service.read(board.getBoard_number()));
	model.addAttribute("cri", cri);
		
	List<ReplyVO> replyList = replyService.readReply(board.getBoard_number());
	model.addAttribute("replyList", replyList);
		
	return "board/readView";
}

 

조회수를 증가시키려면 board_number가 필요하기 때문에

readReply 파라미터에 @RequestParam("board_number") Integer board_number 를 추가하였습니다.

 

5. listPage.jsp 수정

 

<c:forEach items="${list}" var="boardVO">
	<tr>
		<td>${boardVO.board_number}</td>
		<td><a href="/board/readView${pageMaker.makeQuery(pageMaker.cri.page)}&board_number=${boardVO.board_number}">${boardVO.title }</a></td>
		<td>${boardVO.name}</td>
		<td><fmt:formatDate pattern="YYYY-MM-dd" value="${boardVO.create_date}"/></td>
		<td>${boardVO.view_count}</td>
	</tr>
</c:forEach>

 

BoardController.java의 listPage 메서드에서

model.addAttribute("list", boards);

 

다음과 같이 BoardVO를 list에 담아서 jsp로 보냈기 때문에 

위의 listPage.jsp에서 "${list}"로 받고 boardVO 변수로 사용하겠다 라고 선언했기에

boardVO.view_count로 조회수를 출력할 수 있습니다.

 

확인해볼까요??

 

 

891번의 조회수를 올려보겠습니다.

 

 

 

891번 게시물에 들어와서 목록 버튼을 눌러 게시판 목록 페이지로 가보겠습니다.

 

 

 

조회수가 증가했습니다!!!!

 

다음장에서는 게시판 목록 페이지의 제목부분에

해당 게시글의 댓글에 개수를 출력할 예정입니다.

+ Recent posts