본문 바로가기

Spring

240222 스프링 프로젝트

써머노트,, 나는 왜 글꼴 선택이 안될까...

일단 해결해보는중..

 

<script src="/resources/summernote/summernote-lite.js"></script>
<script src="/resources/summernote/lang/summernote-ko-KR.js"></script>
<link rel="stylesheet" href="/resources/summernote/summernote-lite.css">
<!-- <script src="/resources/summernote/summernote-bs4.min.js"></script> -->
<!-- <link href="/resources/summernote/summernote-bs4.min.css" rel="stylesheet"> -->

 

이 파일들을 주석 처리하는 것으로 해결

 

게시글 조회 시 조회수 오르기

BoardService 쪽에 mid 와 board_no 를 담아 boardCountUp 이라는 메소드 생성

public BoardDTO detail(int no) {
  // 로그인 한 사용자면 조회수 올리기
  if (util.getMid() != null) {
    BoardDTO dto = new BoardDTO();
    dto.setBoard_no(no);
    dto.setMid(util.getMid());
    boardRepository.boardCountUp(dto);
  }
  return boardRepository.detail(no);
}

 

해서 mybatis 에서 처리해보기

<insert id="boardCountUp" parameterType="boardDTO">
  <selectKey keyProperty="board_count" resultType="Integer" order="BEFORE">
    select count(*) as board_count from visitcount
    where board_no=#{board_no} and mno=(SELECT mno FROM member WHERE mid=#{mid})
  </selectKey>
  <choose>
    <when test="board_count == 0">
      insert into visitcount (board_no, mno)
      values (#{board_no}, (SELECT mno FROM member WHERE mid=#{mid}))
    </when>
    <otherwise>
      select 0 from dual
    </otherwise>
  </choose>
</insert>

 

조회한 적이 없으면 조회수 증가인데 0 이 아니면 이라는 조건이 없으니 오류 발생

결국 아무것도 하지 않는 쿼리문으로 땜빵..

 

댓글 좋아요 만들기

댓글에 하트 아이콘 생성

<i class="xi-heart-o" onclick="clikeUp(${comment.no})"></i>${comment.clike }

 

클릭 시 좋아요 수 올리기

function clikeUp(cno) {
  location.href="./clikeUp?bno=${detail.board_no}&cno=" + cno;
}

 

BoardController 에서 잡기

@GetMapping("/clikeUp")
public String clikeUp(@RequestParam("bno") String bno, @RequestParam String cno)

 

들어온 값이 int 타입이 맞는지 체크하기

if (util.intCheck(bno) && util.intCheck(cno)) {


들어온 값이 맞으면 통과해서 dto 에 세팅 후 값 넘기기

if (util.intCheck(bno) && util.intCheck(cno)) {
  CommentDTO dto = new CommentDTO();
  dto.setBoard_no(util.str2Int(bno));
  dto.setNo(util.str2Int(cno));
  int result = boardService.clikeUp(dto);

 

쭉 가서 넘기고 board-mapper 설정하기

<update id="clikeUp" parameterType="commentDTO">
  <![CDATA[
    update comment set clike = clike + 1 
    where board_no = #{board_no} and cno = #{no}
  ]]> 
</update>

 

값을 다시 돌려받아 정상 작동 시 페이지 새로고침하기

int result = boardService.clikeUp(dto);
if (result == 1) {
  String referer = util.req().getHeader("Referer");
  return "redirect:"+ referer; }
else {
  return "redirect:/error";
}

 

페이지 새로고침 말고 댓글 시작점으로 가고싶으면

이렇게 원하는 위치의 id 값을 넣어줌

return "redirect:/detail?no=" + bno + "#commentHr";

 

myInfo 만들기, 책 366p, 376p

menu.jsp 에서 myInfo 들어갈 때 이제 id 값도 같이 넣어줌

<a class="nav-link" href="./myInfo@${sessionScope.mid }">${sessionScope.mname } 님</a></li>

 

Controller 에서 id 값을 받아 변수로 사용할 수 있음

@GetMapping("/myInfo@{id}")
public String myInfo(@PathVariable("id") String mid) {
  System.out.println("mid" + mid);
  return "myInfo";
}

 

정상 작동 확인

 

 

[Spring Boot] @PathVariable 사용법

Request가 들어오는 타입에 따라 ... 받는 방법을 크게 4가지 정도로 나눠서 앞으로 하나씩 살펴보자. URL 변수 (@PathVariable) Query String (@RequestParam) Body Form @PathVariable 이란? REST API에서 URI에 변수가 들

so-easy-coding.tistory.com

 

이제 이메일 보내보기, pom.xml 에 해당 라이브러리 추가

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-email -->
<!-- 메일 보내기 -->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-email</artifactId>
  <version>1.5</version>
</dependency>

 

Controller 에 myInfo 메소드 만들기

@GetMapping("/myInfo@{id}")
public String myInfo(@PathVariable("id") String mid) throws Exception {
    
  // 메일 보내기
  String emailAddr = "-----@outlook.kr";
  String name = "-----";
  String passwd = "-----";
  String hostName = "smtp-mail.outlook.com";
    
  // 포트 번호
  int port = 587;
    
  // 이메일 보내기
  SimpleEmail simpleEmail = new SimpleEmail();
  simpleEmail.setCharset("utf-8");
  simpleEmail.setDebug(true);
  simpleEmail.setHostName(hostName); // 보내는 서버 설정
  simpleEmail.setAuthentication(emailAddr, passwd); // 보내는 사람 인증
  simpleEmail.setSmtpPort(port); // 사용할 포트번호
  simpleEmail.setStartTLSEnabled(true); // 인증방법
  simpleEmail.setFrom(emailAddr, name); // 보내는 사람 mail, 보내는 사람 이름
  simpleEmail.addTo("ppj2130@gmail.com"); // 받는 사람
  simpleEmail.setSubject("인증번호"); // 제목
  simpleEmail.setMsg("인증번호 1234"); // 내용
  simpleEmail.send(); // 보내기
    
  return "myInfo";
}

 

이메일 보내는 것을 util 로 보낸 다음 우리는 util.sendEmail 식으로만 보낼 수 있게 처리

주석을 이용하여 추후 사용 시 가독성을 늘릴 수 있게 처리

// 메일 보내기
/**
 * @param email {@code String} 받을 이메일 주소
 * @param key {@code String} 인증번호
 * @throws EmailException
 */
public void sendEmail(String email, String key) throws EmailException {
  String emailAddr = "-----" // 보낼 이메일 주소
  String name = "-----"; // 보내는 사람
  String passwd = "-----"; // 비밀번호
  String hostName = "smtp-mail.outlook.com"; // 이메일 host 주소
    
  // 포트 번호
  int port = 587;
    
  // 이메일 보내기
  SimpleEmail simpleEmail = new SimpleEmail();
  simpleEmail.setCharset("utf-8");
  simpleEmail.setDebug(true);
  simpleEmail.setHostName(hostName); // 보내는 서버 설정
  simpleEmail.setAuthentication(emailAddr, passwd); // 보내는 사람 인증
  simpleEmail.setSmtpPort(port); // 사용할 포트번호
  simpleEmail.setStartTLSEnabled(true); // 인증방법
  simpleEmail.setFrom(emailAddr, name); // 보내는 사람 mail, 보내는 사람 이름
  simpleEmail.addTo(email); // 받는 사람
  simpleEmail.setSubject("인증번호"); // 제목
  simpleEmail.setMsg("인증번호는 " + key + " 입니다."); // 내용
  simpleEmail.send(); // 보내기
}

 

key 를 만드는 util 도 하나 생성

밀리초를 seed 로 넣어 난수를 생성하는 코드, 항상 다른 값이 들어가니 거의거의 다른 값이 항상 나옴

public String createKey() {
  Random random = new Random(System.currentTimeMillis());
  return "" + random.nextInt(10) + random.nextInt(10) + random.nextInt(10) + random.nextInt(10) + random.nextInt(10);
}

 

@RestController 라는 애노테이션을 넣으면 비동기 통신 전용으로 사용할 수 있음

내부 메소드의 @Responsebody 는 빼도 됨

@RestController // 비동기 통신 전용 Controller
public class RestFullController {

 

RestService 생성하기

@Service
public class RestService {
  
  @Autowired
  private RestRepository restRepository;
  
  @Autowired
  private Util util;
  
  public int sendEmail() {
    if (util.getMid() != null) {
      // 메일 발송 및 key 저장하기
      String email = getEmail((String) util.getMid());
      String key = util.createKey();
      System.out.println(key);

      MemberDTO dto = new MemberDTO();
      dto.setMemail(email);
      dto.setMkey(key);
      dto.setMid(util.getMid());

      setKey(dto);
      
      // util.sendEmail(email, key);
      return 1;
    } else {
      return 0;
    }
  }
  
  public String getEmail(String mid) {
    return restRepository.getEmail(mid);
  }

  public int setKey(MemberDTO dto) {
    return restRepository.setKey(dto);
  }
}

 

RestRepository 생성

@Repository
public class RestRepository {

  @Autowired
  private SqlSession sqlSession;
  
  public String getEmail(String mid) {
    return sqlSession.selectOne("rest.getEmail", mid);
  }

  public int setKey(MemberDTO dto) {
    return sqlSession.update("rest.setKey", dto);
  }
}

 

rest-mapper 새로 생성 후 설정

<mapper namespace="rest">
  <select id="getEmail" parameterType="String" resultType="String">
    select memail from member where mid = #{mid}
  </select>
	
  <update id="setKey" parameterType="memberDTO">
    update member set mkey = #{mkey} where mid = #{mid} and memail = #{memail}
  </update>
</mapper>

 

DB 에 key 값이 제대로 저장되는지 확인

정상 저장 확인

 

ajax 로 값 처리하는 것 확인

function emailAuth() {
  $.ajax({
    url : './emailAuth',
    type : 'post',
    dataType : 'text', // 수신 값
    success : function(result) {
      if (result == 1) {
        Swal.fire({
          title : "인증번호를 발송했습니다.",
          showConfirmButton : false,
          icon : "success",
          timer : 1500
        });
      } else {
        Swal.fire({
          title: "문제가 발생하였습니다.",
          showConfirmButton : false,
          icon : "warning",
          timer : 1500
        });
      }
    },
    error : function(request, status, error) {
      Swal.fire("에러요", "", "error");
    }
  });
}

 

 

'Spring' 카테고리의 다른 글

240226 스프링 프로젝트  (2) 2024.02.26
240223 스프링 프로젝트  (0) 2024.02.23
240221 스프링 프로젝트  (2) 2024.02.21
240220 스프링 프로젝트  (0) 2024.02.20
240219 스프링 프로젝트  (0) 2024.02.19