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로 바꿔주고, BoardDTOwrite_date의 자료형을 모두 Timestamp로 바꿔주면 해결된다.

ALTER TABLE board MODIFY (write_date TIMESTAMP DEFAULT SYSDATE);

또한, 기존에 test 했던 데이터들은 모두 시간값이 저장되지 않았기 때문에 전부 삭제하고 다시 테스트를 해보면 된다!

2. 소스 코드

Board

댓글남기기