@ mavenBoard 만들기
1. @Alias 어노테이션
https://gaeggu.tistory.com/6 - 참고
별칭을 지정할 때 사용(TypeAlias). @Alias("별칭") 어노테이션이 지정된 클래스는 매퍼파일에서 별칭으로
해당 클래스를 매핑.
- sqlMapConfig.xml
<!-- DTO 찾아가는 경로 설정 -->
<typeAliases>
<package name="ino.web.freeBoard.dto" />
</typeAliases>
- DTO.java
@Alias("user")
public class UserDTO {
private Long id;
private String name;
}
매퍼 파일에서 TypeAlias를 지정하지 않으면 com.user.dto.UserDTO 와 같이 패키지명을
포함한 클래스명을 입력해야 하지만 @Alias를 사용하면 <select id="findById" resultType="user">이렇게 사용
가능.
2. 페이징 처리
https://m.blog.naver.com/lgr0406/221748064383 - 참고
https://m.blog.naver.com/lgr0406/221750276668 - 참고
https://m.blog.naver.com/lgr0406/221750526297 - 참고
- Criteria.java
https://lee1535.tistory.com/27 - 참고(Lombok 설치)
https://the-dev.tistory.com/27 - 참고(Lombok 설치2)
https://www.daleseo.com/lombok-popular-annotations/ - 참고(Lombok 어노테이션)
https://cheese10yun.github.io/lombok/ - 참고(Lombok 어노테이션2)
https://mangkyu.tistory.com/78 - 참고(Lombok 어노테이션3)
@ToString
@Setter
@Getter
@Alias("cri")
public class Criteria {
private int pageNum; //현재 페이지
private int amount; //한 페이지에 출력할 페이지 수 (페이지당 amount개로 지정)
private String type; //변수 추가
private String keyword; //변수 추가
public Criteria() {
this(1,10);
}
public Criteria(int pageNum,int amount) {
this.pageNum = pageNum;
this.amount = amount;
}
// 추가
public String[] getTypeArr() {
return type == null? new String[] {} : type.split("");
}
}
Lombok 어노테이션인 @Setter와 @Getter, @ToString을 만들어 게터와 세터를 만들지 않아도 어노테이션으로 부르도록 구현.
- PageDTO.java
@ToString
@Getter
public class PageDTO {
private int startPage; //시작페이지
private int endPage; //끝페이지
private boolean prev,next; //이전,다음 페이지 유무, flag
private int total; //전체 레코드 수
private Criteria cri; //Criteria 객체
public PageDTO(Criteria cri,int total) {
this.total = total;
this.cri = cri;
//페이징의 끝번호 계산 : 올림(현재페이지 / 10.0) * 10
this.endPage = (int) (Math.ceil(cri.getPageNum() / 10.0)) * 10; //Math.ceil( ) : 소수점을 올림으로 처리
//페이징의 시작번호 계산 : 끝 페이지 - (한 페이지에 출력할 페이지 수 - 1)
this.startPage = this.endPage - 9;
//실제 끝 페이지 : 올림((전체 레코드 수 * 1.0) / 한 페이지에 출력할 페이지 수)
int realEnd = (int) (Math.ceil((total * 1.0) / cri.getAmount()));
if(realEnd <= this.endPage) {//실제 끝 페이지가 끝 페이지보다 작으면
this.endPage = realEnd; //끝 페이지를 실제 끝 페이지 값으로 변경
}
//시작 페이지가 1페이지 보다 크면 prev가 true
this.prev = this.startPage > 1;
//끝 페이지가 실제 끝 페이지보다 작으면 next가 true
this.next = this.endPage < realEnd;
}
}
동일하게 Lombok 어노테이션 구현.
- freeBoardMapper.xml
https://sinna94.tistory.com/entry/MyBatis-%EB%8F%99%EC%A0%81-%EC%BF%BC%EB%A6%AC-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0 - 참고(동적SQL)
https://java119.tistory.com/103 - 참고(동적SQL trim)
<!-- 동적 SQL -->
<!-- +INDEX_DESC(tbl_board pk_board) -->
<!-- collection : 배열,List / item : 변수 이름 -->
<select id="listPage" resultType="freeBoardDto" parameterType="ino.web.freeBoard.dto.Criteria">
<![CDATA[
select
num, title, name, TO_CHAR(REGDATE,'YYYY/MM/DD') regdate, content
from (
select
rownum rn, num, title, name, TO_CHAR(REGDATE,'YYYY/MM/DD') regdate, content
from freeboard
where
]]>
<trim prefix="(" suffix=") AND " prefixOverrides="OR">
<foreach item='type' collection="typeArr">
<trim prefix="OR">
<choose>
<when test="type == 'T'.toString()">
title like '%'||#{keyword}||'%'
</when>
<when test="type == 'C'.toString()">
content like '%'||#{keyword}||'%'
</when>
<when test="type == 'W'.toString()">
writer like '%'||#{keyword}||'%'
</when>
</choose>
</trim>
</foreach>
</trim>
<![CDATA[
rownum <= #{pageNum} * #{amount}
)
where rn > (#{pageNum} -1) * #{amount}
]]>
</select>
동적 SQL로 구현.
- FreeBoardController.java
https://hongku.tistory.com/116 - 참고(모델엔뷰)
@RequestMapping("/main.ino")
public ModelAndView main(HttpServletRequest request,Criteria cri){
ModelAndView mav = new ModelAndView();
//http://localhost:8080/mavenBoard/
//http://localhost:8080/mavenBoard/main.ino
//List list = freeBoardService.freeBoardList();
List list = freeBoardService.freeBoardList2(cri);
mav.setViewName("boardMain"); //뷰의 경로 - tiles.xml에 되어있다.
mav.addObject("freeBoardList",list); //변수이름,데이터값
mav.addObject("pageMaker", new PageDTO(cri, 123)); //전체 데이터 수 필요
return mav;
}
-> 실패 이유 : Lombok 어노테이션 만든 Criteria.java가 Mapper로 데이터가 안 넘어간다.
★재도전
https://melonpeach.tistory.com/27?category=806570 - 참고
- freeBoardMapper.xml
https://javaexpert.tistory.com/503 - 참고(ROW_NUMBER() OVER)
'교육 정리 > 입사교육' 카테고리의 다른 글
mavenBoard 만들기 5 (파일 게시판 만들기2) (0) | 2021.08.08 |
---|---|
mavenBoard 만들기 3,4 (페이징 재도전3, 파일 게시판 만들기) (0) | 2021.08.05 |
mavenBoard 만들기 2 (수정, 삭제 구현, 페이징 재도전2) (0) | 2021.08.04 |
교육환경 만들기, mavenBoard 오류 고치기 (0) | 2021.08.02 |
글쓰기 Test (1) | 2021.08.01 |
댓글