본문 바로가기

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

자바(JAVA)기반 안드로이드 웹&앱 개발 72일차 (스프링 기본적인 CRUD 이어서, 페이징처리(Spring+MySQL))

[목록(list)에서 버튼으로 등록화면(register) 가기]

1. list.jsp(목록)화면에 Button을 추가한 후, javascript(list.jsp)를 추가하여 버튼 동작처리를 합니다.

1) Button id="regBtn" 이므로 javacript 에도 #regBtn 으로 작성하여 click 하였을 때,

"/board/register"로 이동하게 합니다.

list.jsp 에 button 추가

list.jsp 에 javacript 추가

list.jsp 에 버튼과 javascript 를 추가하였을 때 생기는 버튼입니다.

해당 버튼을 누르면 http://localhost:8080/board/register 로 이동됩니다.

[조회 페이지(게시글 상세보기)로 이동하기]

1. BoardController.java 에 조회를 위한 /get 을 Mapping 합니다.

BoardController.java getMapping("/get"), bno 를 파라미터로 받습니다.

2. views/baord/get.jsp 를 생성하여 게시글 상세보기(get) 화면을 작성합니다.

(기존에 만들었던 register를 가져와서 내용만 바꿔주면 됩니다.)

1) list.jsp 에 ${board.title} 에 get으로 갈 수 있는 링크(<a> 태그를 달아줍니다.)

views/board/get.jsp

아직 list 에서 링크를 만들지 않았으므로 주소창에 파라미터를 직접 입력하여 화면결과를 확인하여봅니다.

[목록 페이지와 뒤로 가기 문제]

1. 목록에서 조회페이지로 이동하기 위해 list.jsp 에 {board.title}에 <a>태그로 '/board/get?bno'로

${board.bno}로 갈 수 있도록 링크를 달아줍니다.

list.jsp에 <a> 태그 추가

링크생성 확인

제목 눌렀을 때 이동 확인

2. 뒤로가기 문제

1) 게시글을 등록(등록페이지 register)하고 모달창이 나온 후에, 목록 페이지(list)에서 게시글을 조회(get)

하고 뒤로가기 버튼을 누르면 모달창이 다시 나오는 문제가 있습니다.

2) 뒤로가기 문제 해결방법

checkModal 로 처음에는 모달창이 표시된 후, history.replaceState()로 모달창(팝업창)이 띄우지 않도록

별표를 마크한다는 의미인 것 같습니다. 강사님도 이 부분 설명은 잘 이해가 안된다고 하셔서,

내용을 좀 찾아봐야겠습니다.

list.jsp 의 자바스크립트 부분에 밑줄부분을 추가하면 뒤로가기를 눌러도 모달창이 나오질 않습니다.(외워야 할 것 같네요..)

[게시물의 수정/삭제 처리]

1. 게시물 조회 이후 수정/삭제 페이지로 이동할 수 있어야 합니다.

2. 사용자의 선택에 따라서 작업을 처리할 수 있어야 합니다.

3. 수정/삭제는 POST 방식으로 처리합니다.

4. BoardController.java 에서 get 메서드를 수정합니다.

BoardController.java 에서 기존에 있던 get()메소드를 수정합니다. 배열형식으로 url을 받습니다.

5. views/board/modify.jsp 를 생성합니다. ( register.jsp를 복사해서 내용을 수정합니다.)

modify.jsp

게시글 보기(get.jsp)에서 Modify 버튼을 누르면

modify 로 잘 이동하는지 확인합니다.

6. Modify.jsp 에서 버튼(Modify, Remove, List)에 따라 다른 작동을 하기 위해 Modify.jsp에 자바스크립트를 작성합니다.

Modify.jsp 자바스크립트

7. 이제 작동이 잘 되는지 확인합니다. (결과사진은 생략합니다.)

[조회 페이지에서 <form> 처리]

1. <form>태그를 이용해서 수정/삭제 처리를 합니다. 확장성(페이징, 검색)을 위해서입니다.

1) get.jsp 를 <form> 처리합니다.

2) 각 버튼이 눌렸을 때의, 기능작동을 정의하기 위해 자바스크립트를 get.jsp에 작성합니다.

