[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;
    }

     

     

    반응형

    댓글