2021-08-24-TIL
2021-08-24-TIL
MySQL
여러개의 컬럼을 유니크하게 관리
각 컬럼은 중복될 수 있지만 조합은 중복되면 안 될 때(같은 사용자가 같은 게시글에 좋아요를 한 번만 누르는 경우 등) 복합 유니크 제약을 건다. ALTER TABLE likes ADD UNIQUE KEY uk_user_post (user_id, post_id);처럼 여러 컬럼을 하나의 유니크 인덱스로 묶는다. 중복 조합을 넣으면 오류가 나므로, 애플리케이션 검사만으로는 막기 어려운 동시 요청 상황에서도 DB가 최종적으로 중복을 막아 준다.
- https://myhappyman.tistory.com/148
MUL key
DESC 테이블이나 SHOW COLUMNS의 Key 열에 나오는 값이다. MySQL 문서에 따르면 PRI는 기본 키(의 일부), UNI는 유니크 인덱스의 첫 컬럼, MUL은 같은 값이 여러 번 나올 수 있는 비유니크 인덱스의 첫 컬럼이다. 외래 키 컬럼에는 인덱스가 자동으로 만들어지므로 보통 MUL로 보인다. 복합 인덱스라면 첫 번째 컬럼에만 표시된다.
- https://torbjorn.tistory.com/557
Java
문자열 붙이기
String은 불변이라 +로 이어 붙이면 매번 새 문자열이 만들어진다. 한 줄짜리 결합은 컴파일러가 최적화하므로(JDK 9부터는 JEP 280의 StringConcatFactory를 통한 invokedynamic 방식) 신경 쓰지 않아도 되지만, 반복문 안에서 계속 붙이면 루프마다 중간 객체가 생긴다. 이럴 때는 StringBuilder의 append()를 쓰고, 구분자를 넣어 합치는 경우는 String.join()이나 Collectors.joining()이 간결하다.
- https://rullurangrang.tistory.com/5
정규표현식
Java의 정규식은 java.util.regex.Pattern으로 컴파일하고 Matcher로 검색한다. 같은 패턴을 반복해서 쓰면 Pattern.compile() 결과를 상수로 두고 재사용하는 편이 낫다. String.replaceAll(), matches()는 호출할 때마다 패턴을 새로 컴파일한다.
자주 겪는 오류가 “illegal escape character”다. 정규식의 \d를 Java 문자열 리터럴에 쓰려면 문자열 이스케이프 때문에 "\\d"처럼 백슬래시를 두 번 써야 한다. 리터럴 백슬래시 자체를 매칭하려면 정규식에서 \\, 문자열로는 "\\\\"가 된다. 패턴을 시험할 때는 regexr.com 같은 도구로 매칭 결과를 바로 확인하면 편하다. 링크 중 Medium 글은 Kotlin에서의 정규식 사용을 다룬다.
1
2
3
4
5
6
private static final Pattern DATE = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher m = DATE.matcher("2021-08-24");
if (m.matches()) {
String year = m.group(1); // "2021"
}
- https://medium.com/@limgyumin/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%97%90%EC%84%9C-%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-2c655ba35c36
- https://sang12.co.kr/91/JAVA-%EC%A0%95%EA%B7%9C%EC%8B%9D-%ED%8A%B9%EC%A0%95-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%B9%98%ED%99%98%ED%95%98%EA%B8%B0
- https://offbyone.tistory.com/399
- https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html
- https://regexr.com/
- http://egloos.zum.com/sweeper/v/3064464
- https://stackoverflow.com/questions/1379191/why-does-this-java-regex-cause-illegal-escape-character-errors
- https://offbyone.tistory.com/400
파일이름에 사용할 수 없는 문자
사용자 입력으로 파일 이름을 만들 때 필요한 정보다. Microsoft 문서는 Windows 파일 이름에 <, >, :, ", /, \, |, ?, *를 예약 문자로 쓸 수 없다고 정리하고, CON, PRN, NUL 같은 예약 이름도 금지한다. Linux에서는 /와 널 문자만 금지된다. 여러 OS에서 쓰일 파일이라면 위 문자들을 정규식으로 _ 등으로 치환해 두는 편이 안전하다.
- https://zetawiki.com/wiki/%ED%8C%8C%EC%9D%BC_%EC%9D%B4%EB%A6%84%EC%97%90%EB%8A%94%EB%8B%A4%EC%9D%8C%EB%AC%B8%EC%9E%90%EB%A5%BC_%EC%82%AC%EC%9A%A9%ED%95%A0%EC%88%98%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4
Kotlin
isEmpty vs isBlank
Kotlin 표준 라이브러리 문서 기준으로 isEmpty()는 길이가 0일 때만 true이고, isBlank()는 비어 있거나 공백 문자로만 이루어져 있으면 true다. 그래서 " "는 isEmpty()가 false, isBlank()가 true다. 사용자 입력처럼 공백만 넣은 값을 빈 값으로 보려면 isBlank()를 쓴다. null일 수도 있는 문자열에는 isNullOrEmpty(), isNullOrBlank()를 쓴다.
- https://holika.tistory.com/entry/%EB%82%B4-%EB%A7%98%EB%8C%80%EB%A1%9C-%EC%A0%95%EB%A6%AC%ED%95%9C-Kotlin-isEmpty%EC%99%80-isBlank%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
댓글
아직 댓글이 없습니다