본문 바로가기
Blog/TIL

2025-03-13 (목)

by 코젼 2025. 3. 13.
728x90
반응형

✍️ 정리

  • sealed interface는 특정 모듈 내에서만 상속이 가능하고, 선택적 override가 가능하여 when 문에서 안전성을 제공.
  • 바인딩 변수(Bind Parameter)는 SQL Injection을 방지하고, 성능과 가독성을 향상시키는 중요한 기법.

📌 Kotlin의 sealed interface vs 일반 interface**

✅ sealed interface란?

  • sealed interface는 상속 계층을 제한할 수 있는 인터페이스로, 같은 모듈 내에서만 하위 타입을 정의할 수 있음.
  • 특정 메서드를 선택적으로 override할 수 있도록 설계할 수 있음.
  • when 표현식에서 컴파일 타임 안전성을 보장할 수 있음.

✅ 일반 interface와의 차이점

특징 일반 interface sealed interface

상속 제한 여부 제한 없음 같은 모듈 내에서만 가능
선택적 override 모든 메서드를 구현해야 함 일부 메서드만 구현 가능
when 사용 시 else 필수 else 생략 가능 (모든 하위 클래스가 처리되면)

✅ 사용 예시

sealed interface Response {
    fun message(): String // 필수 구현
    fun log() {} // 선택적 override

    data class Success(val data: String) : Response {
        override fun message() = "Success: $data"
    }

    data class Error(val reason: String) : Response {
        override fun message() = "Error: $reason"
        override fun log() {
            println("Logging error: $reason")
        }
    }
}

fun handleResponse(response: Response) {
    when (response) {
        is Response.Success -> println(response.message())
        is Response.Error -> {
            println(response.message())
            response.log()
        }
        // `else`가 필요 없음 (모든 sealed interface 구현체를 다룰 경우)
    }
}

📌 바인딩 변수(Bind Parameter)란?

  • SQL에서 외부 입력 값을 안전하게 전달할 때 사용하는 기법.
  • 직접 SQL에 값을 삽입하는 것이 아니라 플레이스홀더(? 또는 :key)를 사용하여 값을 전달.
  • SQL Injection 방지 및 쿼리 성능 최적화에 도움을 줌.

✅ 예제: 바인딩 변수를 사용하는 쿼리

val sql = "SELECT * FROM users WHERE id = :userId"
val params = mapOf("userId" to 123)

val result = jdbcTemplate.queryForList(sql, params)
  • :userId → 실행 시 123으로 안전하게 바인딩됨.

✅ 바인딩 변수의 장점

  1. SQL Injection 방지: 사용자의 입력값이 직접 SQL에 삽입되지 않음.
  2. 쿼리 재사용 가능: 값이 변하더라도 동일한 SQL을 재사용 가능.
  3. 가독성 증가: 코드에서 변수명을 명확히 표현할 수 있음.
728x90
반응형

'Blog > TIL' 카테고리의 다른 글

2025-03-18 (화)  (2) 2025.03.18
2025-03-14 (금)  (0) 2025.03.14
2025-03-11 (화)  (1) 2025.03.11
2025-03-10 (월)  (1) 2025.03.10
2025-03-07 (금)  (2) 2025.03.07

댓글