🎯 오늘 배운 핵심 정리
✅
ConstraintValidator
의initialize()
는 한 번만 실행됨.✅
as
,as?
,is
를 활용한 안전한 캐스팅 방법.✅
when
을 사용한 타입 분기 처리.✅ Kotlin에서 정규식(
Regex
)을 활용한 URL 검증.✅ 백엔드에서 빈 문자열(
""
)을 체크하도록isValid()
개선.✅ Markdown에서
<details>
태그를 활용한 토글 기능.📌 1.
ConstraintValidator
에서initialize()
의 동작 원리initialize()
는 검증기가 처음 생성될 때 한 번만 실행된다.@Url(type = ProjectOS.IOS)
같은 애너테이션을 적용하면 그 설정 값을 가져와 초기화할 수 있다.이후
isValid()
가 호출될 때마다 검증이 수행됨.override fun initialize(url: Url) { type = url.type regex = when (type) { ProjectOS.IOS -> "^[a-zA-Z0-9.]+$".toRegex() ProjectOS.WEB -> "^[a-zA-Z.]+$".toRegex() else -> ".*".toRegex() } }
📌 2. Kotlin에서 안전한 타입 캐스팅 (as
vs as?
vs is
)
🔹 as
(Unsafe Casting)
타입이 맞지 않으면
ClassCastException
이 발생할 위험이 있음.val anyValue: Any = "Hello" val str: String = anyValue as String // ✅ 정상 작동 val number: Int = anyValue as Int // ❌ ClassCastException 발생
🔹
as?
(Safe Casting)캐스팅에 실패하면
null
을 반환하여 예외를 방지함.val anyValue: Any = "Hello" val str: String? = anyValue as? String // ✅ 정상 작동 (str = "Hello") val number: Int? = anyValue as? Int // ✅ number = null (예외 발생 X)
🔹
is
(Smart Casting)타입 체크 후 자동으로 캐스팅됨.
if (value is String) { println(value.length) // ✅ 스마트 캐스트로 자동 변환 }
📌 3. Kotlin에서 when
을 활용한 타입 체크
- 여러 타입을 처리할 때
when
을 사용하면 가독성이 좋아진다.when (value) { is String -> println("문자열 길이: ${value.length}") is Int -> println("정수 값: $value") is List<*> -> println("리스트 크기: ${value.size}") else -> println("알 수 없는 타입") }
📌 4. Kotlin에서 정규식(Regex
)을 활용한 URL 검증
오늘 만든 최종 정규식은 HTTPS가 반드시 포함되며, 포트 번호, 경로, 쿼리 파라미터, 프래그먼트까지 지원한다.
val urlRegex = "^https:\\/\\/([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}(:\\d+)?(\\/[a-zA-Z0-9-_/]*)*(\\?[a-zA-Z0-9-_.~%&=]*)?(#[a-zA-Z0-9-_.~%&=]*)?$".toRegex()
fun isValidUrl(url: String): Boolean {
return url.isNotBlank() && urlRegex.matches(url)
}
🔹 검증 가능한 URL 예시
테스트 문자열 | 매칭 여부 | 설명 |
---|---|---|
"https://example.com" |
✅ 매칭 |
https:// 포함, 도메인 형식 충족 |
"https://sub.example.co.uk" |
✅ 매칭 |
서브도메인 & TLD 형식 충족 |
"https://example.com:8080" |
✅ 매칭 |
포트 번호 포함 가능 |
"https://example.com/home" |
✅ 매칭 |
경로 포함 가능 |
"https://example.com/search?query=kotlin" |
✅ 매칭 |
쿼리 파라미터 포함 가능 |
"https://example.com/docs#introduction" |
✅ 매칭 |
프래그먼트 포함 가능 |
"http://example.com" |
❌ 매칭 안됨 |
https:// 필수 |
"ftp://example.com" |
❌ 매칭 안됨 |
ftp:// 허용되지 않음 |
"example.com" |
❌ 매칭 안됨 |
https:// 없음 |
## 📌 5. ConstraintValidator 에서 빈 문자열 검증 처리 |
백엔드에서 필수 필드 검증을 수행할 때 null
이 아닌 빈 문자열(""
)도 체크해야 한다.
🔹 변경된 isValid()
코드
override fun isValid(p0: String, p1: ConstraintValidatorContext?) =
p0.isNotBlank() && regex.matches(p0)
✅ 백엔드에서 String
이므로 null
체크 제거
✅ 빈 문자열(""
)과 공백 문자열(" "
)이 입력되면 false
반환하도록 처리
✅ 프론트엔드와 일관된 검증 적용
📌 6. Markdown에서 토글(Toggle) 만들기
GitHub, GitLab, Notion 등 일부 플랫폼에서는 <details>
태그를 이용해 토글 기능을 만들 수 있다.
🔹 기본 토글
<details>
<summary>클릭하여 펼치기</summary>
<p>여기에 숨겨진 내용이 들어갑니다.</p>
</details>
📌 결과:
클릭하여 펼치기
여기에 숨겨진 내용이 들어갑니다.
🔹 리스트 포함 토글
<details>
<summary>📌 클릭해서 더 보기</summary>
- 리스트 아이템 1
- 리스트 아이템 2
- 리스트 아이템 3
**굵은 글씨**와 *기울임 글씨*도 사용 가능!
</details>
📌 결과:
📌 클릭해서 더 보기
- 리스트 아이템 1
- 리스트 아이템 2
- 리스트 아이템 3
굵은 글씨와 _기울임 글씨_도 사용 가능!
'Blog > TIL' 카테고리의 다른 글
2025-02-10 (월) (0) | 2025.02.10 |
---|---|
2025-02-06 (목) (2) | 2025.02.06 |
2025-02-04 (화) (2) | 2025.02.04 |
2025-02-03 (월) (2) | 2025.02.03 |
2025-01-22 (수) (0) | 2025.01.22 |
댓글