열심히 끝까지
디바이스 융합 자바(Java) day49 - 설계 작업 + 게시판(SNS) + 댓글 넣는 작업 본문
디바이스 융합 자바(Java) day49 - 설계 작업 + 게시판(SNS) + 댓글 넣는 작업
노유림 2022. 8. 19. 15:21[오늘 수업]
[설계]
1. 어떤 서비스를 만들지?
ex )
- sns(반응형에 맞는 UI)
- 커뮤니티(댓글, 대댓글 테이블 관계)
- 쇼핑몰(장바구니)
>> 타겟 사이트 사전 조사(벤치마킹)
- 기존에 이게 안좋아서 이걸 바꾸었다 라고 하는 것은 감점 사유,
유명하게 서비스 되는 것들은 이유가 존재 그 이유에 대해 조사하는 것이 중요
저는 이 사항을 이렇게로도 사용해보았습니다 라고 어필하는 것이 중요
- 유효성 검사, UI/UX
- 최종적으로 구현할 기능
2. 기능을 구현하기 위해 필요한 데이터 생각해보기
- 테이블-테이블 관계 고려
- 제약조건 설정
----------------------- 컨펌 받을 준비 끝
3. 페이지 개수
4. 테이블 개수
----------------------- 코딩 준비 완료!
1) 댓글 대댓글
- 회원 테이블
mid PK
- 글 테이블
bid PK
mid FK -> 작성자
rcnt -> 댓글수
- 댓글 테이블
rid PK
bid FK -> 어떤 글에 댓글을 작성했는지에 대한 정보
mid FK -> 작성자
+) 댓글 삭제 -> 댓글 수 UPDATE
+) 글 삭제 -> 댓글 함께 삭제
+) 회원 삭제(탈퇴) -> 글, 댓글이 존재한다면 삭제(탈퇴) 불가
+++) (알수없음)으로 표시
2) 메인페이지
- 로그인/회원가입 vs 로그아웃
- 글 작성
- 댓글 작성
3) 회원가입 페이지
- 새 창으로 서비스 제공
4) controller 두개 제작
- ctrlB.jsp
- 글
- 댓글
- ctrlM.jsp
- 회원
>> reply는 board랑 연관이 깊어서 board 패키지에서 같이 관리
>> 사용한 DB : MySQL
>> ★★★★★이번에 참고할 것 BoardSet ★★★★★
package board;
import java.util.ArrayList;
public class BoardSet {
// ★★★★★
// 글 1개 + 댓글 N개
// JAVA에서 사용할 VO를 자체 제작
private BoardVO boardVO;
private ArrayList<ReplyVO> rList = new ArrayList<ReplyVO>();
public BoardVO getBoardVO() {
return boardVO;
}
public void setBoardVO(BoardVO boardVO) {
this.boardVO = boardVO;
}
public ArrayList<ReplyVO> getrList() {
return rList;
}
public void setrList(ArrayList<ReplyVO> rList) {
this.rList = rList;
}
}
글 1개 + 댓글 N개
>> JAVA에서 로직적으로 사용할 VO를 자체 제작
public ArrayList<BoardSet> selectAll(BoardVO bvo){ // 유지보수 용이
ArrayList<BoardSet> datas=new ArrayList<BoardSet>();
conn=util.JDBCUtil.connect();
try {
pstmt=conn.prepareStatement(sql_selectAll);
// 글 1개 + 댓글 N개
// 좋아요가 많은 게시글을 고르게 되면 FAVCNT
// 댓글이 많은 게시글을 고르고 되면 RCNT
pstmt.setInt(1, bvo.getCnt());
ResultSet rs=pstmt.executeQuery();
while(rs.next()) {
BoardSet bs = new BoardSet(); // bs이 boardVO와 ArrayList<ReplyVO>를 담고 있어서 기술
BoardVO boardVO = new BoardVO();
boardVO.setBid(rs.getInt("BID"));
boardVO.setFavcnt(rs.getInt("FAVCNT")); // 추천수 43번의 추천 V : ${favcnt}번
// boardVO.setFavcnt(rs.getInt("FAVCNT")+"번의 추천");
// 작성일[]에 많이 쓰임 11:23:00 -> 11시 23분에 작성됨(이걸 모델 작업 가능)
boardVO.setMid(rs.getString("MID"));
boardVO.setMsg(rs.getString("MSG"));
boardVO.setRcnt(rs.getInt("RCNT")); // 댓글 수 현재는 저장중(개시글이 1000개면 댓글도 1000개 저장)
// 칼럼을 만들 때도 신중하게 만듦
// rList.size(); == RCNT로 setRcnt 대용으로 사용 가능!
bs.setBoardVO(boardVO);
ArrayList<ReplyVO> rList=new ArrayList<ReplyVO>();
pstmt=conn.prepareStatement(sql_selectAll_R);
pstmt.setInt(1, rs.getInt("BID")); // 현재 BID
ResultSet rs2 = pstmt.executeQuery();
while(rs2.next()) {
ReplyVO replyVO = new ReplyVO();
replyVO.setBid(rs2.getInt("BID"));
replyVO.setMid(rs2.getString("MID"));
replyVO.setRid(rs2.getInt("RID"));
replyVO.setRmsg(rs2.getString("RMSG"));
rList.add(replyVO);
}
bs.setrList(rList);
datas.add(bs);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
util.JDBCUtil.disconnect(pstmt, conn);
}
return datas;
}
[주의깊게 봐야 할 사항]
>> selectAll(BoardVO vo){ // 유지보수 용이
어느 유저가 작성한 댓글 조회와 같은 기능을 추가할 때,
~> BoardVO mid와 같이 메서드 시그니쳐가 바뀌면 설계를 엉망으로 한 것으로 평가
~> 유지보수 불가한 것으로 평가
>> 그렇기에 BoardVO vo로 놓는 것이 좋음
>> 실무에서 DB데이터를 많이 쓰면 서버비용 증가
- 무슨 짓을 해서라도 서버를 덜 쓰려고 노력
- 서버를 덜 쓰는 것을 피력(일머리 있는 것 어필, 비용적 생각 존재한다는 것을 어필)
- 포폴에서 언급하면 다른 파트의 비용까지 생각할 수 있는 시야가 넓은 사람이라고 생각
언급한다는 것 자체를 좋아함
>> web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/error404.jsp</location>
</error-page>
</web-app>
>> 톰캣이 실행될 때 참조하는 환경설정 파일
>> index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
response.sendRedirect("ctrlB.jsp?action=main");
%>
<!-- EL식을 안 쓰는 이유 : VIEW파트가 아니기 때문 -->
>> INDEX에서 왜 EL식을 안쓰죠? : VIEW파트가 아니기 때문!
view 작업자라면 main에서 필요하다라는 것을 작성
ex )
- mid : 로그인한 사람의 아이디 정보
+ mid : msg, action 보냄