국비과정/Spring

20230817 _[52일차]_01. 스프링부트 암호화 & MultiBoard 페이지

phyho 2023. 8. 17. 20:56

암호화 이어서

 

아래처럼 쿼리문 작성해주면 member 테이블의 모든 pw가 암호화된다.

(뒤에 붙은 'PYO'는 키값으로 기억해둬야 암호화 해제가 가능)

 

UPDATE members SET m_pw=HEX(AES_ENCRYPT(m_pw, 'PYO'))

암호화 시킨 pw를 풀려면

SELECT AES_DECRYPT(UNHEX(m_pw), 'PYO'), m_name
FROM members WHERE m_id='pororo'

 

 

 

SELECT COUNT(*) AS COUNT, m_name
FROM members
WHERE m_id='pororo'
AND AES_DECRYPT(UNHEX(m_pw), 'PYO') = '01234567'

 

** 키값을 id로 준다면 더 기억하기가 쉽다.

 

현재 모든 pw가 암호화 되어 있으니 mapper에서 쿼리문을 수정해주자.

아래 쿼리문에서는 입력값과 일치하는 id와 pw가 db에 있다면 결과값 1을 불러왔는데 

현재 pw가 암호화 되어 있으니 비교할수가 없다.

아래처럼 쿼리문을 수정해주면

입력한 pw와 암호화가 풀린 pw를 비교할 수 있다.  

로그인 해봤더니 잘된다.


multi board 를 만들어보자

메뉴바에 multi board 추가해주고 controller도 만들어준다.

 

menu.jsp도 만들어준다. (board.jsp에서 style과 table head 부분 가져와준다.)

 

상단에 함수사용을 위한 선언해주고 

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

 

list의 길이를 뽑아내보자


list는 아래 쿼리문을 실행시켜 map으로 받아온 값이다. 


list의 길이값이 0이다.

list의 길이값이 0보다 큰지에 대해 false를 반환한다. 이걸 조건문에 넣어주면

${ fn:length(list) gt 0}   => 꺽쇠괄호보다는 gt를 사용하자~

글이 있을때만 게시판 글이 나오도록 해주고 

글이 없을때는 '게시판에 글이 없습니다' 문구가 출력된다.

현재는 게시판 글이 없으니 아래처럼 나온다.


이제 multiboard에 띄울 글을 만들러 가자 (db에 데이터를 만들예정)

 

하이디가서 multiboard 테이블 생성 및 필드값설정

m_no는 외래키로 설정해서 member 테이블과 연결

데이터 추가 

이 데이터를 게시판에 불러와보자

 

public String multiboard(@RequestParam(value = "board", required = false, defaultValue = "1") int board) { }

board 라는게 들어와야 하는데 

required는 false로 필수는 아니고,

안들어온다면 defaultValue는 1로 잡을거라는 뜻

이제 MultiBoardService를 만들어주자

MultiBoardDAO 도 생성

MultiBoardMapper 도 생성하고 MultiBoardDAO 와 연결 

이제 게시판 데이터를 Map 타입인 List에 담아서 Model에 붙인 후 jsp로 내보낼 예정


mapper 파일 열때 아래껄로 열어야 된다. 까먹지말기


아래와 같이 값들을 list에 담아서 가져올건데 쿼리문을 다시 수정해서 필요한 값들만 불러와보자

 

 

순서대로

글번호, 제목, 글쓴이, 날짜, 조회수를 가져올거다.

글쓴이는 서브쿼리문으로 m_no를 비교해서 가져왔다.

multiboard.jsp도 살짝 수정해줬는데 

안뜬다 왜지

 


cloudtype 과 내가 사용하는 디비와 연결해보자

위의 주소 복사해와서 새로운 서버 생성

 

연결완료되면 db정보 변경해주기


하이디에서 multiview만들고

