이전 까지 Board의 상세정보 보기 화면까지 만들었다.
글을 등록한 작성자가 굉장히 성의 없게 제목과 내용을 적어주었다. 악플을 좀 달아야겠다고 생각해서 만들어 보았다.
board_detail.jsp
만약 sessionScope.loginInfo 값이 빈 공간이 아니면 ( 즉, 로그인이 되있으면 이라는 뜻이다.)
댓글등록 버튼이 활성화되며,
버튼 클릭시 ${board.boardNum} 값을 boardNum이라는 이름으로 insertReply.re로 content도 함께 데이터를 보낸다.
ReplyController.java 서블릿
이곳에서 board_detail.jsp에서 전달한 boardNum과 content 받아와서 각각 맞는 자료형으로 저장한다.
이후 바로 mapper로 가자.
그 전에, 중요한거 하나 더 해줘야 한다.
sqlmap / configuration.xml
사용할 mapper를 항상 이곳에 등록을 해주어야한다. 이제는 reply-mapper.xml을 사용해야 하므로 resource를 저장한다.
reply-mapper.xml
이곳에서 resultMap은 select쿼리 할때만 사용하므로 지금은 하지 않고,
맨 위에 보이는 namespace를 replyMapper로 설정하고, insert 쿼리를 작성하자.
NVL은 (~~, 0 )에서 ~~의 NULL 값을 0으로 바꿔주세요. 이다
BOARD 테이블에서 BOARD_NUM의 최대값이 현재 없기 때문에 NULL인데, 이것을 0으로 바꾼 후, +1 하라는 뜻이다.
이후, BOARD_NUM의 값은 1이 되면서 0으로 초기화 하지 않고 다음번에는 +1을 더해 2, 3, 4 이런식으로 증가한다.
이후, 바로 mapper로 이동하자.
매개변수 및 리턴 타입 결정 방법(우선적으로 실행 시 쿼리를 작성)
매개변수 : 쿼리 실행 시 빈 값을 채울 용도
1. 쿼리에서 채워 줄 값이 없을 경우 : 매개변수 없음
2. 채워줄 값이 하나일 경우
2-1) 채워줄 값이 숫자인 경우 : 매개변수 int형 하나
2-2) 채워줄 값이 문자인 경우 : 매개변수 String형 하나
3. 채워줄 값이 여러개인 경우 : 매개변수는 DTO 객체.
리턴타입 : 쿼리 실행 결과를 어떻게 받아올지에 대한 정의
INSERT, UPDATE, DELETE 쿼리 실행 결과는
리턴타입을 int 혹은 void 사용하면됨.
SELECT 쿼리 결과의 리턴타입은 크게 두 가지로 나뉨.
조회결과 데이터가 무조건 한줄만 조회 : DTO 객체.
조회 결과 데이터가 0줄이상 가변적일 경우 : List<DTO> 객체.
ReplyService.java 인터페이스
이곳에서 insert로 만들었던 쿼리 메소드를 생성해주고, INSERT 쿼리 실행결과는 int 혹은 void이다.
여기서 쿼리문에서 채워줄 값이 여러개 였으니 DTO객체를 매개변수로 설정해야한다.
ReplyServiceImple.java 클래스
인터페이스에서 만들었던 insertReply메소드에 각 매개변수를 넣어주고, sqlSession까지 커밋해준다.
이후 다시 서블릿으로
ReplyController.java 서블릿
먼저, 댓글 세션 정보를 저장해야 하므로 새로운 HttpSession 객체를 이용해 session 값을 전달 받고,
loginInfo 값을 MemberDTO 객체의 loginInfo로 자료형 변환시켜주어 저장시킨다.
자료형 변환을 해주는 이유는 session이 object 자료형이라 그렇다.
ReplyDTO 객채를 생성한 후 세터를 이용해 각각 뿌려줄 데이터를 저장하고, loginInfo에 담긴 MemId도 넣어준다.
이후 쿼리문에서 생성했던 부분을 replyDTO에 넣어주며 reply라는 이름으로 boardDetail.bo에 전달한다.
하지만 조건이 있다. "?" 로 인해 받아온 boardNum의 값이 일치하는 boardNum를 가지고 간다.
BoardController.java 서블릿
이곳으로 돌아와 댓글 목록조회 코드를 짜줄 수 있는데, 아직 댓글을 쓰기만 하고 화면에 뿌려주지 못했다.
그래서 다시 쿼리로 가서 댓글 목록 조회를 하기 위한 쿼리를 만들어주어야한다.
reply-mapper.xml
아까 댓글 등록할 때 하지 않았던 리스트 등록을 만들어 보려고 한다.
select로 쿼리를 작성해야하므로 resultMap을 만들어주어야한다.
column에는 DB에 저장된 데이터 변수를 넣고, property에는 DTO클래스에 만들어 놓은 자바 변수를 넣자.
이렇게 만들어 지면 select 쿼리를 만들어주고, select의 resultMap의 값은 resultMap의 id 값과 동일하게 넣어준다.
댓글 번호, 내용, 작성자, 날짜를 조회할건데, 전체를 조회하지 않고 게시판 번호가 같은것만을 조회해준다.
이후 service패키지로 돌아가서 인터페이스를 만들자.
매개변수 및 리턴 타입 결정 방법(우선적으로 실행 시 쿼리를 작성)
매개변수 : 쿼리 실행 시 빈 값을 채울 용도
1. 쿼리에서 채워 줄 값이 없을 경우 : 매개변수 없음
2. 채워줄 값이 하나일 경우
2-1) 채워줄 값이 숫자인 경우 : 매개변수 int형 하나
2-2) 채워줄 값이 문자인 경우 : 매개변수 String형 하나
3. 채워줄 값이 여러개인 경우 : 매개변수는 DTO 객체.
리턴타입 : 쿼리 실행 결과를 어떻게 받아올지에 대한 정의
INSERT, UPDATE, DELETE 쿼리 실행 결과는
리턴타입을 int 혹은 void 사용하면됨.
SELECT 쿼리 결과의 리턴타입은 크게 두 가지로 나뉨.
조회결과 데이터가 무조건 한줄만 조회 : DTO 객체.
조회 결과 데이터가 0줄이상 가변적일 경우 : List<DTO> 객체.
ReplyService.java 인터페이스
SELECT 쿼리 결과는 두가지로 나뉜다 DTO와 LIST, 여기선 목록이니까 당연히 겹겹이 쌓일 것이니 list이다.
mapper에서 데이터 하나를 비교했으므로 자료형은 int 변수는 똑같이 적어준다.
ReplyServiceImple.java 클래스
이렇게 까지 해주고,
BoardController.java 서블릿
아까 하려고 했던 List<ReplyDTO> 객체를 만들어 변수 replyList에 쿼리로 작성했던 데이터를 넣고 replyList라는 이름으로 board_detail.jsp에 가지고 가서 뿌려주기만 하면 된다.
board_detail.jsp
board_detail.jsp 파일로 들어와 replyList라는 이름으로 받아온 데이터를 ${ } 안에 넣어주면서 코드를 짜면된다.
만약 댓글이 달려있지 않으면 size는 0이므로 댓글이 없다고 표시될 것이며, 그렇지 않다면 데이터는 리스트로 출력된다.
forEach문을 사용해 replyList에 들어있는 작성자, 날짜, 내용을 jsp화면에 뿌려주었고, 댓글 번호는 hidden으로 가져왔다.
다음에 있을 삭제에 사용될 것이다.
댓글