본문 바로가기

컴퓨터학원(복습)(수료)

자바(JAVA)기반 안드로이드 웹&앱 개발 67일차 (평가 2일차)

평가 2일차입니다.

평가항목은 이렇습니다.

https://blog.naver.com/tnwnsrla/222373923949

1. 63일차에 작성한 쇼핑몰관리자 애플리케이션(서블릿으로 구현)을

MVC2(핸들러, Controller URI, property) 로 만들기 (하는 방법 배웠음.)

2. 게시글 리스트 페이징 처리 기능 제공 (배우지 않은 내용..^^)

- 한 페이지의 10개의 게시글을 보여주어야 함

- 보여지는 페이지의 개수는 10개로 한다.

- 페이징 처리기능이 잘 동작하는지 확인하기 위하여 게시글은 100개이상 등록되어야 한다.

3. 비밀번호를 암호화 하여 저장 (배우지 않은 내용..^^)

- 암호화되지 않은 비밀번호를 암호화하여 저장하는 기능을 구현

- 암호화 한 회원리스트를 /cryptPasword.do(구현)

- 회원가입 시 비밀번호를 암호화하여 저장

- 로그인 시, 사용자가 입력한 비밀번호와 데이터베이스에 저장된 비밀번호를 비교하여 인증

- 암호화는 SHA256 과 BCrypt 함수를 사용하여야 한다.

4. 관리자로 로그인하면, 상품 리스트 보기 메뉴가 보여야 한다.

공통사항 : 메뉴 체계 및 레이아웃이 통일되면 더욱 좋음

[문제 1번 MVC2 풀이]

제가 한거라 정답이 아닐 수 있습니다.

1. property 에서 해당 주소들을 추가한다.

2. 기존 서블릿들을 지우고 Handler 로 변환한다.

ProductDeleteHandler.java

ProductListHandler.java

ProductUpdateHandler.java

ProductWritehandler.java

1) 기존 서블릿과의 차이점은 Requestdispatcher가 사라졌다는 것입니다.

각 서블릿(Delete, List, Update, Write)에 모두 동일한 기능(RequestDispatcher)가 있으므로 이것을

ControllerUsingURI 라는 클래스에 다 처리하게 하여 Handler 들에는 get과 post로 가져오는

데이터, 파라미터들을 다루기만 하는 것입니다.

2) 하면서 갑자기 든 생각은 왜 이렇게 할까입니다..? 유지보수의 측면일까요? 효율의 측면일까요?

좀 찾아봐야 할 것 같습니다. 개인적인 생각으로는 URI를 처리하는 클래스가 하나이기 때문에 URI 관련해서는

프로퍼티와 ControllerUsingURI 클래스를 수정하면 되고, 데이터 관련해서는 핸들러 혹은 DAO를 건드리면

되는 간단함? 이지 않을까 싶습니다. 어떤 오류가 났을 때 어디를 찾아가야 하는 명확성..?

[2번은 어려워서 나중에 풀었고.. 마지막에 하겠습니다. 또 구글링해서 어찌어찌한거라.. 저도 코드를 하나하나 봐야됩니다.]

[3번 암호화 문제풀이 - 치명적인 오류의 발견..]

1. 널리 사용되는 BCrypt.java 클래스와 SHA256.java 클래스를 패키지에 import 합니다.

(API 느낌인거같습니다.)

2. MemberDAO(회원들의 데이터에 접근하는 클래스).java의

userCheck(), insertMember(), updateMember()에서 pwd(패스워드)를 암호화로 감싸줍니다.

1) userCheck() 메소드를 암호화하지 않으면, insertMember()에서 암호화하여 회원가입 한 사람이

로그인 할 수 없더군요. 그래서 같이 암호화 하였습니다.

2) 그런데 이렇게 해버리니까, 또 기존에 회원가입하고 암호화를 하지 않은 가입자들은 로그인이 안되더군요..

거참 ㅠ.ㅠ

3) updateMember()는 작동하지 않습니다. 즉, 회원정보 업데이트가 안되는 것입니다. 암호화를 걸었는데,

해당 문구 sha.getSah256(org.Pass.getBytes()); 에서

java.lang.IllegalArgumentException: Invalid salt version 오류가 나면서 받아들이질 못하는건지,

콘솔로 찍어보니까 int x = 0; 으로 나와버리면서 회원정보 수정실패가 나오는데.. 잘 모르겠습니다.

insertMember()

userCheck()

updateMember()

