개발자로 가는 길(국비지원과정)/4.Spring+ Ajax

[210719월] 페이징 정리(startPageGroup과 endPageGroup 계산 방법), 파일 업로드

레아Leah 2021. 7. 19. 10:05
반응형

콘크롤러:  사용자의 요청을 도와줌 

 

패키지, 클래스 하나 추가 

 

전달인자를 통해 우리멤버에 값을 넣는 작업이 필요하다. 

int currentPage, int totalRecordCount는 외부에서 전달받음 

 

1페이지일 경우 삼각형을 누르면 -1페이지가 아니라 현재 페이지가 유지되어야한다.

 

// 현재 페이지 요청시 (현재 1페에지에서 삼각형을 누를 경우) 
if(currentPage < 0) currentPage = 1; 

 

현재 페이지를 의미하는 currentPage는 음수가 될 수도 있다. 

 

총 글 개수보다 현재 페이지가 많을 수 없기때문에 

if(currentPage > totalPageCount) currentPage = totalPageCount; 

 

 

//그룹 계산

 

음수가 되지 않도록 하기 위해 

startPageGroup = currentGroup * pagePerPage +1;
startPageGroup = startPageGroup < 1 ? 1: startPageGroup;

 

endPageGroup = startPageGroup + pagePerPage -1;
endPageGroup = endPageGroup < totalPageCount ? endPageGroup : totalPageCount;

 

[정리] 

총 글 개수를 DB를 통해 가져와야함 

총 글 개수가 152개일 때, 한 페이지에 10개씩 보여주기로 함 

   : 총 페이지 수는 16페이지 

 

총 그룹은 4개, 4그룹이 나옴 

계산하기 편하게 0그룹 

 

0 : 1 2 3 4 5 

1 : 6 7 8 9 10

2 : 11 12 13 14 15 

3: 16 

 

1 6 11 16 은 startPage

5 10 15 16은 endPage 

 

페이지를 넘기는 것을 의미하는 삼각형을 누르는 순간 currentPage가 음수가 되기 때문에 그것을 막아줘야함 

 

 

 

[2교시]

 

삼항 연산자를 사용하는 이유는  currentPage가 1일 경우, 삼각형을 누르면 -1을 요청한 것이 되므로 이를 막기 위해 

 

첫페이지에서 음수가 오거나 마지막 페이지에서 총 글개수보다 많은 경우를 요청하는 경우를 대비해야함 

 

항상 문제는 첫그룹과 마지막 그룹이 문제다!

 

 

startPageGroup, endPageGroup을 알아야 하는 이유 

for문을 돌려 페이지를 출력하기 위해 첫번째 페이지, 마지막 패이지를 알아야 하는 것이다. 

 

fianl을 제외하고 멤버변수의 세터, 게터 설정

 

 

navigator를 컨드롤러에 옮기려면

 

이후, navi.get의 형식으로 게터로 끌어와 사용하면 된다. 

 

 

[파일 첨부]
파일 첨부를 하고 싶어요 
화면 바꾸러 go! 

<tr> 
파일이 날아가야하기때문에 name값 지정 
파일도 안에 들어가기 때문에 글자와 데이터가 함께 넘어가기 때문에 인토딩해줘야한다. 

 

파일을 첨부할 때는 반드시 post타입이며 

<form action="writeboard" method="POST" enctype="multipart/form-data">

 

name은 클라이언트와 서버쪽 이름이 꼭 같아야 한다.

 

 

<순서> 

1) writeboard.jsp에서 화면 구성 

2) 디펜던시 추가 

commons-io

더보기

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>

commons-fileupload

더보기
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>

 

필요한 디펜던시를 pom.xml에 추가한 뒤 객체를 해줘야 사용할 수 있음 

 

스프링에서 하면 좋은 것은 알아서 파일을 받아줌?

 

+디펜던시 추가 

https://mvnrepository.com/

 

 

[3교시]

사용자가 지나치게 큰 파일을 업로드하면 우리쪽 서버에 무리가 있음

그것을 막을 것! 스프링에서 제공해주는 기능을 사용! 

 

 

value는 사이즈를 고정해주는 것!  10485760 

이것보다 큰 용량이 들어가면 업로드 불가! 

 

더보기

<!-- 업로드 용량 제한을 위한 Bean 추가: 최대 10M -->
<bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"></property>
</bean>

 

 

다시 보드 컨트롤러로 이동 

board는 글만 받는다.

 

어떻게 데이터가 나오는지 확인!

null포인터 뜨지 않는 것을 확인할 수 있음

 

 

파일 저장은 파일명은 뽑아 디비에 보내고 파일은 하드디스크에 저장! 

final String uploadPath = "/boardfile";

"/boardfile"에 저장하는 것임 

파일명만 디비에 보낸다. 

 

현재 작업하고 있는 파일의 "/boardfile" 생성 해야함 or 생성됨? 확실하지 않음 

 

디비의 경우, delete해주면 되지만 다운받은 파일은 직접 삭제해줘야 한다. 

 

 

폴더가 있는지, 첨부파일이 있는지, 비어있는지 확인해야함

있다면 저장할 공간이 있는지 확인

 

 

//bts.jpg

//bts_sdgdsgdgsd.jpg

오리지널파일네임이 겹치면 먼저 올린 데이터가 사라지기 때문에 난수화를 시켜준다. 

 

//bts.그림..jpg라면 마지막 .만 확장명, 앞에는 파일명 

.을 기준으로 앞과 뒤를 나눈다. 

bts를 파일명, .jpg을 확장명으로 구분 

 

난수 발생시키기! 

 

String originalFilename = upload.getOriginalFilename(); //bts.jpg/ bts_sdgdsgdgsd.jpg
String uid = UUID.randomUUID();는 땡 안됨  tostring해줘야함

 

 

마지막 .의 위치를 알아내 확장자로 구분 

어떤 경우 확장자이 없는 경우도 있다. 

이런 경우도 생각해봐야한다.

 

 

-1이면 .을 못찾음. 즉, 확장명이 없는 경우

 

반응형