[Study #37] 로그인 했을 경우에만 글 작성·수정하도록 제어하기

 

 

01. BOARD 생성

 

01) SQL에서 테이블 생성하기

 

02) 'board'의 내용이 없다면 보드 내용이 안 나오게 하기 (choose문 사용)

  • fn함수를 사용하기 위해서 아래의 코드를 'board.jsp'에 추가하기
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
  • fn:length : 길이를 검사하는 명령어 ( 예시 : ${fn:length(list)} ) 
  • ${fn:length(list) gt 0 } : list의 길이가 0보다 클 경우
  • when일 때 테이블을 출력하고, otherwise일 때 '출력할 데이터가 없습니다.'라고 출력
<c:choose> <c:when test="${fn:length(list) gt 0 } "> <table> <tr> <th>번호</th> <th>제목</th> <th>작성자</th> <th>작성일</th> <th>좋아요</th> </tr> <c:forEach items="${list }" var="row"> <tr class="board_list" onclick="location.href='./detail?bno=${row.bno }'"> <td class="td1">${row.bno }</td> <td class="title">${row.btitle }</td> <td class="td1">${row.bwrite }</td> <td class="td2">${row.bdate }</td> <td class="td1">${row.blike }</td> </tr> </c:forEach> </table> </c:when> <c:otherwise>출력할 데이터가 없습니다.</c:otherwise> </c:choose>

 

 

02. 로그인한 사용자만 글 작성하기

 

01) 데이터 테이블에서 bwrite를 m_no로 변경

  • member의 회원번호를 외래키로 활용하여 두 테이블을 join으로 묶기 위함
  • m_write로 연결하지 않는 이유 : 작성자가 중복될 수 있기 때문 (m_no는 단일값을 가지는 기본키)

 

 

02) 변경한 m_no를 외래키로 설정하기

  • CASCADE : 종속되어 있는 하위 글도 같이 삭제됨
    (ex. 해당 보드의 게시글이 지워질 때 댓글도 함께 지우고 싶을 때 사용) 

 

 

03) join을 이용해서 m_no가 m_name으로 나오게 하기

  • JOIN : 두 개 이상의 테이블을 연결할 때 사용

SELECT * FROM board JOIN members : 보드와 멤버를 하나로 연결해서 출력

SELECT * FROM board JOIN members ON board.m_no = members.m_no : 보드의 m_no와 멤버의 m_no를 하나로 연결해서 출력

SELECT b.bno, b.btitle, m.m_name, b.bdate, b.blike, b.bip FROM board b JOIN members m ON b.m_no = m.m_no

: ON으로 둘을 연결하고 board는 b로 부르고 members는 m으로 부름

 

 

04) 'boardview' 만들기

  • 맨날 치기 힘드니까 'boardview'로 만들기 : 역순 정렬해서 10번까지 보여주기

CREATE VIEW boardview as SELECT b.bno, b.btitle, m.m_name, b.bdate, b.blike, b.bip

FROM board b JOIN members m ON b.m_no = m.m_no

ORDER BY bno DESC LIMIT 10

 

 

05) board_mapper.xml 수정하기

  • detail, boardList에서 'board'를 'boardview'로 변경
<select id="boardList" resultType="boardDTO"> SELECT * FROM boardview </select>

 

 

06) boardDTO 수정하기 : m_id, m_name 추가하기

  • m_id, m_name 추가하기
package com.peazh.pro1; public class BoardDTO { private int bno, blike; private String btitle, m_id, m_name, bcontent, bdate, bip; public int getBno() { return bno; } public void setBno(int bno) { this.bno = bno; } public int getBlike() { return blike; } public void setBlike(int blike) { this.blike = blike; } public String getBtitle() { return btitle; } public void setBtitle(String btitle) { this.btitle = btitle; } public String getM_name() { return m_name; } public void setM_name(String m_name) { this.m_name = m_name; } public String getBcontent() { return bcontent; } public void setBcontent(String bcontent) { this.bcontent = bcontent; } public String getBdate() { return bdate; } public void setBdate(String bdate) { this.bdate = bdate; } public String getBip() { return bip; } public void setBip(String bip) { this.bip = bip; } public String getM_id() { return m_id; } public void setM_id(String m_id) { this.m_id = m_id; } }

 

 

07) 'board.jsp'에서 로그인 안했을 경우 작성하기 버튼 빼기

 

- 로그인 했을 경우

로그인 했을 경우 화면

 

- 로그인 안했을 경우

로그인 안했을 경우 화면

 

- 아래의 코드 추가

  • 로그인한 사람 이름 : ${sessionScope.mname }
<c:if test="${sessionScope.mname ne null}"> <img alt="" src="./img/write.png" style="width: 8%;" onclick="location.href='./write'"> </c:if>

 

 

08) 'BoardController'에서 @GetMapping("/write") 수정하기

  • 로그인 안했을 경우 : 작성하기 버튼을 누르면 로그인 화면으로 돌아가기
@GetMapping("/write") public String write(HttpServletRequest request) { HttpSession session = request.getSession(); if (session.getAttribute("mname") != null) { return "write"; } else { return "redirect:/login"; } }

 

 

