본문 바로가기
Blog/TIL

2025-02-05 (수)

by 코젼 2025. 2. 5.
728x90
반응형

🎯 오늘 배운 핵심 정리

  • ConstraintValidatorinitialize()는 한 번만 실행됨.

  • 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

굵은 글씨와 _기울임 글씨_도 사용 가능!

728x90
반응형

'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

댓글