본문 바로가기

수업내용

[Day33] 글쓰기에 따른 point 점수 증가 / 글 목록 조회(DTO, HashMap) / 글 삭제

1-2. 글쓰기에 따른 회원의 point 점수 증가시키기

-- 글쓰기와 point 증가를 분리하여 따로 생성한다.

 

(Eclipse)InterBoardDAO

int memberPointUpdate(String userid, int point);

 

(Eclipse)InterBoardDAO

@Override
	public int memberPointUpdate(String userid, int point) {
		int n = 0;
		
		try {
			// singleton 패턴에 입각한 수동 commit Connection 객체 얻어오기
			conn = MyDBConnection.getConn();

			String sql = " update jdbc_tbl_member set point = point + ? " 
			           + " where userid = ? ";

				pstmt = conn.prepareStatement(sql);
				pstmt.setInt(1, point);
				pstmt.setString(2, userid);

				n = pstmt.executeUpdate();
				
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		
		return n;
	}

 

 


 

(Eclipse)InterBoardDAO

void commti();
	
void rollback();

 

commit

 

(Eclipse)BoardDAO

@Override
public void commti() {
	conn = MyDBConnection.getConn();
	try {
		conn.commit();
	} catch (SQLException e) { }
}

 

rollback

 

(Eclipse)BoardDAO

@Override
	public void rollback() {
		conn = MyDBConnection.getConn();
		try {
			conn.rollback();
		} catch (SQLException e) {
		}
	}

 

--  catch에 아무것도 보여주지 않고 형식만 맞춰 주면 된다.

 


 

(Eclipse)BoardCtrl

int n1 = boardDao.boardWrite(bdto);

	int n2 = 0;
	if (n1 == 1) {
		// 글쓰기가 성공되었다면 글쓴 사용자에게 포인트 10점을 증가시켜 주겠다.
		n2 = boardDao.memberPointUpdate(userid, 10);

		if (n2 == 0) {
			boardDao.rollback();
		} else {
			do {
				System.out.print("▷ 확인[Y]/취소[N] => ");
				String yn = sc.nextLine();
				if ("Y".equals(yn) || "y".equals(yn)) {
					boardDao.commti(); // 글쓰기와 회원의 point 증가를 모두 commit
					n = 1;
					break;
				}

				else if ("N".equals(yn) || "n".equals(yn)) {
					boardDao.rollback(); // 글쓰기와 회원의 point 증가를 모두 rollback
					n = 0;
					break;
				}

				else {
					System.out.println(">> Y 또는 N만 입력하세요. <<");
				}
			} while (true);
		}
	}
	return n;

 

 

 


-- 글쓰기를 한 후 데이터베이스 상에 포인트가 올랐음에도 이클립스에서 내 정보 보기를 했을 때 포인트가 증가되지 않은 현상 발생

 

(Eclipse)InterMemberCtrl

MemberDTO selectOneMemberByUserid(String userid);

 

(Eclipse)MemberCtrl

@Override
	public MemberDTO selectOneMemberByUserid(String userid) {
		
		MemberDTO mbrdto = null;
		
		mbrdto = mbrdao.selectOneMemberByUserid(userid);
		
		return mbrdto;
	}

 

(Eclipse)InterMemberDAO

MemberDTO selectOneMemberByUserid(String userid);

 

(Eclipse)MemberDAO

@Override
public MemberDTO selectOneMemberByUserid(String parauserid) {
	MemberDTO mbrdto = null;

	try {
		conn = MyDBConnection.getConn();

		String sql = "select no, userid, passwd, name, address\n"
				+ "     , substr(birthday, 1, 4) || '-' || substr(birthday, 5, 2) || '-' || substr(birthday, 7) AS birthday\n"
				+ "     , to_char(registerday, 'yyyy-mm-dd hh24:mi:ss') AS registerday\n" + "     , gender, point\n"
				+ "from jdbc_tbl_member\n" + "where status = 1 and\n" + "      userid = ? ";

		pstmt = conn.prepareStatement(sql);
		pstmt.setString(1, parauserid);

		rs = pstmt.executeQuery();

		if (rs.next()) {
				int no = rs.getInt("no");
				String userid = rs.getString("userid");
				String passwd = rs.getString("passwd");
				String name = rs.getString("name");
				String address = rs.getString("address");
				String birthday = rs.getString("birthday");
				String registerday = rs.getString("registerday");
				int gender = rs.getInt("gender");
				int point = rs.getInt("point");

				mbrdto = new MemberDTO();

				mbrdto.setNo(no);
				mbrdto.setUserid(userid);
				mbrdto.setPasswd(passwd);
				mbrdto.setName(name);
				mbrdto.setAddress(address);
				mbrdto.setBirthday(birthday);
				mbrdto.setRegisterday(registerday);
				mbrdto.setGender(gender);
				mbrdto.setPoint(point);

			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (pstmt != null)
					pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		return mbrdto;
	}

 

(Eclipse)MemberNBoardMainApp

case "4": 
	if (loginuser == null)
		System.out.println(">> 먼저 로그인 하세요. <<\n");
	else
		loginuser = mbrCtrl.selectOneMemberByUserid(loginuser.getUserid());
		System.out.println(loginuser.showMemberInfo());
	break;

 


2. 글 목록 조회

 

(Eclipse)MemberNBoardMainApp

case "2": // 글 목록 조회
	List<BoardDTO> boardList = boardCtrl.selectAllBoardTitle();
							
	System.out.println("-----------------------------------------------");
	System.out.println("글번호   글쓴이   글제목   조회수   작성일자");
	System.out.println("-----------------------------------------------");
							
	for(BoardDTO bdto : boardList) {
		System.out.println(bdto);
	}
							
	break;

 

(Eclipse)BoardDTO

private MemberDTO mbrdto;

public MemberDTO getMbrdto() {
	return mbrdto;
}
public void setMbrdto(MemberDTO mbrdto) {
	this.mbrdto = mbrdto;
}

 

(Eclipse)BoardDAO

@Override
	public List<BoardDTO> selectAllBoardTitle() {

		List<BoardDTO> boardList = null;

		try {
			// singleton 패턴에 입각한 수동 commit Connection 객체 얻어오기
			conn = MyDBConnection.getConn();

			// 글번호, 글쓴이(name), 글제목, 글조회수, 작성일자
			String sql = "select B.no, M.name, B.title, B.readcount\n"+
					"      , writeday\n"+
					"from jdbc_tbl_board B join jdbc_tbl_member m\n"+
					"on B.fk_userid = M.userid\n"+
					"where B.status = 1\n"+
					"order by B.no desc";
			
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			
			int cnt = 0;
			while(rs.next()) {
				cnt ++;
				
				if(cnt == 1)
					boardList = new ArrayList<BoardDTO>();
				int no = rs.getInt("no");
				String name = rs.getString("name");
				String title = rs.getString("title");
				int readcount = rs.getInt("readcount");
				java.sql.Date writeday = rs.getDate("writeday");

				BoardDTO bdto = new BoardDTO();
				bdto.setNo(no);
				
				MemberDTO mbrdto = new MemberDTO();
				mbrdto.setName(name);
				
				bdto.setMbrdto(mbrdto);
				bdto.setTitle(title);
				bdto.setReadcount(readcount);
				bdto.setWriteday(writeday);
				
				boardList.add(bdto);
			} // end of while --------------
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}

		return boardList;
	}

 

-- BoardDTO에 toString 재정의

 

(Eclipse)BoardDTO

@Override
public String toString() {
	String info = no +  "   " + mbrdto.getName() +  "   " + title +  "   " + readcount+  "   " + writeday;
	return info;
}

 


글 목록에서 특정 글 번호에 해당하는 글 내용 보여주기

 

(Eclipse)MemberNBoardMainApp case "11" 의 case "2"

do {
	System.out.print("\n▷ 조회할 글번호 => ");
	String strNO = sc.nextLine();

		try {
			int no = Integer.parseInt(strNO);
			System.out.println("\n ==== 내용물 ====");
			if(contents != null)
				System.out.println(contents + "\n");
			else
				System.out.println(">> 글번호 "+strNO+"에 해당하는 글은 존재하지 않습니다.\n");
			break;
		} catch (NumberFormatException e) {
			System.out.println(">> 숫자만 입력하세요. <<");
		}
	} while (true);

-- strNO를 String으로 지정하면 try ~ catch를 사용하지 않아도 된다.

 

(Eclipse)InterBoardCtrl

String showContents(int no);

 

(Eclipse)BoardCtrl

@Override
public String showContents(int no) {
	String contents = null;
		
	contents = boardDao.showContents(no);
	return contents;
}

 

(Eclipse)InterBaordDAO

String showContents(int no);

 

(Eclipse)BoardDAO

@Override
public String showContents(int no) {
		
	String contents = null;
	conn = MyDBConnection.getConn();
	try {
			
	String sql = "select contents\n"+
			"from jdbc_tbl_board\n"+
			"where no = ? ";
		
	pstmt = conn.prepareStatement(sql);
	pstmt.setInt(1, no);
		
	rs = pstmt.executeQuery();
		
	while(rs.next()) {
		contents = rs.getString("contents");
	}
		
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		close();
	}
	return contents;
}

 

 


조회할 글번호에서 엔터를 입력하면 빠져나오기

 

(Eclipse)MemberNBoardMainApp case "11" 의 case "2"의 do~while

if("".equals(strNO))
	break;

 


글을 조회했을 때 조회수 1 증가시키기

 

BoardCtrl

if (contents != null)
	boardDao.updateReadCount(no)

 

InterBoardDAO

void updateReadCount(int no);

 

BoardDAO

@Override
		public void updateReadCount(int no) {
			try {
				// singleton 패턴에 입각한 수동 commit Connection 객체 얻어오기
				conn = MyDBConnection.getConn();

				String sql = " update jdbc_tbl_board set readcount = readcount + 1 " 
						   + " where no = ? ";

				pstmt = conn.prepareStatement(sql);
				pstmt.setInt(1, no);

				pstmt.executeUpdate();
				
				conn.commit();

			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				close();
			}
			
		}

 


문제▷▷ 다른 사람이 글을 조회했을 때만 조회수 1 증가시키기

 

InterBoardCtrl

String showContents(int no, String userid);

 

BoardCtrl

@Override
	public String showContents(int no, String userid) {
    String contents = null;
		
		contents = boardDao.showContents(no);

		if (contents != null)
			
			boardDao.updateReadCount(no, userid); // 글 조회수 1 증가를 한다.

		return contents;
	}

 

BoardDAO

@Override
public void updateReadCount(int no, String userid) {
	try {
		conn = MyDBConnection.getConn();

		String sql = " update jdbc_tbl_board set readcount = readcount + 1 " 
					+ " where no = ? and fk_userid != ?";

		pstmt = conn.prepareStatement(sql);
		pstmt.setInt(1, no);
		pstmt.setString(2, userid);
				

		pstmt.executeUpdate();
				
		conn.commit();

	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		close();
	}
}

 


 

3. 글 목록 조회2(HashMap)

 

MemberNBoardMainApp

case "3": // 글 목록 조회2(HashMap)
	List<HashMap<String, String>> mapList = boardCtrl.selectAllBoardTitle2();

	System.out.println("-----------------------------------------------");
	System.out.println("글번호   글쓴이   글제목   조회수   작성일자");
	System.out.println("-----------------------------------------------\n");

	for (Map<String, String> map: mapList) {
		String info = map.get("no") + "  " +
					 map.get("name") + "  " +
					 map.get("title") + "  " +
					 map.get("readcount") + "  " +
					 map.get("writeday") +"\n";
								
		System.out.println(info);
	}

 

InterBoardCtrl

List<HashMap<String, String>> selectAllBoardTitle2();

 

BoardCtrl

@Override
public List<HashMap<String, String>> selectAllBoardTitle2() {
		
	List<HashMap<String, String>> mapList = null;
		
	mapList = boardDao.selectAllBoardTitle2();
		
	return mapList;
}

 

BoardDAO

@Override
public List<HashMap<String, String>> selectAllBoardTitle2() {
			
	List<HashMap<String, String>> mapList = null;
			
	try {
		conn = MyDBConnection.getConn();

		// 글번호, 글쓴이(name), 글제목, 글조회수, 작성일자
		String sql = "select B.no, M.name, B.title, B.readcount\n"+
				"      , B.writeday\n"+
				"from jdbc_tbl_board B join jdbc_tbl_member m\n"+
				"on B.fk_userid = M.userid\n"+
				"where B.status = 1\n"+
				"order by B.no desc";
				
		pstmt = conn.prepareStatement(sql);
		rs = pstmt.executeQuery();
				
		int cnt = 0;
		while(rs.next()) {
			cnt++;
					
			if(cnt == 1) {
				mapList = new ArrayList<HashMap<String, String>>();
		}
			int no = rs.getInt("no");
			String name = rs.getString("name");
			String title = rs.getString("title");
			int readcount = rs.getInt("readcount");
			java.sql.Date writeday = rs.getDate("writeday");

			HashMap<String, String> map = new HashMap<String, String>();
			map.put("no", String.valueOf(no));
			map.put("name", name);
			map.put("title", title);
			map.put("readcount", String.valueOf(readcount));
			map.put("wirteday", String.valueOf(writeday));
					
			mapList.add(map);
					
		}

 

 


6. 글 삭제하기

 

MemberNBoardMainApp

case "6": 
	mapList = boardCtrl.selectAllBoardTitle2();
							
	n = boardCtrl.deleteBoard(loginuser.getUserid(), sc);
							
	if(n==1)
		System.out.println(">> 글삭제를 성공했습니다.");
	else
		System.out.println(">> 글삭제를 실패 또는 취소했습니다.");

 

InterBoardCtrl

int deleteBoard(String userid, Scanner sc);

 

BoardCtrl

@Override
public int deleteBoard(String userid, Scanner sc) {
	int n = 0;

	do {

		System.out.print("▷ 삭제할 글번호 : ");
		String strNO = sc.nextLine();

		try {
			int no = Integer.parseInt(strNO);

			System.out.print("▷ 글암호 : ");
			String writePasswd = sc.nextLine();

			HashMap<String, String> paraMap = new HashMap<String, String>();
			paraMap.put("userid", userid);
			paraMap.put("no", String.valueOf(no));
			paraMap.put("writePasswd", writePasswd);

			n = boardDao.deleteBoard(paraMap);

			if (n == 1) {

				do {

					System.out.print("▷ 확인[Y]/취소[N] => ");
					String yn = sc.nextLine();

					if ("Y".equals(yn) || "y".equals(yn)) {
						boardDao.commit();
						break;
					}

					else if ("N".equals(yn) || "n".equals(yn)) {
						boardDao.commit();
						n = 0;
						break;
					}

					else {
						System.out.println(">> Y 또는 N만 입력하세요. <<");
					}
				} while (true);
			}

			break;
		} catch (NumberFormatException e) {
			System.out.println(">> 숫자만 입력하세요. <<\n");
		}

	} while (true);
	return n;
}

 

InterBoardDAO

int deleteBoard(HashMap<String, String> paraMap);