Handling Null in URL
About
API๋ฅผ ๊ตฌํํ๋ค๋ณด๋ฉด /posts?type=notice
์ ?type=notice
, /posts/{id}
, ์์ id
์ฒ๋ผ URL์ ํตํด ๊ฐ์ ์ ๋ฌํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
Spring MVC์์๋ ์ปจํธ๋กค๋ฌ์์ ์์ฒญ์ผ๋ก ๋ค์ด์จ ํด๋น ๊ฐ๋ค์ ๊ฐ๊ฐ @RequestParam
, @PathVariable
์ด๋
ธํ
์ด์
์ ์ด์ฉํด ์ฐธ์กฐํ ์ ์๋ค.
@RequestParam
Java
Spring์ ์๋ฐ๋ก ์์ฑํ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์งํํ ์ ์์๋ค.
type
์ ์ค์ ๋ก null์ด ๋ค์ด์ฌ ์๋ ์๋ค. required=false
๋ฅผ ์ ๋ฌํด์ ํ์๊ฐ์ด ์๋์ ๋ช
์ํ๋ค. (๋ํดํธ๋ false
)
defaultValue
๋ก ๊ธฐ๋ณธ๊ฐ์ ์ ๋ฌํ ์ ์๋ค. (""
๋ก ๊ฐ์ธ์ค์ผ ํ๋ค.)
Kotlin
์ฝํ๋ฆฐ์์๋ ์ธ์ด ์ฐจ์์์ ํ์
๋ค์ ?
๋ฅผ ๋ถ์ด๋ ๊ฒ์ผ๋ก nullable ํ์
๊ณผ non-nullable ํ์
์ ๊ตฌ๋ถํ๊ณ (์์ ํ ๋ค๋ฅธ ํ์
์ด ๋๋ค), ํจ์์์ ๋ํดํธ ๊ฐ์ ์ง์ํ๋ค. ๋ํดํธ ๊ฐ์ ์ด๋ฐ ์์ผ๋ก ์ ๋ฌํ ์ ์๋ค.
sentence
๋ก ์๋ฌด๊ฒ๋ ์ ๋ฌ๋์ง ์์ผ๋ฉด =
๋ค์ ๋ํดํธ ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์คํ๋ง์์๋ ์ด ๊ธฐ๋ฅ์ ์์ฉํด์ 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
์ค๋๋ ๋์ ๋์ - (Kotlin) Request์์ Nullable? Non-Null?
@RequestHeader
์ ๋ํด์๋ ์๊ฐํ๋ค.
REF
Yoon Sung's Blog - RequestParam, PathVariable ์ ๋ํดํธ๊ฐ ๋ฃ์ด์ฃผ๊ธฐ
ํด๋น ๋ธ๋ก๊ทธ์์ ๋ชจ๋ ๋ด์ฉ์ ์ฐธ๊ณ ํ๋ค.
Last updated
Was this helpful?