[Project] ConstraintViolationError NPE ๋ฐ์
Categories: Project
๐ ๊ฐ์ธ์ ์ธ ๊ณต๊ฐ์ผ๋ก ๊ณต๋ถ๋ฅผ ๊ธฐ๋กํ๊ณ ๋ณต์ตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ธ๋ก๊ทธ์
๋๋ค.
์ ํํ์ง ์์ ์ ๋ณด๊ฐ ์์ ์ ์์ผ๋ ์ฐธ๊ณ ๋ฐ๋๋๋ค :๐ธ
[ํ๋ฆฐ ๋ด์ฉ์ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๋ณต๋ฐ์ผ์ค๊ฑฐ์์]
null
๊ฐ์ด ๋ค์ด์ค๋ ์ํฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํดConstraintViolationError
ํด๋์ค์์null
์"null"
๋ฌธ์์ด๋ก ๋ณํํด ์์ธ ๋ฉ์์ง์ ํฌํจ์ํค๋๋ก ์ฝ๋ ์์ . ์ด๋ฅผ ํตํดNullPointerException
๋ฐ์์ ๋ฐฉ์งํ๊ณ , ์๋ฏธ ์๋ ์์ธ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ ์ ์์๋ค.
์์ธ ์ฒ๋ฆฌ ์ ConstraintViolationError
์์ ํ๊ธฐ: NullPointerException ํด๊ฒฐ ๊ณผ์
ํ๋ก์ ํธ ์งํ ์ค, checkbox๋ก ํ๋ฒ์ ์์ ์์
์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ Dto๋ฅผ ์์ ํ๊ณ ์์๋ค.
PATCH
์์ฒญ์ผ๋ก List๋ก ๋ณด๋ผ ๋ ๋ฐ์ดํฐ๊ฐ ์ ์์ ๋๋์ง ํ์ธํ๊ธฐ ์ํด์ PATCH ์์ฒญ์ ๋ณด๋ธ๋ค๋ ๊ฒ์ด POST
์์ฒญ์ ๋ณด๋ด๋ ์ค์๋ฅผ ํ๊ณ , ๊ทธ๋ก ์ธํด ์์์น ๋ชปํ ์์ธ๊ฐ ๋ฐ์ํ๋ค.
์๊ทธ๋๋ ๋ฐ์ํ๋ ์ํ์ฝ๋ 500๋ฒ ์๋ฌ๋ ๋ค ์ก๊ณ ์ถ์ด์ ์๋์๋ค ์๊ฐํ๊ณ ๋๋ฒ๊น
์ ์งํํ ๊ฒฐ๊ณผ, ๋น์ฐํ postDto
์ ํ์ํ ํ๋๊ฐ ์์ด์ ๋ฐ์ํ ๋ฌธ์ ์๋ค.
๊ทผ๋ฐ ๋น์ฐํ dto๋ @Valid ์ ๋ํ ์ด์ ์ผ๋ก ์ ํจ์ฑ ๊ฒ์ฆ์ ํด์ ์ฌ๊ธฐ์ ์์ธ๋ฅผ ์ก์์ค ๊ฒ ๊ฐ์๋ฐ ์ ์์ก์์ฃผ์ง? ๋ผ๊ณ ์๊ฐ์ด ๋ค์ด์ ์ค๋ง @Valid ๋ @Validated๊ฐ ์๋ ๊ฑธ๊น ํ๊ณ ์๊ฐํ๊ณ ํ์ธํด๋ดค๋๋ฐ ๊ทธ ๋ฌธ์ ๋ ์๋์๋ค.
์์ธ ๋ฐ์ ์ ์๊ธฐ๋ ๋ฉ์ธ์ง๋ฅผ ๋ค์ ์ฝ์ด๋ณด๋ ConstraintViolation.getInvalidValue()
์ด
null
๋ก ๋ค์ด์์ ์๊ธด ๋ฌธ์ ์์ ํ์ธํ๋ค.
๋ฐ์ํ ๋ฌธ์ ์ : NullPointerException
๊ณผ ์์ธ ์ฒ๋ฆฌ
- ์ฆ
Exception
ํด๋์ค์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ์คValue
๊ฐnull
๋ก ๋ค์ด์ค๋ฉด์ ๋ฐ์ํ ๊ฒ - ๋ฌธ์ ๋
ConstraintViolation.getInvalidValue()
๊ฐnull
๊ฐ์ ๋ฐํํ๋ ๊ฒฝ์ฐ, ์ด๋ฅผ ์ฒ๋ฆฌํ์ง ๋ชปํดNullPointerException
์ด ๋ฐ์ํ๋ ๊ฒ์ด์๋ค. ์ด๋ ๋ฐ์ํ๋ ์์ธ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด,null
์ด ๋ค์ด์ค๋ ์ํฉ์์๋ ์ ์ ํ ์์ธ ๋ฉ์์ง๋ฅผ ๋ฐํํ ์ ์๋๋ก ํด์ผ ํ๋ค. - ๋ค์ ์๊ฐํด๋ณด๋ postDto๋ List๋ก ๋ค์ด์ค๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์๋ List๊ฐ ์๋์๊ธฐ ๋๋ฌธ์ ์ก์์คฌ๋ ์์ธ๋ฅผ ๋ณ๊ฒฝ๋๊ณ ๋์๋ ๋ชป์ก๋ ๊ฒ ๊ฐ์๋ค.
๋ฌธ์ ํด๊ฒฐ : ConstraintViolationError
ํด๋์ค ์์
์ฐ์ ErrorResponse
๋ด์ ConstraintViolationError
ํด๋์ค๋ฅผ ์์ ํ์ฌ, null
์ด ๋ฐ์ํ ๊ฒฝ์ฐ์๋ ์์ ํ๊ฒ ์ฒ๋ฆฌ๋ ์ ์๋๋ก ํ๋ค. ์ด๋ฅผ ์ํด getInvalidValue()
๊ฐ null
์ผ ๋๋ ์ด๋ฅผ ๋ฌธ์์ด "null"
๋ก ๋ณํํด ๋ฐํํ๋๋ก ์์ ํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Getter
public static class ConstraintViolationError {
private String propertyPath;
private String rejectedValue; // Use String to handle null gracefully
private String reason;
private ConstraintViolationError(String propertyPath, String rejectedValue, String reason) {
this.propertyPath = propertyPath;
this.rejectedValue = rejectedValue;
this.reason = reason;
}
public static List<ConstraintViolationError> of(
Set<ConstraintViolation<?>> constraintViolations) {
return constraintViolations.stream()
.map(constraintViolation -> {
// ์์ ํ ๋ถ๋ถ
String invalidValue = (constraintViolation.getInvalidValue() == null)
? "null" // Handle null safely
: constraintViolation.getInvalidValue().toString(); // Convert null values to "null"
//์ฌ๊ธฐ๊น์ง
return new ConstraintViolationError(
constraintViolation.getPropertyPath().toString(),
invalidValue,
constraintViolation.getMessage()
);
}).collect(Collectors.toList());
}
}
getInvalidValue()
์์ ๋ฐํ๋๋ ๊ฐ์ดnull
์ผ ๊ฒฝ์ฐ, ์ด๋ฅผ"null"
๋ฌธ์์ด๋ก ์ฒ๋ฆฌํ๊ณ ์ด๋ก ์ธํดNullPointerException
์ด ๋ฐ์ํ์ง ์๊ณ ์๋ฏธ ์๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ ์ ์์๋ค.- ์ด์ ์๋
null
๊ฐ์ผ๋ก ์ธํด ์์ธ ๋ฉ์์ง๊ฐ ์ ๋๋ก ์ ๋ฌ๋์ง ์์๋ค๋ฉด, ์ด์ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋"null"
์ด๋ผ๋ ๋ฌธ์์ด์ด ๋ฉ์์ง๋ก ์ ๋ฌ๋์ด ์์ธ ์ํฉ์ ๋ช ํํ ์ ์ ์๊ฒ ๋์๋ค. null
๊ฐ์ด ๋ฐํ๋๋๋ผ๋ ์ค๋ฅ ๋ฉ์์ง๊ฐ ์ ์์ ์ผ๋ก ๋ฐํ๋๊ธฐ ๋๋ฌธ์, ์ฝ๋์ ์ ์ฐ์ฑ๊ณผ ์์ ์ฑ์ด ํฅ์๋์๋ค. ์์ธ ์ฒ๋ฆฌ๋ฅผ ๋ ์ ์ฐํ๊ฒ ํ ์ ์๊ณ , ์์์น ๋ชปํ ์์ธ ์ํฉ์์๋ ์ฝ๊ฒ ๋ฌธ์ ๋ฅผ ํ์ ํ ์ ์๋ค. ๊ตฟ๊ตฟ
ํด๊ฒฐ
์ด๋ฌํ ๋ณ๊ฒฝ์ ํตํด ConstraintViolation.getInvalidValue()
์์ null
๊ฐ์ด ๋ฐํ๋ ๋ ๋ฐ์ํ๋ NullPointerException
์ ๋ฐฉ์งํ ์ ์์๋ค. ์์ธ ์ฒ๋ฆฌ ๋ก์ง์ ์์ ํจ์ผ๋ก์จ, ๋ ์์ ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ๋์์ผ๋ฉฐ, null
๊ฐ ์ฒ๋ฆฌ ์์๋ ์๋ฏธ ์๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐํํ ์ ์๋๋ก ๊ฐ์ ํ๋ค.
์ด๋ฒ ๋ฌธ์ ํด๊ฒฐ ๊ณผ์ ์ ์ ํจ์ฑ ๊ฒ์ฌ์์ ๋ฐ์ํ๋ ์์ธ ์ํฉ์ ๋ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณ ๋ฏผํ ๊ธฐํ๊ฐ ๋์๊ณ , ์ด๋ฅผ ํตํด ์ค์๋ฅผ ์ค์ด๊ณ ์์ธ ์ํฉ์์ ๋ ๋์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ ์ ์์๋ค.
Leave a comment