2022-03-14-TIL
Today I Learned
Edge Cases
엣지 케이스는 입력값이나 상황이 허용 범위의 끝에 있을 때를 말한다. 빈 문자열, null, 빈 리스트, 원소가 하나인 리스트, 정수의 최댓값과 최솟값, 0과 음수, 중복 값, 경계 날짜(월말, 윤년, 타임존) 같은 것들이다. 정상 흐름만 테스트해서는 드러나지 않는 경우가 많아 따로 찾아 나열해야 한다.
링크된 글들이 권하는 찾는 방법은 비슷하다. 입력의 범위를 정의하고 그 경계값과 경계 바로 바깥 값을 테스트하는 경계값 분석, 입력을 같은 동작을 하는 그룹으로 나눠 그룹마다 대표값을 고르는 동치 분할, 그리고 유스케이스의 정상 흐름 외에 예외 흐름(네트워크 실패, 중복 요청, 권한 없음)을 따로 나열하는 것이다. UX 관점에서는 데이터가 하나도 없을 때, 너무 길 때, 로딩이 실패했을 때 화면이 어떻게 보이는지도 엣지 케이스에 포함된다.
- https://ignys.co.uk/blog/edge-cases/
- https://www.geeksforgeeks.org/dont-forget-edge-cases/
- https://uxplanet.org/how-to-find-and-deal-with-edge-cases-in-ux-design-6852ab508205
- https://www.quora.com/What-is-an-edge-case-when-programming
- https://softwareengineering.stackexchange.com/questions/72761/how-do-you-identify-edge-cases-on-algorithms
- https://exactest.ie/business-process-and-edge-cases/
- https://docs.microsoft.com/en-us/archive/msdn-magazine/2010/march/don%E2%80%99t-get-me-started-edge-cases
- https://www.softwaretestinghelp.com/use-case-testing/
현실 세계와 소프트웨어 세계
현실과 소프트웨어의 세계는 정말 많이 닮아있다. 특히 법은 소프트웨어와 매우 닮아있다. 그럴듯한 법도 정작 시행해보면 문제점이나 사이드 이팩트가 발생하는 경우가 많다. 마치 소프트웨어에서 버그가 발생하는 것과 같다. 따라서 버그를 수정하듯이 법도 개정을 끊임없이 할 필요가 있을때가 많다.
Predicate 와 BooleanExpression
QueryDSL에서 Predicate는 조건식을 나타내는 인터페이스이고, BooleanExpression은 이를 구현하면서 and, or, not으로 조합할 수 있는 클래스다. 링크된 우아한형제들 발표 정리 글은 동적 쿼리를 만들 때 BooleanBuilder에 조건을 쌓기보다, 조건마다 BooleanExpression을 반환하는 메서드를 만들고 값이 없으면 null을 반환하게 하라고 권한다. where는 null 인자를 무시하므로 조건 메서드를 그대로 나열하면 되고, 메서드 이름이 조건의 의미를 드러내며 재사용도 쉽다.
1
2
3
4
5
6
7
private BooleanExpression nameEq(String name) {
return name == null ? null : member.name.eq(name);
}
queryFactory.selectFrom(member)
.where(nameEq(name), ageGoe(age))
.fetch();
- https://whitepro.tistory.com/374
- https://velog.io/@youngerjesus/%EC%9A%B0%EC%95%84%ED%95%9C-%ED%98%95%EC%A0%9C%EB%93%A4%EC%9D%98-Querydsl-%ED%99%9C%EC%9A%A9%EB%B2%95
QueryDSL에서 like, contains
QueryDSL의 like(str)은 넘긴 문자열을 패턴 그대로 사용하므로 %를 직접 붙여야 한다. contains(str)은 앞뒤에 %를 붙인 %str% 패턴을, startsWith(str)은 str%, endsWith(str)은 %str 패턴을 만들어 준다. 그래서 contains는 편하지만 앞에 와일드카드가 붙어 인덱스를 타지 못한다는 점을 함께 기억해야 한다.
- https://cherrypick.co.kr/querydsl-difference-like-contains/
WHERE절 LIKE 성능 향상
MySQL 문서에 따르면 B-tree 인덱스는 LIKE의 인자가 와일드카드로 시작하지 않는 상수 문자열일 때 사용할 수 있다. LIKE 'Patrick%'는 인덱스를 쓰지만 LIKE '%Patrick%'는 쓰지 못한다. 인덱스가 정렬된 구조라 접두어가 정해져야 범위를 좁힐 수 있기 때문이다.
그래서 성능을 높이는 방법은 다음과 같다.
- 가능하면 검색 요구사항을 접두어 검색(
keyword%)으로 바꾼다. - 중간 일치 검색이 꼭 필요하면
FULLTEXT인덱스(MySQL은 n-gram 파서로 한국어도 지원)나 Elasticsearch 같은 검색 엔진을 쓴다. 검색 대상 행 수를 먼저 다른 인덱스 조건으로 줄인 뒤
LIKE를 적용한다.- https://link2me.tistory.com/544
- https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=forum&wr_id=88567&sca=&sfl=wr_subject%7C%7Cwr_content&stx=%BF%AA%C0%CE%B5%A6%BD%BA&sop=and
- https://stackoverflow.com/questions/11418932/performance-of-like-queries-on-multmillion-row-tables-mysql
댓글
아직 댓글이 없습니다