※ form 을 사용해서 처리하는게 확장성을 왜 의미하는지 찾아봐야겠습니다.

get.jsp <form> 처리 및 자바스크립트

[수정 페이지에서 리스트 페이지로 이동 처리]

1. 수정페이지에서 리스트 페이지로 이동 처리하기 위해 modify.jsp 의 javascript를 수정합니다.

modify.jsp

[페이징 처리 Spring + MySQL]

1. limit 속성을 이용합니다.

select * form tbl_board order by bno desc limit startNum, amount;

1) pageNum : 보여줄 페이지 번호입니다.

2) amount : 한 페이지에 보여줄 게시글의 수 (보통 10개로 합니다.)

3) startNum : 테이블에서 가져올 처음 열 번호 입니다.

(pageNum - 1) * amount

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

 

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

평가 2일차입니다. 평가항목은 이렇습니다. https://blog.naver.com/tnwnsrla/222373923949 1. 63일차에 작...

blog.naver.com

제가 평가 볼때 페이징을 참고했었는데, 그 개념과 똑같습니다!

[MyBatis와 스프링 페이징 처리]

1. 검색에 필요한 내용을 담는 Criteria 클래스를 생성합니다.

1) 검색에 사용되는 여러 종류의 데이터를 하나의 객체로 묶기 위한 용도입니다.

org.zerock.domain.Criteria.java

2. 테스를 하기 위해 BoardMapper.java 클래스에 메소드 추가, BoardMapper.xml 에 쿼리등록,

BoardMapperTests.java 에 테스트메소드를 추가합니다.

1) BoardMapper.java 에 getListWithPaging() 메소드와 BoardMapper.xml 에

select * from tbl_board order by bno desc limit #{pageStart}, #{amount} 를 입력합니다.

(1) #{pageStart}는 Criteria 의 getPageStart() 메소드를 의미하는데 쿼리문을 가져올 때,

get은 생략하고 P는 소문자로 바꿔줍니다.

BoardMapper.java , BoardMapper.xml

2) BoardMapperTests.java에 testPaging() 메소드를 추가하여 테스를 실행합니다.

BoardMapperTests.java

이제 실제로 비즈니스로직이 작동하는 Service 를 수정할 시간입니다.

1. BoardService.java (인터페이스), BoardServiceImpl.java (인터페이스를 구현한 클래스),

BoardServiceTests.java(테스트)를 수정합니다.

1) BoardService.java의 getList() 메소드를 Criterai 를 인자로 받을 수 있도록 수정합니다.

2) BoardServiceImpl.java 의 getList()도 마찬가지로 수정합니다.

BoardService.java , BoardServiceImpl.java

2. BoardController.java와 BoardControllerTests 자바를 수정합니다.

1) BoardController.java의 @getMapping list()를 Criteria cri 를 가져올 수 있도록 수정합니다.

2) BoardControllerTests.java 를 수정하여 잘 작동됨을 확인합니다.

BoardController.java @GetMapping list() 수정

BoardControllerTests.java

[페이징 화면 처리]

1. 페이징이 작동하는 단계적 과정은 다음과 같습니다.

1) 브라우저 주소창에서 페이지 번호를 전달해서 결과를 확인하는 단계

2) JSP에서 페이지 번호를 출력하는 단계

3) 각 페이지 번호에 클릭 이벤트 처리

4) 전체 데이터 갯수를 반영해서 페이지 번호 조절

예를 들어, 5p에 게시글을 조회하여, 수정하였거나, 삭제하였을 때 다시 5p로 되돌아 올수 있어야 합니다. criteria(pageNum, amount)가 유지되어야 한다는 의미입니다.

2. 페이지 처리에 필요한 정보들

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

 

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

평가 2일차입니다. 평가항목은 이렇습니다. https://blog.naver.com/tnwnsrla/222373923949 1. 63일차에 작...

blog.naver.com

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

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

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

cbts.tistory.com

1) 현제 페이지 번호(page)

2) 화면에서 보여지는 페이지의 시작 번호와 끝 번호(startPage, endPage)

(1) endPage : (int) (Math.ceil(페이지 번호 / 10.0)) * 10

(2) startPage : endPage - 9