09) 'BoardController'에서 @PostMapping("/write") 수정하기

  • if문을 넣어서 로그인 안했을 경우 로그인 화면으로 보내기
@PostMapping("/write") public String write2(HttpServletRequest request) { HttpSession session = request.getSession(); if(session.getAttribute("mid") != null ) { // 로그인 했습니다. // 사용자가 입력한 데이터 변수에 담기 BoardDTO dto = new BoardDTO(); dto.setBtitle(request.getParameter("title")); dto.setBcontent(request.getParameter("content")); // 세션에서 불러오기 dto.setM_id((String)session.getAttribute("mid")); dto.setM_name((String) session.getAttribute("mname")); // Service -> DAO -> mybatis -> DB로 보내서 저장하기 boardService.write(dto); return "redirect:board"; } else { return "redirect:/login"; } }

실행화면

 

 

10) 'board-mapper.xml' 수정하기

  • 서브쿼리 : 쿼리 속에 쿼리가 들어간 형태
    괄호 안에 있는 내부의 내용이 먼저 실행하고 그 후 밖에 있는 값이 실행

서브쿼리의 예시

  • 다음의 코드 추가
<insert id="write" parameterType="boardDTO"> ‌INSERT INTO board (btitle, bcontent, m_no, bip) ‌VALUES (#{btitle }, #{bcontent }, (SELECT m_no FROM members WHERE m_id=#{m_id}), #{bip }); </insert> <select id="detail" parameterType="boardDTO" resultType="boardDTO"> SELECT * FROM boardview WHERE bno = #{bno } <if test="m_id != null"> AND m_id=#{m_id } </if> </select>

 

 

 

03. 로그인한 사용자만 글 수정하기

 

01) 'detail.jsp' 수정하기

  • if문 안에 조건문 넣어서 로그인 했을 경우에만 수정&삭제 버튼 나오게 하기
<c:if test="${sessionScope.mid ne null && m_id eq dto.m_id}"> <img alt="" src="./img/edit.png" style="width: 7%;" onclick="edit()"> <img alt="" src="./img/del.png" style="width: 7%;" onclick="del()"> </c:if>

 

 

02) 'BoardController.java' 수정하기

// 수정하는 화면 만들기 @GetMapping("/edit") public ModelAndView edit(HttpServletRequest request) { HttpSession session = request.getSession(); ModelAndView mv = new ModelAndView("edit");// edit.jsp로 갈거야 // dto를 하나 만들어서 거기에 담겠습니다. = bno, mid BoardDTO dto = new BoardDTO(); dto.setBno(util.str2Int(request.getParameter("bno"))); // 내 글만 수정할 수 있도록 세션에 있는 mid도 같이 보내기 dto.setM_id((String) session.getAttribute("mid")); // 데이터 베이스에 bno를 보내서 dto를 얻어오기 BoardDTO result= boardService.detail(dto); // mv에 보내기 mv.addObject("dto", result); return mv; } @GetMapping("/detail") // model은 jsp에 값을 붙이기 위해서 넣기 public String detail(HttpServletRequest request, Model model) { // String bno = request.getParameter("bno"); int bno = util.str2Int(request.getParameter("bno")); // DTO로 변경하기 BoardDTO dto = new BoardDTO(); dto.setBno(bno);// 글 상세보기에선 mid가 없어도 됨 BoardDTO resule = boardService.detail(dto); model.addAttribute("dto", resule); return "detail";

 

 

03) 'board-mapper' 수정하기

<select id="detail" parameterType="Integer" resultType="boardDTO"> SELECT * FROM boardview WHERE bno = #{bno } AND m_no=(SELECT m_no FROM members WHERE m_id=#{mid}) </select>

 

 

04) 'BoardController.java' 수정하기

    • ModelAndView 원래의 형태 : ModelAndView mv = new ModelAndView("redirect:/login")
      - login.jsp 페이지로 이동
    • 따옴표가 비워진 형태 : ModelAndView mv = new ModelAndView(""
      - 객체만 생성하고 이동할 곳을 비워서 선언

      - 아래의 부분에서 mv.setViewName("edit"); 이렇게 적어줘서 이동할 jsp명을 적어줌
      - 이동하는 곳이 여러개일 때 사용
// 수정하는 화면 만들기 @GetMapping("/edit") public ModelAndView edit(HttpServletRequest request) { HttpSession session = request.getSession(); ModelAndView mv = new ModelAndView();// edit.jsp로 갈거야 // 로그인 하지 않으면 로그인 화면으로 가기 // if문으로 만들기 if (session.getAttribute("mid") != null) { // dto를 하나 만들어서 거기에 담겠습니다. = bno, mid BoardDTO dto = new BoardDTO(); dto.setBno(util.str2Int(request.getParameter("bno"))); // 내 글만 수정할 수 있도록 세션에 있는 mid도 같이 보내기 dto.setM_id((String) session.getAttribute("mid")); // 데이터 베이스에 bno를 보내서 dto를 얻어오기 BoardDTO result = boardService.detail(dto); // mv에 보내기 mv.addObject("dto", result); mv.setViewName("edit");// 이동할 jsp명을 적어줌 return mv; } else { mv.setViewName("redirect:/login"); } return mv; }

 

 

댓글