열심히 끝까지

디바이스 융합 자바(Java) day49 - 설계 작업 + 게시판(SNS) + 댓글 넣는 작업 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(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 보냄