[4번-관리자에게 상품리스트 보이기]

1. main.jsp에서 로그인 유저의 Grade 등급에 따라 보여주는 화면을 <c:if > 태그로 달리한다.

1) grade 가 0이면 일반사용자, grade가 1이면 관리자입니다.

2) <c:if test="${loginUser.grade == 0"> 은 grade가 0(일반사용자)이면

로그아웃, 회원정보변경, 게시글 리스트만 보이게 하라는 의미입니다. 즉 자바의 if 문과 똑같습니다.

3) loginUser 는 LoginHandler.java 에서 session.setAttribute("loginUser", mVo); 로 전달하고 있습니다.

main.jsp

[ 2번- 게시판 페이징]

이거는 솔직히.. 혼자 못했습니다. 구글링하면서.. 사람들과 얘기하면서.. 따라했습니다.

그래서 저도 여기서 정리하면서 코드를 이해해보겠습니다.

https://cbts.tistory.com/294?category=651229

[JSP] 페이징(Paging) ① [11월28일]

(결과적으로 띄우고 싶은 화면!) 회원 리스트 밑에 페이지가 추가된 것을 볼 수 있음. 이번에 사용한 project의 모든 파일 일람표. 똑같은 내용에 프로젝트명만 L16Model2Paging으로 하면됩니다! 원래 프로젝트..

cbts.tistory.com

1. Paging.java를 구현한다.

1) 변수

(1) int page = 1; 은 현재 페이지 (get) 을 의미합니다.

(2) int totalCountl; 는 row 전체의 수(get) 을 의미합니다.

(3) int beginPage; 는 출력 시작(처음 페이지)을 의미합니다.

(4) int endPage; 출력 끝(끝 페이지)을 의미합니다.

(5) int displayRow = 10; 한 페이지에 몇개의 로우(10개의 게시물)를 나타낼지를 의미합니다. (선택 set)

(6) int displayPage = 10; 한 페이지에 몇 개의 페이지(1~10페이지)를 나타낼지 선택하는 것입니다.

(선택 set)

(7) boolean prev; // prev(이전) 버튼이 보일건지(true) 안보일건지(false)를 의미합니다.

(8) boolean next; // next(다음) 버튼이 보일건지(true) 안보일건지(false)를 의미합니다.

2) paging()

(1) endPage(끝)은 10이 나와야 합니다. 제가 보고있는 페이지가

1~10페이지 사이이면, 페이지 목록에는 1,2,3,4,5,6,7,8,9,10 이 보여야하고

11~20페이지 사이이면, 페이지 목록에는 11,12,13,14,15,16,17,18,19,20이 보여야 합니다.

page 변수와, displayPage 변수를 활용합니다. displayPage 변수는 10으로 고정입니다.

변하는 수는 내가 보고 있는 page 변수밖에 없습니다.

page를 displayPage로 나눈다면

page / displayPage = endPage

1 / 10 = 0

2 / 10 = 0

3 / 10 = 0

4 / 10 = 0

5 / 10 = 0

6 / 10 = 0

7 / 10 = 0

8 / 10 = 0

9 / 10 = 0

10 / 10 = 1 입니다.

다른 페이지를 볼 때는 정상적이지만, 10페이지를 보고 있을때는 1이되어 결과가 다릅니다.

이런상황을 위해 을 하고 ceil()메소드를 사용해서 '올림'을 합니다.

1 / 10 = 0.1 (올림 = 1)

2 / 10 = 0.2 (올림 = 1)

3 / 10 = 0.3 (올림 = 1)

4 / 10 = 0.4 (올림 = 1)

5 / 10 = 0.5 (올림 = 1)

6 / 10 = 0.6 (올림 = 1)

7 / 10 = 0.7 (올림 = 1)

8 / 10 = 0.8 (올림 = 1)

9 / 10 = 0.9 (올림 = 1)

10 / 10 = 1 (올림 = 1) 입니다. 여기에 displayPage를 곱하면 모든 결과는 10입니다.

endPage = Math.ceil(page/displayPage) * displayPage

(2) beginPage는 endPage가 10이 나올때는 항상 1이 나와야 합니다.

즉, beginPage = endPage - (displayPage - 1)라고 하면됩니다.

(3) totalPage는 게시판에 총 몇개의 페이지가 필요한지를 넣어놓을 변수입니다.

그러기 위해서는 레코드의 총 갯수 totalCount(게시판의 총 갯수)를 알아야 합니다.

