JPA @Column(โ€ฆ nullable=false) VS @NotNull

ํ•ญ์ƒ Entity ํด๋ž˜์Šค ์˜ต์…˜์—์„œ null์ด๋ฉด ์•ˆ ๋˜๋Š” ๊ฐ’์„ ์ง€์ •ํ•ด์ค„ ๋•Œ, JPA @Column ์• ๋…ธํ…Œ์ด์…˜์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” nullabe๊ณผ javax.validation.constraints์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” @NotNull ์• ๋…ธํ…Œ์ด์…˜ ์ค‘ ์–ด๋Š ๊ฑธ ์จ์•ผํ•˜๋‚˜ ๊ณ ๋ฏผ์ด์—ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์•Œ์•„์•ผ ํ•  ๊ฑด, nullable=false๋Š” DDL์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์œผ๋กœ Entity๋ฅผ ์ด์šฉํ•ด ํ…Œ์ด๋ธ”์„ ์ •์˜ํ•  ๋•Œ not null ์˜ต์…˜์„ ๋ถ™์—ฌ์ฃผ๊ธฐ๋งŒ ํ•  ๋ฟ, Entity ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ํ•ด๋‹น ํ•„๋“œ ๊ฐ’์— ๋Œ€ํ•œ validation ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€๋Š” ์•Š๋Š”๋‹ค. (@NotNull์„ ์‚ฌ์šฉํ•ด๋„ Hibernate์—์„œ๋Š” ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•  ๋•Œ, not null์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค) ์ฆ‰ nullable=false๋Š” ํ•ด๋‹น ํ•„๋“œ๊ฐ€ null์ธ Entity๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ๋Š” ์•„๋ฌด๋Ÿฐ ์ œ์•ฝ์ด ์—†์œผ๋ฉด, ํ•ด๋‹น Entity๊ฐ€ DB์— insert๋  ๋•Œ ์˜ˆ์™ธ๋ฅผ ๋งž์„ ์ˆ˜ ์žˆ์–ด ์œ„ํ—˜ํ•˜๋‹ค. ํ•˜์ง€๋งŒ @NotNull ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด, DB์— SQL ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. JPA์˜ Repository๊ฐ€ ์ž˜๋ชป๋œ Entity๋ฅผ ์ €์žฅํ•  ๋•Œ, ConstraintViolationException์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ์ด ๊ธฐ๋Šฅ ๋•๋ถ„์— @Valid๋‚˜ @Validated ์—†์ด๋„ Entity๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ์ฝ”๋“œ๋‹จ์—์„œ not null ์ œ์•ฝ์„ ๊ฑธ์–ด์ค„ ๋•Œ๋Š” nullable=false๋ณด๋‹ค๋Š” @NotNull์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ ๊ถŒ์žฅํ•œ๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