ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ค
DTO์ ์ํฐํฐ ์ค validation์ ์ด๋์ ๊ฑธ์ด์ผ ํ ๊น?
DDD๋ฅผ ๋์ ํ๋ ์ด๊ธฐ ๋จ๊ณ์ฌ์ ๊ทธ๋ฐ์ง ์๊ฐ์ ์ง๋ฌธ์ด ๊ณ์ํด์ ๋ค์๋ค.
์ฑ ์์ ๋ฐฐ์ด ๊ฑธ ๋ ์ฌ๋ ธ์ ๋์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ์ ์ ๋ํ ๊ฒ์ฆ์ ์ปจํธ๋กค๋ฌ ์ด์ ์ธ DTO์์ ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค.
- ๋น์ฆ๋์ค์ ์ธ ์ ํจ์ฑ ๊ฒ์ฆ์ domain ์ํฐํฐ์์ ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค.
ํ์ง๋ง ์๋ ๋์์๋ค์ํผ ๋น์ฆ๋์ค ๊ท์น์ ๊ฒ์ฆํ๊ธฐ๊ฐ ์ฌ์์น ์๋ค๋ฉด ๋๋ฉ์ธ ์ํฐํฐ ์ฌ์ฉ์ ์ ์ฌ์ฉํด๋ ๋๋ค.
๊ทธ๋์ ๊ฒฐ๋ก ์ ๋ด๋ฆฐ ๊ฒ ์ ๋ ฅ๋ช ๊ธธ์ด๋ ํ์๊ฐ์ DTO์์ ์ฒ๋ฆฌํ๊ธฐ๋ก ํ๋ค.
๋ค์์ ์์ ์ ๋ง๋๋ DTO ์์ ์ฝ๋์ ๊ฐ๋ค.
import lombok.Builder;
import lombok.Getter;
import net.logstash.logback.util.StringUtils;
import javax.validation.constraints.*;
@Getter
public class StoreCreateDto {
@NotBlank(message = "[์์ ๋ช
]์ ํ์๊ฐ์
๋๋ค.")
@Size(max = STORE_NAME_MAX_LENGTH, message = "[์์ ๋ช
]์ 50์๋ฅผ ์ด๊ณผํ ์ ์์ต๋๋ค.")
private final String name;
@Pattern(regexp = PHONE_NUMBER_PATTERN, message = "์ฌ๋ฐ๋ฅธ ์ ํ๋ฒํธ ํ์์ด ์๋๋๋ค. 02-1234-1234์ ๊ฐ์ ํ์์ผ๋ก ์
๋ ฅํด ์ฃผ์ธ์.")
private final String contact;
@NotNull(message = "[์์ ์ ํ]์ ํ์๊ฐ์
๋๋ค.")
private final StoreType type;
private final StoreAddress address;
@AssertFalse(message = "[์ฐํธ๋ฒํธ]๋ ํ์๊ฐ์
๋๋ค.")
private boolean isNullZipcode() {
return StringUtils.isBlank(address.getZipcode());
}
@AssertFalse(message = "[์ฃผ์]๋ ํ์๊ฐ์
๋๋ค.")
private boolean isNullMainAddress() {
return StringUtils.isBlank(address.getMainAddress());
}
@AssertFalse(message = "[์ฃผ์]๋ 100์๋ฅผ ์ด๊ณผํ ์ ์์ต๋๋ค.")
private boolean isValidMainAddress() {
return address.getMainAddress().length() > MAIN_ADDRESS_MAX_LENGTH;
}
@AssertFalse(message = "[์์ธ์ฃผ์]๋ 60์๋ฅผ ์ด๊ณผํ ์ ์์ต๋๋ค.")
private boolean isValidSubAddress() {
return !StringUtils.isBlank(address.getSubAddress())
&& address.getSubAddress().length() > SUB_ADDRESS_MAX_LENGTH;
}
}
๐ค
DTO ํ์ ์ List์ ๋ํ validation์ ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
๋ ๋ฒ์งธ ๋ค๋ค๋ณผ ๋ด์ฉ์ DTO ํ์ ์ List์ ๋ํ validation์ ์ด๋ป๊ฒ ํ ๊น์ด๋ค.
validationํ๋ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์๊ฐํ๋ ค๊ณ ํ๋ค.
[1]. inner static class๋ก ์ด์ฉ
๋ด๋ถ ํด๋์ค DTO๋ฅผ ๊ฐ์ธ๋ List<DTO>๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
@Getter
@NoArgsConstructor
public class StoreUpdateListDto {
List<@Valid StoreUpdateDto1> listDto;
public static class StoreUpdateDto1 {
// ...
}
}
์ฅ์
- DTO ๊ฐ์๋ฅผ ์ค์ผ ์ ์๋ค.
๋จ์
- ์ดํํฐ๋ธ ์๋ฐ์์๋ ๋ด๋ถ ํด๋์ค๋ ๋๋๋ก static์ผ๋ก ๋ง๋ค๋ผ๊ณ ๋์์๊ธด ํ๋ฐ, ์ค์ฒฉ ํด๋์ค๋ ์์ ์ ๊ฐ์ผ ๋ฐ๊นฅ ํด๋์ค์๋ง ์ฐ์ฌ์ผ ํ๋ฉฐ, ๊ทธ ์ธ์ ์ฐ์์๊ฐ ์๋ค๋ฉด ํฑ๋ ๋ฒจ ํด๋์ค๋ก ๋ง๋ค์ด์ผ ํ๋ค๊ณ ๋ ๋์์๋ค.
- ์ฆ, ๋์ค์ ์ ์ง๋ณด์๊ฐ ํ๋ค์ด์ง๋ค.
[2]. DTO 2๊ฐ ์์ฑ
DTO ํ๊ฐ, ๊ทธ DTO๋ฅผ ๊ฐ์ธ๋ List<DTO> ์ด ๋ ๊ฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
@Getter
@NoArgsConstructor
public class StoreUpdateListDto {
List<@Valid StoreUpdateDto> listDto;
}
@Getter
public class StoreUpdateDto {
// ...
}
์ฅ์
- DTO์ ์ฌ์ฉ ๋ชฉ์ ์ ๋ถ๋ฆฌํ ์ ์๋ค.
- ์์ฒญ์ผ๋ก ๋ฐ์ StoreUpdateListDto๋ ์์ฒญ ์คํ์ผ๋ก์์ ์ญํ
- StoreUpdateDto๋ ์์์ ๊ฒ์ฆ๋ ๊ฑธ ์ฌ์ฉํ๋ DTO๋ก์์ ์ญํ
๋จ์
- DTO ๊ฐ์๊ฐ ๋ง์์ง ์ ์๋ค.
[3]. List๋ฅผ ๊ตฌํํ๋ ValidList ์์ฑ
validation์ด ํ์ํ List์๋ List๊ฐ ์๋ ValidList๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
List์ Valid ์ด๋ ธํ ์ด์ ๊ณผ Delegate ์ด๋ ธํ ์ด์ ์ ๋ถ์ธ ValidList๋ฅผ ๋ง๋ ๋ค.
@Getter
public class ValidList<E> implements List<E> {
@Valid
@Delegate
private List<E> list;
public ValidList() {
this.list = new ArrayList<>();
}
public ValidList(List<E> list) {
this.list = list;
}
}
@PutMapping("")
public ResponseEntity<?> updateStore(@Valid @RequestBody ValidList<StoreUpdateDto> storeDtos) {
List<String> ids = storeService.updateStores(storeDtos);
return ResponseEntity.ok().body(new CommonResponse(new DataResponse<>(ids)));
}
์ฅ์
- DTO ๊ฐ์๋ฅผ ์ค์ผ ์ ์๋ค.
๋จ์
- list๊ฐ ์๋๋ผ map์ด๋ set์ผ๋ก ๋ฐ๊ฒ ๋๋ฉด ๊ทธ๊ฒ๋ Valid-๋ฅผ ๋ค ๋ง๋ค์ด์ผ ํจ.
'๊ฐ๋ฐ ๋ ธํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JpaRepository ํ๋ผ๋ฏธํฐ Mocking ์ NullPointerException (0) | 2023.01.09 |
---|---|
์ฟผ๋ฆฌ ์คํธ๋ง ๋ง๋ค๊ธฐ (0) | 2023.01.02 |
์ด ๋ก์ง์ ๋๋ฉ์ธ ์์ญ์ผ๊น? ์ ํ๋ฆฌ์ผ์ด์ ์์ญ์ผ๊น? (0) | 2022.08.07 |
python์ผ๋ก ํด๋น ์์ ๋ช ์ฃผ์ฐจ์ธ์ง ๊ตฌํ๊ธฐ (2) | 2022.01.09 |
[git] branch ์ ๋ต - git flow (0) | 2020.01.11 |
- Total
- Today
- Yesterday
- Effective Java
- Spring
- ๋ฐฑ์ค
- JPA
- C++
- node.js
- BOJ
- ๋์์ธ ํจํด
- ์ดํฉํฐ๋ธ ์๋ฐ
- ํ ๋ผํผ
- ์ฝํ
- kkoon9
- ํ๋ก๊ทธ๋๋จธ์ค
- MSA
- programmers
- ์ดํํฐ๋ธ ์๋ฐ
- ํด๋ฆฐ ์ํคํ ์ฒ
- Spring Boot
- ํด๋ฆฐ ์ฝ๋
- AWS
- BAEKJOON
- Java
- Olympiad
- Kotlin
- ์ ๊ทํํ์
- ๋์์ธํจํด
- kotest
- Algorithm
- ์๊ณ ๋ฆฌ์ฆ
- ๊ฐ์ฒด์งํฅ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |