Handling Null in URL
About
APIλ₯Ό ꡬννλ€λ³΄λ©΄ /posts?type=notice
μ ?type=notice
, /posts/{id}
, μμ id
μ²λΌ URLμ ν΅ν΄ κ°μ μ λ¬νλ κ²½μ°κ° μλ€.
Spring MVCμμλ 컨νΈλ‘€λ¬μμ μμ²μΌλ‘ λ€μ΄μ¨ ν΄λΉ κ°λ€μ κ°κ° @RequestParam
, @PathVariable
μ΄λ
Έν
μ΄μ
μ μ΄μ©ν΄ μ°Έμ‘°ν μ μλ€.
@RequestParam
Java
Springμ μλ°λ‘ μμ±ν λλ λ€μκ³Ό κ°μ΄ μ§νν μ μμλ€.
Kotlin
μ½νλ¦°μμλ μΈμ΄ μ°¨μμμ νμ
λ€μ ?
λ₯Ό λΆμ΄λ κ²μΌλ‘ nullable νμ
κ³Ό non-nullable νμ
μ ꡬλΆνκ³ (μμ ν λ€λ₯Έ νμ
μ΄ λλ€), ν¨μμμ λν΄νΈ κ°μ μ§μνλ€. λν΄νΈ κ°μ μ΄λ° μμΌλ‘ μ λ¬ν μ μλ€.
κ·Έλ λ€λ©΄ μ€νλ§μμλ μ΄ κΈ°λ₯μ μμ©ν΄μ PostController
μμ λ₯Ό λ€μκ³Ό κ°μ΄ μμ±νλ©΄ μ΄λ¨κΉ?
κ·Έλ¬λ μ΄λ κ² νκ² λλ©΄ μ€μ λ‘λ type
μλ nullμ΄ λ€μ΄κ°λ€.
Springμ ArgumentResolver
(RequestParamArgumentResolver
)λ₯Ό κ±°μΉλ©°, type
μ μ μ΄μ nullμ΄ λ€μ΄κ° μ±λ‘ μμνλ―λ‘, λν΄νΈ κ°μ΄ μ½μ
λμ§ μλ κ²μ΄λ€.
λ°λΌμ λ€μκ³Ό κ°μ΄ μ§ννλ©΄ λλ€.
required = true
λ νλ μ§κ³ λμ΄κ° λΆλΆμ΄ μλ€. required
μ΅μ
μ κ΄ν λ΄μ©μ΄λ€. required
μ defaultValue
μ 무μ μ‘°ν©μΌλ‘ 4κ°μ§κ° λμ€λλ°, κ° μν©μμ μ€λ₯λ₯Ό μΌλΆλ¬ λ°μμμΌλ³΄μ. (500
μ΄ λμ€λ©΄ μμΉ μλ μν©μ΄ λλκ±°λ€!)
1λ² μν© - defaultValue μμ, required=true, non-nullable
type
μ λν΄νΈ κ°μ μμ κ³ , λ°λμ μ λ¬λ°λλ‘ νκ³ μΆλ€. required=true
λ₯Ό λ£κ³ non-nullable νμ
μΌλ‘ νλ©΄ λ κΉ?
μΌλΆλ¬ μ€λ₯λ₯Ό λ°μμν€κΈ° μν΄ μ΄λ κ² λν΄νΈκ°μ μλ£κ³ μμ²ν΄λ³΄μ.
μ, μ΄λ κ² μ λ¬νλ©΄ 500μ΄ μλ 400 Bad Requestκ° λ°νλλ€.
β λ°λμ§νλ€! λλ¨Έμ§ μν©λ κ³μν΄μ νμΈν΄λ³΄μ.
2λ² μν© - defaultValue μμ, required=false, nullable
type
μ μ λ¬νμ§ μμΌλ©΄ nullμ΄ λ€μ΄κ°κ³ , type
μ μ λ¬νλ©΄ ν΄λΉ κ°μΌλ‘ μ΄κΈ°νλλ€. λ λ€ μ€λ₯κ° λ°μνμ§ μλλ€.
β λ°λμ§νλ€.
3λ² μν© - defaultValue μμ, required=true, non-nullable
type
μ μ λ¬νμ§ μμΌλ©΄ λν΄νΈ κ° "post"
κ° λ€μ΄κ°κ³ , type
μ μ λ¬νλ©΄ ν΄λΉ κ°μΌλ‘ μ΄κΈ°νλλ€. λ λ€ μ€λ₯κ° λ°μνμ§ μλλ€.
β λ°λμ§νλ€.
4λ² μν© - defaultValue μμ, required=false, nullable
3λ² μν©κ³Ό λμΌνκ² λμνλ€. λ€λ§ 컨νΈλ‘€λ¬μμ ν΄λΉ κ°μ μ¬μ©ν λ nullμ΄ λ€μ΄κ°μ§ μμμμλ λΆκ΅¬νκ³ null 체ν¬λ₯Ό ν΄μ€μΌ νλ€.
π«€ λΆνΈνλ€.
μ λλ μμ λ₯Ό μμλ΄€μΌλ μ΄μ requiredμ nullableμ λ€λ₯΄κ² λ§ νΌμ’ μΌμ΄μ€λ₯Ό μμ보μ. (κΆκΈνλκΉ!)
5λ² μν© - defaultValue μμ, required=true, nullable
4λ² μν©κ³Ό λμΌνκ² λμνλ©°, ν΄λΉ κ°μ μ¬μ©ν λ nullμ΄ λ€μ΄κ°μ§ μμμμλ null 체ν¬λ₯Ό ν΄μ€μΌ νλ€.
κ·Όλ° λ¬Έμ κ° μλ€. required=true
μΈλ° type
μ μ λ¬νμ§ μμλ μ€λ₯κ° λ°μνμ§ μλλ€.
νμκ°μΌλ‘ λ§νΉνκΈ° μν΄ required=true
λ‘ μ€μ ν κ²μΈλ° νμκ° μ²΄νΉμ΄ μλλ€λ...
β λμ°νλ€.
6λ² μν© - defaultValue μμ, required=false, non-nullable
type
μ μ λ¬νλ©΄ λ¬Έμ μμ΄ λμνλ€. κ·Έλ°λ° μ λ¬νμ§ μμλ€λ©΄ λ€μκ³Ό κ°μ΄ NullPointerException
μ΄ λ°μνλ€.
κ·Έλ¦¬κ³ 500 Error
κ° λ°νλλ€.
β μ€μκ° μλλΌλ©΄ μ΄λ΄ μΌ μκ² μ§λ§ λΉμ°ν μ΄λ¬λ©΄ μλλ€.
7λ² μν© - defaultValue μμ, required=true, nullable
5λ²κ³Ό λμΌνκ² λμνλ©° λ¬Έμ λ κ°λ€κ³ ν μ μ. λν΄νΈκ°λ μκ³ required=true
μΈλ° κ΅³μ΄ nullable νμ
μ μΈ νμκ° μμκΉ?
π«€ λ°λμ§νμ§ μλ€.
8λ² μν© - defaultValue μμ, required=false, non-nullable
defaultValue
κ° μκ³ , required=false
μ΄λ€. type
μ non-nullableμ΄λ€.
π€ μλν λλ‘λ λμνλ€...λ§ defaultValue
λ§ λΉ λ¨λ €λ 6λ²μ΄λ λκ°μμ§λ€. μ£Όμν΄μΌκ² λ€.
κ²°λ‘
defaultValueκ° μλ κ²½μ°μ λ€μκ³Ό κ°μ΄ νμ.
required=true
(λλfalse
- μ€λ₯λ μλμ§λ§ μ£Όμ ν)non-nullable (e.g.,
String
)
defaultValueκ° μλ κ²½μ°μ λ€μκ³Ό κ°μ΄ νμ.
required=false
nullable (e.g.,
String?
)
@PathVariable
@PathVariable
μλ required
μ΅μ
μΌλ‘ null checkingμ μ§νν μ μλ€.
Java
λ³΄ν΅ @PathVariable
μ λ€μκ³Ό κ°μ΄ μ¬μ©νλ€.
μ¬μ€ μμ μμ λ₯Ό νμ©ν΄λ @PathVariable
μ optionalνκ² μ¬μ©νκΈ΄ μ΄λ ΅λ€. /posts
λ‘ μμ²νλ , /posts/
λ‘ μμ²νλ , ν΄λΉ URLλ‘ λ§€νλ 컨νΈλ‘€λ¬λ₯Ό μ°Ύμ§ λͺ»ν΄ 404 Not Found
κ° λ°νλ κ²μ΄λ€.
@PathVariable
μ required
μ΅μ
μ μ΅μ§λ‘ λ£μ΄λ³΄μλ©΄ λ€μκ³Ό κ°λ€.
@PathVariable
μ κ²½μ° defaultValue
λ μ§μνμ§ μλλ€.
Kotlin
Kotlinμμλ λ€μκ³Ό κ°μ΄ ν μ μκ² λ€.
μ°Έκ³ λ‘ required=true
, non-nullable
νμ
μΌλ‘ λ°κΏ¨μ λ λΉμ°ν id
λ₯Ό μ λ¬νμ§ μμΌλ©΄ idλ₯Ό μ λ¬νμ§ μλ κ²½μ°μ μ½λλ₯Ό μ€νμν¬ μ μμΌλ―λ‘ μλ―Έκ° μμ λΏ μλλΌ 500 Error
λ₯Ό λ°ννλ€.
μ΄λ° κ²½μ°μ κ·Έλ₯ λ°λ‘ 컨νΈλ‘€λ¬ λ©μλλ₯Ό νλ λ§λ€μ.
More on the matter
@RequestHeader
μ λν΄μλ μκ°νλ€.
REF
ν΄λΉ λΈλ‘κ·Έμμ λͺ¨λ λ΄μ©μ μ°Έκ³ νλ€.
Last updated
Was this helpful?