JAVA 웹개발 과정 국비 58일차 정리
58일차
※ 배우는 과정이므로 정확하지 않을 수 있습니다.
잘못된 점은 알려주시면 수정하도록 하겠습니다!
1. 게시판 만들기 이어서..
1) 마이페이지 구현
index.jsp
에서myPage
버튼을 누르면 회원정보 조회 & 수정 가능한myPage.jsp
로 이동- 다이렉트 이동은 막고, 컨트롤러에서
myPage.mem
으로 받기 - id는 수정 불가능하게 만들고, 중복확인 버튼 없애기
- 비밀번호는 일단 비워둔다.
- 나머지 정보를 수정하고 수정하기를 누르면 DB에 수정된 정보 반영
index.jsp
페이지로 돌아간다.
2) 게시판으로 이동 구현
- 게시판 기능을 담당하는
BoardController
생성 BoardDTO
,BoardDAO
생성- 게시판 목록으로 이동하는
toBoard.board
생성 - 게시판 목록
list.jsp
생성 MyPage
에서toBoard
를 누르면 게시판 목록으로 이동- DB에 게시판 내용을 저장하는
board
테이블 생성
UI는 기존에 HTML에서 허접하게 만들었던 페이지를 붙여넣기 했다.
기능 실습이 목표이므로 UI에는 큰 시간을 들이지 않기 위해서이다.
CREATE TABLE board(
seq NUMBER PRIMARY KEY,
writer VARCHAR(20) NOT NULL,
title VARCHAR(300) NOT NULL,
contents VARCHAR(4000) NOT NULL,
write_date DATE DEFAULT SYSDATE NOT NULL,
view_count NUMBER DEFAULT 0 NOT NULL
);
CREATE SEQUENCE board_seq START WITH 1 INCREMENT BY 1 NOCACHE NOMAXVALUE;
3) 글 작성 기능과 목록 구현
- 작성하기를 클릭하면 글 작성 페이지
write.jsp
로 이동한다. - 작성완료를 누르면 게시판 목록으로 이동.
- 게시판 목록에 DB에 저장된 데이터 출력.
작성완료를 누르면 form태그의 sumbit을 작동시켜 title과 contents를 컨트롤러에 넘겨주고, 컨트롤러에서 insert 기능을 실행한다.
컨트롤러에서 dto를 forward
로 게시판 목록 페이지로 넘겨주고, 해당 페이지에서 jstl로 dto의 각 멤버필드를 forEach 문으로 돌려서 받아준다.
4) 상세 페이지 구현
- 글 제목을 클릭하면 상세 페이지로 이동
- 컨트롤러에
detail.board
생성 - 상세페이지 view
detail.jsp
생성 - 클릭하여 이동할 때마다 조회수 1씩 증가시키기
- 목록으로 돌아가기 버튼 구현
- 글 작성자가 페이지에 접근할 경우 삭제하기 버튼 구현
상세페이지로 이동하려면 글번호(seq)를 이용한다. a태그를 사용하여 각 태그를 눌렀을 때, 주소값을 detail.board
+ seq
로 정해주면 컨트롤러에 detail.board
if문을 찾아가서 seq
를 전달할 수 있다.
DAO에 seq를 이용한 select 메소드를 생성하여 컨트롤러에서 메소드를 사용하면, seq에 맞는 dto를 가져올 수 있다.
가져온 dto 정보를 상세페이지에 뿌려주는 것이다.
마찬가지로 삭제 기능도 seq 값을 주소값으로 받아와 메소드로 삭제해준다.
// 조회수 올리기 메소드
public int addViewCount(int seq) throws Exception{
String sql = "UPDATE board SET view_count = view_count + 1 WHERE seq =?";
try (Connection con = this.getConnection();
PreparedStatement pstat = con.prepareStatement(sql);
){
pstat.setInt(1, seq);
int result = pstat.executeUpdate();
con.commit();
return result;
}
}
어려웠던 점 ①
어떤 주소로 페이지를 이동할 것인가?
이 부분은 강사님께서도 학생들이 생각하기 어렵다 판단하셨는지 알려주셨다.
글 번호(seq)를 이용하여 이동하는 것은 생각도 못했던 방법이였다.
어려웠던 점 ②
어떻게 페이지 이동을 할 것인가?
a태그로 구현은 성공했지만 form-submit, js를 이용할 수는 없을까 고민했다.
form-submit은 마찬가지로 제외시키고, js를 이용하여 td태그를 클릭할 때마다 이벤트가 생기도록 시도해봤다. 그러나 게시판 목록을 보여주는 코드가 forEach문 안에 있기 때문에 모든 글의 seq
가 마지막 데이터의 seq
로만 출력되었다.
강사님께 질문했더니 a태그로 구현하는 것이 이 과정에서는 가장 적합하다고 해서 그대로 따르기로 했다.
<td style="padding:5px;"><a href="detail.board?seq=${dto.seq }">${dto.title }</a>
5) 게시판 날짜 디테일 기능 추가(Optional)
현재는 게시판 날짜가 YYYY-MM-DD 로 표기 된다.
다른 게시판을 보면 오늘에 한해서 올린 게시물은 날짜 표기 대신 시간만 출력되는 것을 본 적이 있을 것이다.
이 기능과 비슷하게, 1분 이내
, 5분 이내
, 1시간 이내
, 오늘
그 이후로는 그냥 날짜를 출력하도록 바꿔보았다.
// 날짜를 가공해서 출력
public String getFormedDate() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd hh:mm");
return sdf.format(write_date.getTime());
}
// 몇분전으로 날짜 뜨게 하는 메소드
public String getDetailDate() {
long current_time =System.currentTimeMillis(); // 현재 Timestamp
long write_time = this.write_date.getTime(); // 글이 작성된 시점의 Timestamp
long time_gap = current_time - write_time;
if(time_gap < 60000) {
return "1분 이내";
}else if(time_gap < 300000){
return "5분 이내";
}else if(time_gap < 3600000) {
return "1시간 이내";
}else if(time_gap < 86400000) {
return "오늘";
}else {
return getFormedDate();
}
}
위의 두 메소드를 만든 뒤 list.jsp
에서 ${dto.write_date}
대신 ${dto.detailDate}
를 써줬는데 계속 오늘
이라는 문구만 출력되었다.
이유를 알아보려고 time_gap
을 출력해보니 모든 게시글의 값이 51952877
로 동일하게 나왔다.
문제는 DB에 board 테이블의 write_date 컬럼을 DATE
로 지정해서 시간 값을 가져오지 못하는 것이였다.
DB의 컬럼을 TIMESTAMP
로 바꿔주고, BoardDTO
의 write_date
의 자료형을 모두 Timestamp
로 바꿔주면 해결된다.
ALTER TABLE board MODIFY (write_date TIMESTAMP DEFAULT SYSDATE);
또한, 기존에 test 했던 데이터들은 모두 시간값이 저장되지 않았기 때문에 전부 삭제하고 다시 테스트를 해보면 된다!
댓글남기기