select `b`.`mb_no` AS `mb_no`,`b`.`mb_title` AS `mb_title`,`b`.`mb_content` AS `mb_content`,

if(date_format(current_timestamp(),'%Y-%m-%d') 

= date_format(`b`.`mb_date`,'%Y-%m-%d'),

date_format(`b`.`mb_date`,'%H:%i'),

date_format(`b`.`mb_date`,'%m-%d')) AS `mb_date`,

`b`.`mb_read` AS `mb_read`,`b`.`mb_del` AS `mb_del`,`b`.`mb_board` AS `mb_board`,

`b`.`m_no` AS `m_no`,`m`.`m_id` AS `m_id`,

`m`.`m_name` AS `m_name`

from (`multiboard` `b` join `members` `m` on(`b`.`m_no` = `m`.`m_no`))

where `b`.`mb_del` = 1

 


multiboard.jsp는 아래처럼 정리해줬다.

<header class="masthead">
            <div class="container">
               <h1>멀티 보드</h1>
              
               
               <c:choose>
                     <c:when test="${ fn:length(list) gt 0}">
                     <table class="table table-dark table-hover table-striped">
                     <thead>
                     <tr class="row">
                        <th class="col-1">번호</th>
                        <th class="col-5">제목</th>
                        <th class="col-2">글쓴이</th>
                        <th class="col-2">날짜</th>
                        <th class="col-1">읽음</th>

                     </tr>
                     </thead>
                     
                     <c:forEach items="${list }" var="list">
                     
                        
                     <tr class="row detail">
                        <td class="col-1">${list.mb_no}</td>
                        <td class="col-5 title">${list.mb_title}<c:if test="${row.commentcount ne 0 }">&nbsp;<span class="badge bg-secondary">${row.commentcount}</span></c:if></td>
                        <td class="col-2">${list.mb_name}</td>
                        <td class="col-2">${list.mb_date}</td>
                        <td class="col-1">${list.mb_read}</td>
                     
                     </tr>
          
                        <tbody>
                     
                     
                  
                     </c:forEach>
                     </tbody>
               </table>
                     </c:when>
                     <c:otherwise>
                     <h1>게시판에 글이 없습니다.</h1>
              
                     </c:otherwise>
                     </c:choose>
               
               <button type="button" class="btn btn-secondary" onclick="location.href='./write'">글쓰기</button>
            </div>
        </header>

쿼리문은 이렇게 해줬더니

글을 잘 불러온다.

 

글쓰기 버튼에 이렇게 설정해주면

param객체 이용해서 URL의 board번호를 잡아왔다.  ${param.파라미터명}  

 

100번째 주소로 가보면 당연히 게시글은 없고 여기에서 글쓰기를 눌러보면

설정해준 주소로 넘어간다.


이제 컨트롤러에서 mbwrite로 넘어가는 로직 만들어주자 (글쓰기 파트 만들자)

로그인했으면 mbwrite 페이지로 넘어가고 

아니라면 로그인 페이지로 넘어가도록 해준다.

로그인 안한경우 아래처럼 가도록 설정해주면

return "redirect:/login?error=login"

멀티보드에서 글쓰기를 누르면 로그인창으로 넘어가면서 주소창에 error가 표시되도록 해준거다. 

이제 여기에 기능을 줘보자.

 ${param.파라미터명}  

url중에 error가 포함되어 있다면 아래에서 param으로 잡아서 팝업이 뜨게 만들어준다.

 

이제 로그인 페이지에 '로그인 하세요' 라는 문구도 띄워줄건데

login.jsp에서

 

문구가 뜨는 조건에 대해서는 if문으로 아래처럼 넣어주거나

(error값이 'login'이라는 문자열과 같다면) 문구출력

 

아니면 요렇게 넣어준다.

(error값이 null이 아니라면) 문구출력

 

그러면 로그인 안한 상태에서 멀티보드-글쓰기를 눌러보면

팝업이 먼저 뜨고

