본문 바로가기
교육 정리/입사교육

mavenBoard 만들기

by Jint 2021. 8. 3.

@ 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)

댓글