view.jsp
하단에 댓글 html 코드 추가
<div>
<a href="/board/modify?bno=${view.bno}">게시물 수정</a> <a
href="/board/delete?bno=${view.bno}">게시물 삭제</a>
</div>
<!--댓글 시작 -->
<hr />
<ul>
<li>
<div>
<p>첫번째 댓글 작성자</p>
<p>첫번째 댓글</p>
</div>
</li>
<li>
<div>
<p>두번째 댓글 작성자</p>
<p>두번째 댓글</p>
</div>
</li>
<li>
<div>
<p>세번째 댓글 작성자</p>
<p>세번째 댓글</p>
</div>
</li>
</ul>
<div>
<p>
<label>댓글 작성자</label> <input type="text">
</p>
<p>
<textarea rows="5" cols="50"></textarea>
</p>
<p>
<button type="button">댓글 작성</button>
</p>
</div>
<!-- 댓글 끝 -->
MySQL에서 테이블 추가함
CREATE TABLE tbl_reply (
rno int not null auto_increment,
bno int not null,
writer varchar(30) not null,
content text not null,
regDate timestamp not null default now(),
PRIMARY KEY(rno, bno),
FOREIGN KEY(bno) REFERENCES tbl_board(bno)
);
select * from tbl_reply;
댓글은 게시글의 댓글이기 때문에 게시글 아이디도 포함되어있다.
rno 만들 때 마다 자동 생성되게 함 = auto_increment
bno (게시글 번호) 를 가져와야함
writer ( 글쓴이 )
regDate 작성일자는 default 값으로 자동생성
primary key는 rno, bno 같이 사용이 가능하다.
INSERT INTO tbl_reply(bno,writer,content,regDate)
VALUE(99,'댓 글 작 성 자', '댓 글 내 용', SYSDATE());
SELECT * FROM tbl_reply;
UPDATE문도 테스트
UPDATE tbl_reply
SET writer ='댓글 작성자 수정',
content ='댓글 내용 수정'
WHERE rno=1 AND bno=99;
SELECT * from tbl_reply;
ReplyVO 클래스 생성
sql insert문 복사해서 주석처리 하고 변수 생성하면 편리함
getter setter도 source로 생성하기
VO객체를 생성하면 hashMap 보다 알아보기가 쉬움 \ 빨리 사용하기에는 map이 편하긴 함
package com.board.dao;
import java.util.Date;
public class ReplyVO {
// CREATE TABLE tbl_reply (
// rno int not null auto_increment,
// bno int not null,
// writer varchar(30) not null,
// content text not null,
// regDate timestamp not null default now(),
// PRIMARY KEY(rno, bno),
// FOREIGN KEY(bno) REFERENCES tbl_board(bno)
// );
private int rno ;
private int bno;
private String writer;
private String content;
private Date regDate;
//getter setter
public int getRno() {
return rno;
}
public void setRno(int rno) {
this.rno = rno;
}
public int getBno() {
return bno;
}
public void setBno(int bno) {
this.bno = bno;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getRegDate() {
return regDate;
}
public void setRegDate(Date regDate) {
this.regDate = regDate;
}
}
mappers에 replyMapper 생성
namespace 변경 필요함
<!-- 댓글 목록 (게시글 번호) -->
<select id="replyList" parameterType="int"
resultType="com.board.domain.ReplyVO">
select
rno, bno, writer, content, regDate
from tbl_reply
where bno = #{bno}
</select>
<!-- 댓글 작성 -->
<insert id="replyWrite" parameterType="com.board.domain.ReplyVO">
insert into tbl_reply(bno, writer, content)
value(#{bno}, #{writer}, #{content})
</insert>
<!-- 댓글 수정 -->
<update id="replyModify"
parameterType="com.board.domain.ReplyVO">
update tbl_reply set
writer = #{writer},
content = #{content}
where rno = #{rno}
and bno = #{bno}
</update>
<!-- 댓글 삭제 -->
<delete id="replyDelete"
parameterType="com.board.domain.ReplyVO">
delete from tbl_reply
where rno = #{rno}
and bno = ${bno}
</delete>
댓글 조회는 게시물 번호(bno)만 이용하여 조회하되 결과는 ReplyVO의 형태로 반환되므로, 파라미터타입(parameterType)는 정수형(int)이며 리절트타입(resultType)은 ReplyVO임
댓글 작성/수정/삭제는 게시물 번호(bno)와 댓글 번호(rno)가 모두 필요하며, 추가적으로 작성자(writer), 댓글 내용(content), 작성 날짜(regDate)가 필요하며, 반환되는 데이터는 없으므로 파라미터타입은 ReplyVO, 리절트타입은 없습니다.
ReplyDAO 과 ReplyDAOImple 생성
DAO는 인터페이스
ReplyDAOImple
ReplyDAO 상속, Repository 추가
package com.board.dao;
import org.springframework.stereotype.Repository;
@Repository
public class ReplyDAOImple implements ReplyDAO{
}
ReplyDAO
package com.board.dao;
import java.util.List;
import com.board.domain.ReplyVO;
public interface ReplyDAO {
// 댓글 조회
public List<ReplyVO> list(int bno) throws Exception;
// 댓글 작성
public void write(ReplyVO vo) throws Exception;
// 댓글 수정
public void modify(ReplyVO vo) throws Exception;
// 댓글 삭제
public void delete(ReplyVO vo) throws Exception;
}
ReplyDAOImple
package com.board.dao;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.board.domain.ReplyVO;
@Repository
public class ReplyDAOImple implements ReplyDAO{
@Autowired
private SqlSessionTemplate sqlTemplate;
//댓글 목록
@Override
public List<ReplyVO> list(int bno) throws Exception {
return sqlTemplate.selectList("reply.replyList", bno);
}
//댓글 작성
@Override
public void write(ReplyVO vo) throws Exception {
sqlTemplate.insert("reply.replyWrite", vo);
}
//댓글 수정
@Override
public void modify(ReplyVO vo) throws Exception {
sqlTemplate.update("reply.replyModify", vo);
}
//댓글 삭제
@Override
public void delete(ReplyVO vo) throws Exception {
sqlTemplate.delete("reply.replyDelete", vo);
}
}
ReplyService 와 ReplyServiceImple 도 생성한다
ReplyService
package com.board.service;
import java.util.List;
import com.board.domain.ReplyVO;
public interface ReplyService {
// 댓글 조회
public List<ReplyVO> list(int bno) throws Exception;
// 댓글 작성
public void write(ReplyVO vo) throws Exception;
// 댓글 수정
public void modify(ReplyVO vo) throws Exception;
// 댓글 삭제
public void delete(ReplyVO vo) throws Exception;
}
ReplyServiceImple
@Service 추가 필요
autowired 필요
package com.board.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.board.dao.ReplyDAO;
import com.board.domain.ReplyVO;
@Service
public class ReplyServiceImple implements ReplyService{
@Autowired
private ReplyDAO replyDAO;
//댓글 조회
@Override
public List<ReplyVO> list(int bno) throws Exception {
return replyDAO.list(bno);
}
//댓글 작성
@Override
public void write(ReplyVO vo) throws Exception {
replyDAO.write(vo);
}
//댓글 수정
@Override
public void modify(ReplyVO vo) throws Exception {
replyDAO.modify(vo);
}
//댓글 삭제
@Override
public void delete(ReplyVO vo) throws Exception {
replyDAO.delete(vo);
}
}
ReplyController
package com.board.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.board.service.ReplyService;
@Controller//컨트롤러 선언
@RequestMapping("/reply")// 요청 주소 /reply 주소만 넣으면 해당 컨트롤러로 넘어옴
public class ReplyController {
@Autowired
private ReplyService replyService;
//댓글 조회
//댓글 작성
//댓글 수정
//댓글 삭제
}
사실 ReplyController 는 필요없음.
기껏 ReplyController를 만들어놓고, 왜 BoardController에 작업하냐면
아직까지는 ReplyController에서 다룰 필요가 없기 때문입니다.
지금은 단순하게,
따로 댓글만 사용하는 페이지를 만들게 아니고
게시물을 읽어오면서 댓글도 같이 읽어오는 방식으로 진행합니다.
BoardController -> getView(게시글 상세 조회) 에 댓글 조회 추가
// 게시물 상세 조회 , 조회수 증가 기능 추가
@GetMapping("/view")
public void getView(@RequestParam("bno") int bno, Model model) throws Exception{
BoardVO vo = boardService.view(bno);
model.addAttribute("view", vo);
//댓글 조회
List<ReplyVO> replyList = replyService.list(bno);
model.addAttribute("reply", replyList);
}
view.jsp - 댓글 시작 수정
<!--댓글 시작 -->
<hr />
<ul>
<!-- <li>
<div>
<p>첫번째 댓글 작성자</p>
<p>첫번째 댓글</p>
</div>
</li> -->
<c:forEach items="${reply}" var="reply">
<li>
<div>
<p>${reply.writer}/ ${reply.regDate }</p>
<p>${reply.content}</p>
</div>
</li>
</c:forEach>
</ul>
<div>
<p>
<label>댓글 작성자</label> <input type="text">
</p>
<p>
<textarea rows="5" cols="50"></textarea>
</p>
<p>
<button type="button">댓글 작성</button>
</p>
</div>
<!-- 댓글 끝 -->
'BACKEND > Spring' 카테고리의 다른 글
게시판 만들기 - 댓글 수정하기 (0) | 2023.10.25 |
---|---|
게시판 만들기 - 댓글 작성(write) (0) | 2023.10.25 |
게시판 만들기 - 검색 기능 (0) | 2023.10.24 |
게시판 만들기 - 페이징 기능 구현2 (0) | 2023.10.24 |
게시판 만들기 - 페이징 기능 구현 (1) | 2023.10.24 |