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으로 안전하게 바인딩됨.
✅ 바인딩 변수의 장점
- SQL Injection 방지: 사용자의 입력값이 직접 SQL에 삽입되지 않음.
- 쿼리 재사용 가능: 값이 변하더라도 동일한 SQL을 재사용 가능.
- 가독성 증가: 코드에서 변수명을 명확히 표현할 수 있음.
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 |
댓글