예를 들어, totalCount가 341 이라면, 10개씩 표시되는 페이지 34개, 1개가 표시되는 페이지 1개로

총 35페이지가 되어야 합니다.

즉, totalPage(총 페이지)는 totalCount(341)을 10으로 나눈 34.1을 '올림'해준 값인 35가 되는 겁니다.

totalPage = Math.ceil( totalCount / displayRow ) 입니다.

displayRow(10) 이지만, displayRow 의 숫자를 바꿔준다면 totalPage를 계산할 수 있게 됩니다.

(4) next(다음) 와 prev(이전) 은 표시(true)와 표시하지 않음(false)로 존재합니다.

ㄱ) next 가 표시되는 경우의 수는 예를 들어, 총 341개의 게시판이 존재해서 35page 까지 표시되어야 할 경우

1 ~ 10 page > 표시됨 (true)

11 ~ 20 page > 표시됨 (true)

21 ~ 30 page > 표시됨 (true)

31 ~ 40 page > 표시되지 않음 (false)

입니다. 여기에서의 totalPage 는 35, endPage 는 10, 20, 30, 40 입니다.

totalPage(35) > endPage(10) = true

totalPage(35) > endPage(20) = true

totalPage(35) > endPage(30) = true

totalPage(35) > endPage(40) = false 입니다.

if(endPage > totalPage) {

endPage = totalPage; // endPage에 totalPage를 넣어서 40까지 안뜨고 35까지만.

next = false; // next 가 보이지 않게

} else {

next = true; // next 가 보이게

} 로 하면 됩니다.

ㄴ) prev는 현재 보는 페이지가 1~10페이지가 아니면 무조건 표시됩니다.

if( beginPage == 1) {

prev = false;

} else {

prev = true;

} 로 표현할 수 있고 이거를 삼항 연산자로

prev = (beginPage == 1)?false:true; 로 표현한 것입니다.

3) paging() 호출

(1) 생성한 getter / setter 중에서 totalCount의 setter 인 setTotalCount() 메소드는 페이징을 하기 위해서

반드시 호출되어야 하는 메소드이기 때문에 이 메소드 안에서 paging() 메소드를 호출하면 됩니다.

Paging.java (1)

Paging.java (2)

추후 내용은 주말에 올리겠습니다. 따라 적으면서 하니까 이해가 되네요!!

------- 추후 내용 이어서

2. BoardDAO.java 에서의 selectAllBoards() 메서드를 수정합니다.

1 ) 기존의 selectAllBoards() 메소드는 DB의 게시판 정보들만 가져오는 기능만 있었는데,

웹페이지에서 한 페이지당 10개까지만 가져와야 하므로, 그에 맞는 SQL 문을 수정합니다.

https://cbts.tistory.com/295?category=651229

[JSP] 페이징(Paging) ② [11월28일]

앞 포스팅에서 만든 Paging.java를 이용해서 실제로 페이징을 적용시켜보겠습니다.. 우선은 앞서 만들어 둔 MemberDao.java의 selectAllMember() 메소드를 수정해야 합니다. 수정하기 전 원래 selectAllMember()..

cbts.tistory.com

2) 여기 올리신분은 오라클 전용이고 저는 mySQL 이라서 SQL에 맞게 변형했습니다.

BoardDAO.java 의 selectAllBoards()

(1) "select * FROM board order by num desc LIMIT ?, ? ";

ㄱ) preparedStatement 를 사용하기 때문에 ?, ? 를 사용하였고 파라미터로

첫번째 ? 에 startNum = (page - 1) * 10;

두번째 ? 에 10 으로 고정을 하였습니다. (10으로 안주니까 2페이지에서는 20개, 3페이지에서는 30개

나오더군요.)

https://nolran.tistory.com/57

[MySQL] Limit 사용법

//아래 예는 5개 가져오기 SELECT * FROM [TABLE NAME] LIMIT 5; // LIMIT 시작점, 갯수 (아래 예의 경우 5번째부터 10개 추출. 첫번째 파라미터는 0 부터 시작함!) SELECT * FROM [TABLE NAME] LIMIT 4, 10;

nolran.tistory.com

ㄴ) 즉 page 가 1일 때 startNum 은 0이므로 첫번째 sql 이 실행될 때는

select * FROM board order by num desc LIMIT 0, 10; 이 되므로 0부터 10개까지가 나옵니다.

page가 2일 때 startNum은 1이므로 두번째 sql 이 실행 될때는

