Study

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

PEAZH 2023. 7. 24. 08:41
반응형

 

 

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

 

 

반응형