์ด๋ฒ ํฌ์คํธ๋ ์ค์ ํ๋ก์ ํธ์์ ๊ตฌํํ ์ ์ ์ ๋ณด ์์
์์ฒญ์ ๋ํ ๋ด์ฉ์ ์์๋ก ์์ฑํ์๋ค.
ํํ ์์ญ์ ์ฌ์ฉ์๊ฐ ์ด์ฉํ๋ ํ๋ฉด๊ณผ ๊ทธ ํ๋ฆ์ ์ ๊ณตํ๊ณ , ์ฌ์ฉ์์ ์์ฒญ์ ์์ฉ ์๋น์ค์ ์ ๋ฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค ๋ฐ์ ๋ค์ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ค. ์ฌ์ฉ์์ ์์ฒญ๋ฅผ ์ ๋ณํํ์ฌ ์์ฉ ์๋น์ค์ ๋ฉ์๋ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํด์ฃผ๋ ์ญํ ์ ํ๋ค.
ํด๋น ์์ญ์์ ์๋น์ค์ ์ฃผ์ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ ธ์ถ๋์ด์๋ ์๋๋ค. ๊ณ์ธต ๊ฐ ์์กด์ฑ์ด ๋๋ฌด ๋์์ง๊ธฐ๋ ํ๊ณ , ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ํธ๋์ญ์ ๋จ์๋ก ์ด๋ฃจ์ด์ ธ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ ์์๋ ์ ์ ์ ๋ณด ์์ ์์ฒญ์ ๋ํ ํํ ์์ญ ์ฝ๋์ด๋ค.
@Operation(summary = "์ ์ ์ ๋ณด ์์ ")
@CachePut(value = USER_KEY, key = "#user.getId()", cacheManager = "cacheManager")
@PatchMapping(value = "", produces = "application/json; charset=utf-8")
@ResponseBody
public CommonResponse editUserAccount(@AuthenticationPrincipal User user,
@Valid @RequestBody UserRequest.EditAccountRequest request) {
var userCommand = userRequestMapper.of(request);
var userResult = userFacade.editUserAccount(user, userCommand);
var response = userResponseMapper.of(userResult);
return CommonResponse.onSuccess(response);
}
์ง๊ด์ ์ธ ๋ค์ด๋ฐ์ผ๋ก Facade์์ ๋ฌด์์ ํ๋์ง ํ์ ํ ์๋ ์์ง๋ง, ์ ํํ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋๋ฉ์ธ ๋ก์ง์ ํ๋ฆ์ด ๋ ธ์ถ๋์ง ์์์์ ํ์ธํ ์ ์๋ค.
ํด๋น ๋ฉ์๋์์๋ @AuthentcationPrincipal์ ํตํด ์ด๋ฏธ JWT ํ ํฐ ๋ณตํธํ๋ก ์ป์ ์ ์ ์ ๋ณด์ ์์ ํ๊ณ ์ ํ๋ ์ ๋ณด request๊ฐ RequestBody๋ก ํจ๊ป ์์ฒญ๋๋ค. Mapper ํ์ฉ์ ํตํด Request์ Response๊ฐ ๊ฐ ๊ณ์ธต ๊ฐ ๊ทธ๋ฆฌ๊ณ ๋ฆฌ์คํฐ์ค๋ก ๋ฐํ ๋ ๋ ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ด๊ฒจ ์ ๋ฌ๋๋ค.
์์ฉ ์์ญ์ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ก๋ถํฐ ๋ค์ด์จ ์์ฒญ์ Controller๊ฐ ํด์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์๋ง๊ฒ ๋๊ฒจ์ฃผ๋ฉด ๊ทธ์ ๋ฐ๋ผ ์ํํ ์์ ์ ์ ์ํ๊ณ ๋๋ฉ์ธ ์๋น์ค๋ฅผ ํธ์ถํ๋ค.
์์ฉ ์๋น์ค์ ์ฃผ๋ ์ญํ ์ ๋๋ฉ์ธ ๊ฐ์ฒด ๊ธฐ๋ฐ์ ๋ก์ง์ ํ๋ฆ์ ์ ์ดํ๋ ๊ฒ์ด๋ค. ์์๋ก ๋๋ฉ์ธ ์๋น์ค ํธ์ถ ์ดํ ๋ณ๊ฐ๋ก ์๋ฆผ์ ๋ณด๋ด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์๋ฆผ ์๋น์ค๋ฅผ ํด๋น ๊ณ์ธต์์ ํธ์ถํ๋ค.
์๋ ์์๋ ์ ์ ์ ๋ณด ์์ ์์ฒญ์ ๋ํ ์์ฉ ์์ญ ์ฝ๋์ด๋ค.
public UserInfo.Main editUserAccount(User user, UserCommand.EditAccountRequest request) {
return userService.editUserAccount(user, request);
}
ํด๋น ๋ ์ด์ด๋ ์์ฃผ ์์ ๋ ์ด์ด๋ก ๊ฐ๋จํ๊ฒ ์๋น์ค๋ฅผ ํธ์ถํ๊ณ ๊ทธ ๊ฐ์ ๋ฐํํด์ค๋ค.
๋๋ฉ์ธ ์์ญ์์ ์ด์ ์์ญ๋ค์์ ์ด๋ฃจ์ด์ง์ง ์๋ ์ค์ํ ๋น์ฆ๋์ค ๋ก์ง๋ค์ด ์ด๋ฃจ์ด์ง๋ค.
Entity๊ฐ ์ ์๋์ด ์๋ ์์ญ์ด๋ฉฐ, Infrastructure ์์ญ์์ ๊ตฌํ๋๋ ๊ธฐ๋ฅ์ ํ์ฉํ๊ธฐ ์ํ ์ฝ๊ธฐ, ์ฐ๊ธฐ ์ญํ ์ ์ธํฐํ์ด์ค๊ฐ ์ ์๋์ด ์๋ค. ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์จ ๋ค, ๊ธฐ๋ฅ์ ๋ง๊ฒ ์ฌ์ฉํ์ฌ ๋ก์ง์ ์ฒ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์์ฉ ์์ญ์ ๋๊ฒจ ์ค๋ค.
๋๋ฉ์ธ ๋ก์ง์ ์์ฉ ์๋น์ค์์ ํํ๋ ๊ฒฝ์ฐ์๋ ์ฝ๋์ ์์ง์ฑ๋ ๋ฎ์์ง๊ณ ์ค๋ณต ์ฝ๋๊ฐ ๋ฐ์ํ ์ ์์ด ๊ธฐํผํด์ผ ํ๋ค.
private final UserStore userStore;
@Override
@Transactional
public UserInfo.Main editUserAccount(User user, UserCommand.EditAccountRequest request) {
user.editAccount(request);
userStore.store(user);
return userInfoMapper.of(user);
}
์ ์ ๊ฒ์ฆ์ JWT ํ ํฐ์ผ๋ก ์ ์ ๋ฅผ ์ธ์ฆํ๋ ๊ณผ์ ์์ ์งํ๋์ด ์๋ตํ์๋ค.
Store๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ์ฌ infrastructure ์์ญ์์ ๋ณ๊ฒฝ๋ user ๊ฐ์ฒด๋ฅผ ์ ์ฅํด์ค๋ค. ์ดํ Mapper๋ฅผ ํตํด ํด๋น ์ํฐํฐ๋ฅผ DTO๋ก ๊ฐ์ธ ์์ฉ ์์ญ์ผ๋ก ์ ๋ฌํ๋ค.
๋๋ฉ์ธ ๊ฐ์ฒด์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋ก์ง์ editAccount
์์ ํํด์ง๋ฉฐ ๋ค์๊ณผ ๊ฐ๋ค.
public void editAccount(UserCommand.EditAccountRequest request) {
updateName(request.getName());
updatePlan(request.getPlan());
}
public void updateName(String name) {
if (name != null) {
this.name = name;
}
}
public void updatePlan(String plan) {
if (plan != null) {
this.plan = PlanStatus.valueOf(plan);
}
}
๊ฐ์ฅ low level ๊ตฌํ์ฒด๋ก ๊ธฐ์ ์ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํ๋ค. DIP ๊ฐ๋ ์ ํ์ฉํ์ฌ domain ๊ณ์ธต์์ ์ถ์ํ ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
Repository๊ฐ ์์นํ๋ฉฐ, ๊ทธ ์ธ์๋ ๋๋ฉ์ธ ๊ณ์ธต์์ ์ ์ ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ Repository๋ฅผ ํธ์ถํ๋ค. ์์์์๋ UserStore๊ฐ ์ธํฐํ์ด์ค์ ํด๋นํ๋ฉฐ, ์ธํ๋ผ์คํธ๋ญ์ฒ ์์ญ์์ UserStoreImpl์ด๋ผ๋ ๊ตฌํ์ฒด๋ฅผ ์์ฑํด์ฃผ์๋ค.
private final UserRepository userRepository;
@Override
public User store(User user) {
return userRepository.save(user);
}
DB์ ACID ์ฑ์ง ๋ณด์ฅ์ ์ํด @Transactional ์ด๋ ธํ ์ด์ ์ผ๋ก ๊ฐํธํ๊ฒ ํธ๋์ญ์ ์ฒ๋ฆฌํ์๋ค.
์ฌ์ฉ์๋ก๋ถํฐ ์์ฒญ ๋ฐ๊ณ ๋ฐํ ๋๋ Request์ Response๋ Presentation Layer์ ์๋ฆฌํ๋ค. ๊ทธ ์ธ์ Domain ์์ญ์์ ์ํฐํฐ๋ฅผ ๋ค๋ฅธ ๊ณ์ธต์ ๋๊ธธ ๋ ๊ฐ์ธ๊ธฐ ์ํด ์ฌ์ฉํ๋ DTO๋ ์ ๋ถ Domain ์์ญ์ ์ ์๋์๋ค.
ํํ ์์ญ์์๋ ๋จ์ํ ๊ฐ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค๋ฉด, ๋๋ฉ์ธ ์๋น์ค๋ ๊ฐ์ด ํด๋น ๋๋ฉ์ธ์ ๋ง๋ ์ ํจํ ๊ฐ์ธ์ง ๊ฒ์ฆํ๋ ๊ณผ์ ์ด ํ์ํ๋ค. ์๋์ ๊ฐ์ด ์๋ ์์ผ ๋ ์ง ์คํธ๋ง์ด ์ ํจํ ๋ ์ง ๊ฐ์ธ์ง ๊ฒ์ฆํ๊ฑฐ๋, ์ถ๊ฐ๋ก 100์ด ๋ฏธ๋ง์ธ์ง ๋ฑ์ ๊ฒ์ฆํ๊ธฐ๋ ํ์๋ค.
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
dateFormat.setLenient(false);
try {
dateFormat.parse(userTypeRequest.getBirthday());
} catch (ParseException e) {
throw new BadRequestException(ErrorCode.INVALID_BIRTHDAY.getErrorCode());
}