본문 바로가기

Spring

240221 스프링 프로젝트

오늘은 어제 각 매핑마다 세션을 만들던 것을 세션 만드는 곳을 따로 util 에 넣기

김영한님 스프링 강의에서 본 것처럼 의존성을 최소화하는 방법인 것 같다

public HttpServletRequest req() {
  ServletRequestAttributes sra = 
      (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
  // 이렇게 작성해야만 접속한 사람의 request 를 받을 수 있음
  HttpServletRequest request = sra.getRequest(); 
  return request;
}

 

BoardService 의 request 만들던 것 util 꺼로 바꾸기

public int write(BoardDTO dto) {
  HttpSession session = util.req().getSession();
  dto.setMid((String) session.getAttribute("mid"));
  return boardRepository.write(dto);
}

 

컨트롤러에서 매개변수로 건내주던 거 바꾸기

// IP 잡아주기
dto.setBoard_ip(request.getRemoteAddr());
// int result = boardService.write(dto, request);
int result = boardService.write(dto);

 

util 에서 세션까지 받기

public HttpServletRequest req() {
  ServletRequestAttributes sra = 
      (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
  // 이렇게 작성해야만 접속한 사람의 request 를 받을 수 있음
  HttpServletRequest request = sra.getRequest(); 
  return request;
}
  
public HttpSession getSession() {
  HttpSession session = req().getSession();
  return session;
  // return req().getSession();
}

 

서비스나 컨트롤러에서 계속 getSession 해서 getAttribute 로 mid 나 다른 것을 가져올거면

그것도 util 에 만들 수 있지 않을까해서 만든 getMid

public String getMid() {
  return (String) getSession().getAttribute("mid");
}

 

이런식으로 활용할 수 있음

public int commentWrite(CommentDTO comment) {
  comment.setMid(util.getMid());
  return boardRepository.commentWrite(comment);
}

 

아이피 가져오는 것도 만들기

public String getIp() {
  return (String) req().getRemoteAddr();
}

 

글 삭제 시 로그인 여부 체크, 로그인하지 않으면 로그인으로 보내기

@PostMapping("/postDel")
public String postDel(@RequestParam("bno") int no) {
  // 삭제 시 로그인 여부 확인하기
  if (util.getMid() != null) {
    int result = boardService.postDel(no);
    if (result == 1) {
      return "redirect:/board";
    } else {
      return "redirect:/error";
    }
  } else {
    return "redirect:/login";
  }
}

 

글 삭제 시 로그인 한 사용자의 mid 도 같이 전송하여 작성자가 맞으면 글 삭제하기

public int postDel(int no) {
  BoardDTO dto = new BoardDTO();
  dto.setBoard_no(no);
  dto.setMid(util.getMid());
  return boardRepository.postDel(dto);
}

 

Repository 에서도 mybatis 에 dto 를 보내고 mapper 에서 쿼리문 수정하기

<update id="postDel" parameterType="boardDTO">
<![CDATA[
  update board set board_del = '0' 
  where board_no = #{board_no} 
  and mno=(select mno from member where mid=#{mid})
  ]]>
</update>

 

이제 로그인한 사용자와 글쓴이, 댓 글쓴이가 같을 경우에만 아이콘 뜨게 만들기

<!-- 글 작성자와 체크하기 -->
<span class="mname">${detail.mname }
  <c:if test="${sessionScope.mid eq detail.mid }">
    <i class="xi-document"></i>
    <i class="xi-close-circle-o" onclick="deletePost()"></i>
  </c:if>
</span> 

<!-- 댓글 작성자와 체크하기 -->
<span class="commentMname">${comment.mname } 님
  <c:if test="${sessionScope.mid eq comment.mid }">
    <i class="xi-document"></i>
    <i class="xi-close-circle-o" onclick=""></i>
  </c:if>
</span> <span>${comment.cdate }</span>

 

댓글 삭제 만들기, 댓글 삭제 아이콘에 onclick 달기

<i class="xi-close-circle-o" onclick="commentDel(${comment.no})"></i>

 

스크립트 작성

function commentDel(cno) {
  if (confirm("삭제하시겠습니까?")) {
    let vform = $('<form></form>');
    vform.attr('method', 'post');
    vform.attr('action', './commentDel');
    vform.append($('<input/>', {type:'hidden', name:'no', value:cno}));
    vform.appendTo('body');
    vform.submit();
  }
}

 

controller, Serivce 와 repository 까지 연결

@PostMapping("/commentDel")
public String commentDel(CommentDTO dto) {
  // 로그인한 사람도 같이 보내기
  dto.setMid(util.getMid());
  boardService.commentDel(dto);
  // 헤더에서 이전 페이지를 읽음
  String referer = util.req().getHeader("Referer");
  // 이전 페이지로 리다이렉트
  return "redirect:"+ referer;
}

 

board-mapper 에 update 문 추가

<update id="commentDel" parameterType="commentDTO">
  <![CDATA[
    update comment set cdel = '0' 
    where cno = #{no} 
    and mno=(select mno from member where mid=#{mid})
  ]]>
</update>

 

글 쓸때 <, > 표시 바꾸기

public String http2Java(String str) {
  String result = str.replaceAll("<br>", "\r\n");
  result = str.replaceAll("<", "&lt;");
  result = result.replaceAll(">", "&gt;");
  return result;
}

 

이것을 글 쓸때와 댓글 적을 때 둘 다 적용

public int write(BoardDTO dto) {
  // HttpSession session = util.req().getSession();
  // HttpSession session = util.getSession();
  // dto.setMid((String) session.getAttribute("mid"));
  dto.setMid((String) util.getSession().getAttribute("mid"));
  dto.setBoard_title(util.http2Java(dto.getBoard_title()));
  dto.setBoard_content(util.http2Java(dto.getBoard_content()));
  return boardRepository.write(dto);
}

 

글을 다시 불러올 때 <br> 을 바꾼 걸 다시 <br> 로 변경

public String java2Http(String str) {
  String result = str.replaceAll("\r\n|\r|\n|\n\r", "<br>");
  return result;
}

 

이건 엔터키 처리가 필요없는 input 대신 textarea 쪽에 처리

BoardController 에서 마지막 DTO 가 전달되어 Controller 에서 처리

int reNo = util.str2Int(no);
if (reNo != -1) {
  BoardDTO boardDTO = boardService.detail(reNo);
  boardDTO.setBoard_content(util.java2Http(boardDTO.getBoard_content()));
  model.addAttribute("detail", boardDTO);
  if (boardDTO.getComment() > 0) {
    List<CommentDTO> commentList = boardService.commentList(reNo);
    model.addAttribute("comment", commentList);
  }
return "detail";

 

Login 을 시도하고 로그인 실패 시 시도한 ID 의 시도횟수 늘리기

먼저 DB 에 count 칼럼 추가

 

이후 mapper 에 update 추가하기

<update id="countUp" parameterType="loginDTO">
  update member set mcount = mcount + 1
  where mid=#{mid}
</update>

 

로그인 시 count 늘리는 것 추가하기, dto 는 로그인 시도 시 id, pw 조회하는 dto

loginService.countUp(dto);

return loginRepository.countUp(dto);

return sqlSession.update("login.countUp", dto);

 

로그인 성공 시 count 수 초기화 하는 작업 수행

<update id="countReset" parameterType="loginDTO">
  update member set mcount = 0 where mid=#{mid}
</update>

 

board.jsp 에 글 쓸때 summernote 추가하기

부트스트랩 5버전과 충돌나니 꼭 이 블로그를 보고 진행할 것

 

부트스트랩 5버젼과 섬머노트 부트스트랩 4버젼 충돌 해결

아래 포스트 참고하여 섬머노트 라이트 버젼을 설치하면 충돌이 해결된다. https://programmer93.tistory.com/27 Summernote 사용법 , 썸머노트 사용법 - 삽질중인 개발자 - 썸머노트사용법 정리 - 홈페이지에

late90.tistory.com

 

화이팅

'Spring' 카테고리의 다른 글

240223 스프링 프로젝트  (0) 2024.02.23
240222 스프링 프로젝트  (0) 2024.02.22
240220 스프링 프로젝트  (0) 2024.02.20
240219 스프링 프로젝트  (0) 2024.02.19
240216 스프링 프로젝트  (2) 2024.02.16