(3) total을 통한 endPage 의 재계산

realEnd = (int) (Math.ceil((total * 1.0) / amount));

if(realEnd < endPage) {

endPage = readEnd;

}

(4) 이전과 다음으로 이동 가능한 링크의 표시 여부 (prev, next)

ㄱ) prev = startPage > 1;

ㄴ) next = endPage < realEnd;

[페이징 처리를 위한 클래스 설계]

1. org.zerock.domain.PageDTO.java 를 생성합니다. 페이지를 다루기 위한 객체들에 접근하는 클래스입니다.

PageDTO.java

2. BoardController.java 의 @GetMapping list()를 수정합니다.

PageDTO() 인스턴스를 생성하여 model 속성에 addAttribute 하는 것을 추가합니다.

이렇게 해야 view 에서 쓸 수 있겠죠?

PageDTO.java / new PageDTO(cri, 123) 에서 123은 total을 가져와야 하는데 아직 total을 계산하는 메소드를 작성하지 않았으므로 임의로 123개의 게시물로 설정합니다.

[JSP에서 페이지 번호를 출력하기 및 번호 이벤트 처리하기]

1. list.jsp 에 BoardController.java 에서 Addattribute(pageMaker)한 것을 가져오기 위한 코드를 작성합니다.

1) pageMaker 가 가지고 있는 속성들(startPage, endPage, prev, next, total, cri)를 활용합니다.

(1) c:if test는 속성 내의 EL의 결과가 참이면 실행됩니다. (else 구문은 없습니다.)

https://offbyone.tistory.com/367 (c:if 설명)

ㄱ) pageMaker.prev 의 값이 있다면 Previous 를 보여주며 Previous를 클릭했을 때

startPage-1을 이동합니다.(이전페이지로 가는거니까요!)

(2) c:forEach는 자바의 for문이라고 생각하시면 됩니다.

https://offbyone.tistory.com/368 ( c:forEach 설명)

ㄱ) var="num", begin="${pageMaker.startPage}", end="${pageMaker.endPage}"> 는

for( i = pageMaker.startPage ; i <= pageMaker.endPage; num++) 이라고

이해하시면 편하실 듯합니다.

ㄴ) 즉, startPage 부터 endPage까지 num 만큼 반복문을 돌며 active(호버표시?)를 실행해주며

각 EL num 값에 ${num}으로 이동하는 링크를 달아주는 것입니다.

(3) c:if test ${pageMaker.next}도 1번과 동일합니다. 다만, endPage의 앞으로 이동해주는 것이 다릅니다.

2. 별도의 <form> 태그와 이벤트 처리를 통해서 이동하기 위해 form 태그를 작성합니다. type이 hidden 이기 때문에

pageNum과 amount의 이름으로 ${pageMaker.cri.pageNum}, ${pageMaker.cri.amount} 값을

넘깁니다. 사용자가 변경하면 안되기 때문에 보이지 않게 값을 보낸다?라고 생각하면 되는 것 같습니다..

http://tcpschool.com/html-input-types/hidden (hidden 태그를 사용하는 이유)

list.jsp 페이징 추가

list.jsp의 해당 부분 추가 밑에 스크립트는 아직 추가하지 않은 부분입니다.

[조회 페이지로 이동]

1. 조회페이지 이동시 현재 페이지 번호를 같이 전달하는 방식으로 처리되어야 합니다.

그래야 다시 list로 돌아왔을 때 해당 페이지를 가리키고 있기 때문입니다.

2. list.jsp의 <a>링크를 수정하고 javascript로 이 과정을 처리합니다.

list.jsp 해당 부분으로 수정

class="move"가 눌렸을 때 append 로 hidden 내용들을 넣겠다는 의미입니다.

3. 전달받은 페이지 번호를 이용해서 원래 페이지로 이동하기 위하여

BoardController.java 와 get.jsp를 수정합니다.

1) BoardController.java GetMapping({"/get", "/modify"}) get() 메소드에 @ModelAttribute("cri") 추가

https://developer-joe.tistory.com/197

Spring MVC의 @ModelAttribute 어노테이션에 대한 개념 정리