select * FROM board order by num desc LIMIT 10, 10; 이 되므로 10부터 20개까지가 나옵니다.

(limit A, B 는 A 번째부터 B 개 추출 한다는 의미입니다. 위 링크 참조)

※ 이거는 제가 어떻게든 해보고 싶어서 만든 쿼리문인데, 실행하면 되긴 하더라구요.. 근데 좋은 sql 문은 아닌거같습니다 ㅎㅎ.

SELECT * FROM (SELECT * FROM ( SELECT @ROWNUM:=@ROWNUM+1 as row_num, board.* FROM board, (SELECT @ROWNUM := 0)as C) as B WHERE row_num >= ?) as A WHERE row_num <= ?

ㄷ) selectAllBoards 에서 int page 매개변수는 BoardListHandler 에서 1로 시작하고 있고. boardList 에서

page를 올려주고 있습니다.(3번 사항에 나옵니다.)

3. BoardListHandler.java 에서 "GET"을 해오는 processFrom() 메소드를 수정합니다. ( ㄷ)과 연관)

https://cbts.tistory.com/296?category=651229

 

[JSP] 페이징(Paging) ③ [11월28일]

앞서 만들어 본 쿼리문을 MemberDao.java의 selectAllMember() 메소드에 적용시켜 보겠습니다. MemberDao.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 3..

cbts.tistory.com

BoardListHandler.java

1) 첫 게시판을 보여줘야 하기 때문에 int page = 1; 로 설정합니다.

2) 클라이언트가 요청한 page 파라미터가 null 값이 아니라면 page 변수에 클라이언트가

요청한 파라미터 값을 지정하기 위해서 if 문을 설정합니다.

3) Paging.java의 객체를 생성해주고 Paging.java 의 변수를 if 문의 getParameter(page)파라미터 변수로

set 해줍니다.

4) 전체 레코드의 갯수를 set 해주기 위하여 paging.java 의 dao.getAllCount() 를 count 변수에 넣어

setTotalCount를 해줍니다. ( 이 부분은 뒤에서 설명하겠습니다.)

5) paging 이라는 이름으로 paging 객체의 파라미터 값을 설정해주어 BoardList로 보내줍니다.

4. BoardList.java 에 페이징을 넣어주는 부분을 추가해줍니다.

(저는 Paging.jsp 를 만드는 것이 나을 거라 생각합니다. 다른 페이지에서 이 기능을 쓸 수도 있으니까요.

블로그에서도 그렇게 쓰셨지만, 저는 빨리 하느라 BoardList.jsp 에 넣었습니다.)

boardList.jsp 추가부분

1) var="action" value="/board/list.do" 는 value 경로로 action 이라는 변수명으로 세팅하는 것입니다.

2) <c:if test="${paging.prev}"> 는 prev 라는 파라미터가 true 라면 prev를 표시하겠다. 그리고 이것을 클릭하면

${action}?page=${paging.beginPage -1} 로 이동시키겠다. (/board/list.do?page=beginPage-1)

3) 밑에 ${paging.next} 도 동일합니다.

4) <c:forEach begin="${paging.beginPage}" end="${paging.endPage}" step="1" var="index"> 는

beginPage 에서부터 endPage 까지 반복문을 돌며 표시하겠다는 것입니다.(1~10)

5) <c:when teset="${paging.page=index}"> ${index} 는 현재 보고 있는 페이지는 링크를 삭제하고 단순히

숫자만 표시하겠다는 의미입니다.

6) <c:otherwies> 부분은 현재 보고 있는 페이지가 아니라면 페이지에 링크를 부여하겠다 입니다.

5. BoardDAO.java 에 getAllCount() 메소드를 생성합니다. (3.의 4) 사항을 위함)

https://cbts.tistory.com/297?category=651229

[JSP] 페이징(Paging) ④ [11월 30일]

이번에는 저번 게시물에서 임의로 지정해 주었던 totalCount(총 게시물의 갯수)를 DB에서 불러오는 메소드와 쿼리문을 작성해 보겠습니다. MemberListController.java 1 2 int count = dao.getAllCount(); pagi..

cbts.tistory.com

1) Board 테이블의 레코드 갯수를 count 해서 받아오는 메소드입니다.

※ 제가 참조한 블로그에서는 selectAllMember() 메소드에 startNum 과 endNum을 수정해주었지만, 저는 오류가 나더군요..(SQL 문이 달라서 그런가..) 그래서 해당부분은 하지 않았습니다.

여기까지가 페이징입니다.