2021-06-04-TIL
2021-06-04-TIL
MyBatis Paging
- https://jason-moon.tistory.com/138
- https://badstorage.tistory.com/13
MyBatis에서 페이지를 나누는 방법은 크게 두 가지다.
첫째는 RowBounds다. 매퍼 메서드에 RowBounds를 넘기면 MyBatis가 지정한 수만큼 레코드를 건너뛰고 지정한 수까지만 결과를 돌려준다(MyBatis Java API). 다만 SQL에는 LIMIT이 붙지 않는다. 문서도 드라이버에 따라 효율이 다르다고 적고 있어서, 데이터가 많은 테이블에서는 DB가 행을 모두 읽어 보내는 비용을 피하기 어렵다.
둘째는 SQL에 직접 LIMIT을 쓰는 방법이다. MySQL의 LIMIT offset, row_count는 첫 행의 오프셋이 0부터 시작하고, PostgreSQL과 호환되는 LIMIT row_count OFFSET offset 형식도 지원한다(MySQL SELECT).
1
2
3
4
5
<select id="findRooms" resultType="Room">
SELECT * FROM room
ORDER BY id
LIMIT #{size} OFFSET #{offset}
</select>
페이지 번호가 page(1부터 시작)라면 offset = (page - 1) * size다. ORDER BY 없이 페이지를 나누면 페이지마다 행 순서가 보장되지 않으므로 정렬 기준을 꼭 둔다. 오프셋이 커질수록 DB는 앞의 행을 읽고 버려야 하므로, 뒤쪽 페이지일수록 느려진다는 점도 기억해 둔다.
MyBatis
- https://blog.mybatis.org/
- https://www.apiref.com/mybatis/org/apache/ibatis/reflection/wrapper/package-tree.html
@JsonInclude
- https://cheese10yun.github.io/jackson-annotation-03/
Jackson의 @JsonInclude는 어떤 값일 때 필드를 JSON에 포함할지 정한다. 자주 쓰는 값은 다음과 같다(JsonInclude.Include Javadoc).
ALWAYS: 값과 상관없이 항상 포함한다. 기본 동작이다.NON_NULL:null이 아닌 값만 포함한다.NON_ABSENT:null과 함께 비어 있는Optional같은 값도 뺀다.NON_EMPTY:null과 빈 값(빈 문자열, 빈 컬렉션 등)을 뺀다.
1
2
3
4
5
@JsonInclude(JsonInclude.Include.NON_NULL)
public class RoomDto {
private Long id;
private String description; // null이면 응답에서 빠진다
}
응답 크기를 줄일 수 있지만, 클라이언트 입장에서는 “필드가 없음”과 “값이 null”이 같은 의미가 된다. API 문서에 어떤 필드가 생략될 수 있는지 적어 두어야 한다.
Date Between
- https://stackoverflow.com/questions/3822648/how-do-i-query-between-two-dates-using-mysql
- https://www.w3schools.com/mysql/func_mysql_isnull.asp
- https://doorbw.tistory.com/22
- https://velog.io/@pm1100tm/MySQL-%EC%A1%B0%EA%B1%B4%EB%AC%B8-%EC%A0%95%EB%A6%AC
- https://sdevstudy.tistory.com/14
MySQL의 expr BETWEEN min AND max는 min <= expr AND expr <= max와 같아서 양 끝을 포함한다. 날짜나 시간 값을 비교할 때는 CAST()로 타입을 명시하는 편이 결과가 정확하다고 문서는 권한다(MySQL 비교 연산자).
컬럼이 DATETIME인데 BETWEEN '2021-06-01' AND '2021-06-30'처럼 날짜만 주면, 끝값이 2021-06-30 00:00:00으로 해석되어 6월 30일 낮 시간대의 데이터가 빠진다. 이럴 때는 col >= '2021-06-01' AND col < '2021-07-01'처럼 반열린 구간으로 쓰는 편이 안전하다.
ISNULL(expr)은 expr이 NULL이면 1, 아니면 0을 돌려준다. 값이 없을 때 기본값으로 바꾸려면 IFNULL(expr, 대체값)을 쓴다. 검색 조건이 선택적일 때 (#{checkIn} IS NULL OR check_in >= #{checkIn})처럼 쓰면 조건 하나로 “값이 있을 때만 거르기”를 표현할 수 있다.
댓글
아직 댓글이 없습니다