Spring MVC의 @ModelAttribute 어노테이션에 대한 개념 정리 Spring MVC에서 @ModelAttribute을 메소드의 파라미터로 사용할 경우 프로그램이 어떤 식으로 돌아가는지를 정리하고자 한다. 다른 어노테이션에 비해..

developer-joe.tistory.com

2) @ModelAttribute 는 파라미터로 넘겨 준 타입의 오브젝트를 자동으로 생성합니다.

Criteria 클래스의 객체 cri를 자동으로 생성합니다. 이 때 @ModelAttribute가 지정되는

클래스는 Bean 클래스(Criteria 클래스) 이어야 하고 getter와 setter 가

명명 규칙에 맞게 만들어져 있어야 합니다.(@Getter, @Setter)

생성된 오브젝트(cri)에 HTTP로 넘어 온 값들을 자동으로 바인딩(묶다.?)합니다.

2페이지에 12번째 게시글을 클릭하였을 때, pageNum=2&amount=10&bno=12 이 넘어오는데,

이렇게 들어오는 pageNum, amount, bno의 값이 Criteria의 해당 변수의 setter를 통해서 해당 멤버 변수에로

binding 되는 것입니다.

@ModelAttribute 어노테이션이 붙은 객체(cri)가 자동으로 Model 객체에 추가되고 .jsp 뷰단까지

전달이 되는 것입니다.

BoardController.java

 

get.jsp / form 에 hidden 으로 cri.pageNum과 cri.amount를 넘깁니다.

[조회 페이지에서 수정/삭제 페이지로 이동]

1. 수정/삭제 페이지에서도 목록으로 이동할 수 있도록 pageNum과 amount를 전달합니다.

1) modify.jsp 를 수정합니다.

modify.jsp / get.jsp와 동일한 원리

2) BoardController.java 의 modfiy(), remove() 를 수정합니다.

(1) addAttribute 를 사용하면 URL 뒤에 붙게 돼서 값이 유지가 되지만 addFlashAttribute는 일회성으로

URL에 붙지 않고 세션 후 재지정 요청이 들어오면 값이 사라지게 됩니다.

그래서 값을 유지하기 위해 addAttribute를 사용합니다.

https://dlwjdcks5343.tistory.com/91

 

RedirectAttributes의 addAttribute VS addFlashAttribute 차이점

스프링 프레임워크를 이용한 게시글을 만들다가 성공 여부를 뷰에 넘겨줄 때 Redirect을 할 일이 생겼는데 addAttribute와 addFlashAttribute가 있었습니다. RedirectAttributes의 addAttribute와 addFlashAttrib..

dlwjdcks5343.tistory.com

BoardController.java

3) modify.jsp 의 javascript 를 수정합니다.

(1) 저도 이 코드는 잘 이해 안가지만 boardlist로부터 get method로 가져온 pageNum과 amount를

입력하고 다시 boardlist로 갈때 empty 가 된 후 pageNumTag 와 amountTag를 넣음으로써

list에서도 pageNum과 amount를 유지할 수 있도록 하는 것 같습니다.

modfiy.jsp

[MyBatis에서 전체 데이터의 개수 처리]

지금은 페이지의 개수를 153 으로 정해놨기 때문에 15페이지까지 쭉 뜨지만 이것을 게시글 total에 자동으로 맞출 필요가 있습니다.

1. BoardMapper.java, BoardMapper.xml, BoardService.java,

BoardServiceImpl.java, BoardController.java 의 list() 메소드를 수정합니다.

1) BoardMapper java에 getTotalCount() 메소드 추가

BoardMapper.java

2) BoardMapper.xml 에 게시물 조회 쿼리 추가

(1) 전체 개수를 받아야 하기 때문에 resultType="int"입니다.

select count(*) from tbl_board where bno > 0

BoardMapper.xml

3) BoardService.java 에 getTotal 메소드를 추가하고 BoardServiceImpl.java 에 구현합니다.

BoardService.java, BoardServiceImpl.java (비즈니스 로직)

4) BoardController.java 의 list() 메소드를 수정합니다.

BoardController.java

결과화면을 보면 게시물에 맞게 페이지가 수정되서 나옵니다.

저는 게시물이 별로 없어서 2페이지까지 나옵니다.