'로그인 하세요' 멘트가 보인다.

 

자바 jstl이 가장 먼저 작동하고 그 다음에 html, css, jsp 등등 이 실행된다.

그래서 같은 param인 error에 대해서 jstl기능으로 만들어준 팝업이 먼저뜨고 

그 이후에 html과 css인가 실행되어 문구가 출력된다.


로그인 안한 경우에는 멀티보드의 글쓰기 버튼을 숨겨준다. 

 

 

이제 mbwrite.jsp를 만들어주자 ( write.jsp를 복사해서 형태는 그대로 가져와준다.)

아래 form을 전송하는 주소 수정해주고

input창도 추가 => hidden으로 board값을 value로 넣어준다.

 

 

일단 테스트용으로 input창을 text창으로 띄워서 확인해보면

아래처럼 값을 잘 잡아오는걸 알 수 있다.

 

이제 컨트롤러에서 저 form을 제출했을 때(저장 버튼을 눌렀을때) 작동하는 로직 만들어준다.

글을 쓰고 저장을 눌러보면

내가 쓴 글을 map으로 받아와서 콘솔창에 잘 출력이 된다.

 

그동안은 영향받은 행의 갯수를 int로 받아왔었는데

이제 mb_no(글번호)를 받아와보자

map을 매개변수로 가지는 mbWrite() 메소드를 서비스에 실행시킨다.

서비스에서도 mbWrite() 메소드를 DAO에 실행시킨다.

DAO에서도 mapper를 실행시킨다.

mapper에서 쿼리문은 콘솔창의 출력값을 참고해서 넣어준다.

넣어줄 값들의 key와 value를 잘 맞춰서 써준다.

 

'멀티보드-글쓰기'에서 글을 쓰고 저장버튼을 눌러보면

아래처럼 콘솔창에도 잘 출력이 되고

아직 mbwrite가 없어서 404에러가 뜨지만

글은 잘 저장이 된다.

 

이제 쿼리문에 selectKey 명령을 추가해줄거다.

order = "AFTER"로 주면 위의 쿼리문을 다 실행한 이후에 아래 쿼리문을 실행하겠다는 뜻이다.

실행결과 가져갈 값을 keyProperty로 설정해주고

아래 쿼리문까지 실행되면서 최종적으로 mb_no값을 받아 컨트롤러에서 처리할 예정 => 주소값으로 넣어준다.

이렇게 하고 글을 써보면 안된다. 왜냐하면 mb_no는 1이다!!!!

내가 원하는 값인 mb_no는 map안에 들어있으니 아래처럼 map에서 꺼내와줘야 한다.

그런데 redirect도 빼먹어서 다시 써주고

글을 쓰고 저장을 눌러보면 해당 글번호(mbno)를 가지고 잘 간다.


쿼리문을 다시 수정해주자.

서브쿼리문으로 실행했던 m_no를 가져오는 쿼리문을 BEFORE로 따로 작성해준다.

제일 먼저 실행되도록 하고 결과값인 m_no를 가지고 주 쿼리문 실행한다.

 

이럴수가 selectKey 는 중복이 안된단다. 

위의 방법은 참고만 하자.

 

다시 아래처럼만 해준다.


이제 글쓰기 완료되었으니까 mbdetail에 글을 띄워보자

 

mbno를 매개변수로 mbdetail() 메소드를 실행시켜서 

가져온 값을 detail이라는 이름으로 model 에 붙여서 mbdetail.jsp 페이지로 보낼예정

서비스에서도 mbno를 매개변수로 mbdetail() 메소드를 실행

DAO에서도 실행

 

이제 mapper에서 쿼리문 작성하자.

parameterType="java.lang.Integer"  요렇게 써주기도 한다. 안그래도 된다.

 

multiboard.jsp 에서 글을 누르면(tr을 누르면) 해당 mbno를 가진채로 detail로 이동하자