γλλ©μΈ μ£Όλ κ°λ° μμνκΈ°γ6μ₯ μμ© μλΉμ€μ νν μμ
π 6.1. νν μμκ³Ό μμ© μμ
μ¬μ©μ -> νν μμ -> μμ© μμ -> λλ©μΈ μμ
νν μμμ μ¬μ©μμ μμ²μ ν΄μν¨.
μμ© μμμ μ€μ μ¬μ©νμ μνλ κΈ°λ₯μ μ 곡ν¨.
μ¬μ©μμ μνΈμμ©μ νν μμμ΄ μ²λ¦¬νκΈ° λλ¬Έμ, μμ© μλΉμ€λ νν μμμ μμ‘΄νμ§ μμ.
μμ© μμμ μ¬μ©μκ° μΉ λΈλΌμ°μ λ₯Ό μ¬μ©νλμ§ REST APIλ₯Ό νΈμΆνλμ§, TCP μμΌμ μ¬μ©νλμ§ μ νμκ° μμ.
π 6.2. μμ© μλΉμ€μ μν
μμ© μλΉμ€λ μ¬μ©μκ° μμ²ν κΈ°λ₯μ μ€νν¨. μ΄λ₯Ό μν΄ λ¦¬ν¬μ§ν°λ¦¬μμ λλ©μΈ κ°μ²΄λ₯Ό κ°μ Έμ μ¬μ©νλ€.
μμ© μλΉμ€μ ꡬ쑰
public Result doSomeFunc(SomeReq req){
//1. 리ν¬μ§ν°λ¦¬μμ μ 그리거νΈλ₯Ό ꡬνλ€.
SomeAgg agg = someAggRepository.findById(req.getId());
checkNull(agg);
//2. μ 그리거νΈμ λλ©μΈ κΈ°λ₯μ μ€ννλ€.
agg.doFunc(req.getValue());
//3. κ²°κ³Όλ₯Ό 리ν΄νλ€.
return createSuccessResult(agg);
}
μλ‘μ΄ μ 그리거νΈλ₯Ό μμ±νλ μμ© μλΉμ€μ ꡬ쑰
public Result doSomeCreation(CreateSomeReq req){
//1. λ°μ΄ν° μ€λ³΅ λ± μ ν¨νμ§ κ²μ¬
validate(req);
//2. μ κ·Έλ¦¬κ±°νΈ μμ±
SomeAgg newAgg = createSome(req);
//3. 리ν¬μ§ν°λ¦¬μ μ 그리거νΈλ₯Ό μ μ₯
someAggRepository.save(newAgg);
//4. κ²°κ³Όλ₯Ό 리ν΄
return createSuccessResult(newAgg);
}
μμ© μλΉμ€λ νΈλμμ μ²λ¦¬λ λ΄λΉνλ€. νΈλμμ λ²μμμ μμ© μλΉμ€λ₯Ό μ€νν΄μΌ νλ€.
6.2.1. λλ©μΈ λ‘μ§ λ£μ§ μκΈ°
λλ©μΈ λ‘μ§μ λλ©μΈ μμκ³Ό μμ© μλΉμ€μ λΆμ°ν΄μ ꡬννλ©΄ μ½λ νμ§μ λ¬Έμ κ° λ°μν¨.
1. μ½λμ μμ§μ±μ΄ λ¨μ΄μ§.
λλ©μΈ λ°μ΄ν°μ κ·Έ λ°μ΄ν°λ₯Ό μ‘°μνλ λλ©μΈ λ‘μ§μ΄ ν μμμ μμΉνμ§ μκ³ μλ‘ λ€λ₯Έ μμμ μμΉνλ€λ κ²μ λλ©μΈ λ‘μ§μ νμ νκΈ° μν΄ μ¬λ¬ μμμ λΆμν΄μΌ νλ€λ κ²μ μλ―Έν¨.
2. μ¬λ¬ μμ© μλΉμ€μμ λμΌν λλ©μΈ λ‘μ§μ ꡬνν κ°λ₯μ±μ΄ λμμ§.
π 6.3. μμ© μλΉμ€μ ꡬν
6.3.1. μμ© μλΉμ€μ ν¬κΈ°
- ν μμ© μλΉμ€ ν΄λμ€μ νμ λλ©μΈμ λͺ¨λ κΈ°λ₯ ꡬννλ λ°©λ²
λμΌνλ λ‘μ§μ μν μ½λ μ€λ³΅μ μ κ±°νκΈ° μ½λ€λ μ₯μ , μλΉμ€ ν΄λμ€μ ν¬κΈ°κ° 컀μ§λ€λ λ¨μ .
- ꡬλΆλλ κΈ°λ₯ λ³λ‘ μλΉμ€ ν΄λμ€λ₯Ό ꡬννλ λ°©λ²
ν΄λμ€ κ°μ λ§μμ§μ§λ§ μ½λ νμ§μ μΌμ μμ€μΌλ‘ μ μ§νλ λ° λμμ΄ λ¨.
λμΌν λ‘μ§μ ꡬνν κ²½μ° λ³λ ν΄λμ€μ λ‘μ§μ ꡬνν΄μ μ½λ μ€λ³΅μ λ°©μ§.
6.3.2. μμ© μλΉμ€μ μΈν°νμ΄μ€μ ν΄λμ€
μμ© μλΉμ€λ₯Ό ꡬνν λ μΈν°νμ΄μ€κ° νμνκ°?
μΈν°νμ΄μ€κ° λͺ ννκ² νμνκΈ° μ κΉμ§λ μμ© μλΉμ€μ λν μΈν°νμ΄μ€λ₯Ό μμ±νλ κ²μ΄ μ’μ μ νμ΄λΌκ³ λ³Ό μλ μλ€.
ν μ€νΈ μ£Όλ κ°λ°μ μ¦κ²¨ νλ€λ©΄ μΈνΈνμ΄μ€λ₯Ό μ΄μ©ν΄μ 컨νΈλ‘€λ¬μ ꡬνμ μμ±ν΄ λκ° μ μλ€.
6.3.3. λ©μλ νλΌλ―Έν°μ κ° λ¦¬ν΄
6.3.4. νν μμμ μμ‘΄νμ§ μκΈ°
μμ© μλΉμ€μ νλΌλ―Έν° νμ μ νν μμκ³Ό κ΄λ ¨λ νμ μ μ¬μ©νλ©΄ μ λλ€.
μλ₯Ό λ€μ΄ HttpServletRequestλ HttpSessionμ μμ© μλΉμ€μ νλΌλ―Έν°λ‘ μ λ¬νλ©΄ μ λ¨.
6.3.5. νΈλμμ μ²λ¦¬
@Transactionalμ΄ μ μ©λ λ©μλκ° RuntimeExceptionμ λ°μμν€λ©΄ νΈλμμ μ λ‘€λ°±νκ³ κ·Έλ μ§ μμΌλ©΄ 컀λ°νλ―λ‘ μ΄ κ·μΉμ λ°λΌ μ½λλ₯Ό μμ±νλ©΄ νΈλμμ μ²λ¦¬ μ½λλ₯Ό κ°κ²°νκ² μ μ§ν μ μλ€.
π 6.4. νν μμ
μ± μ
1. μ¬μ©μκ° μμ€ν μ μ¬μ©ν μ μλ νλ¦(νλ©΄)μ μ 곡νκ³ μ μ΄
2. μ¬μ©μμ μμ²μ μλ§μ μμ© μλΉμ€μ μ λ¬νκ³ κ²°κ³Όλ₯Ό μ¬μ©μμκ² μ 곡
3. μ¬μ©μμ μΈμ μ κ΄λ¦¬
//νλ μμν¬ μ 곡 κΈ°λ₯ μ¬μ©νλ©΄ νλΌλ―Έν°λ₯Ό ChangePasswordRequest chPwdReqμΌλ‘ μλ° κ°μ²΄λ₯Ό λ°λ‘ μμ±ν μλ μμ
@PostMapping()
public String changePassword(HttpServletRequest request, Errors errors){
//νν μμμ μ¬μ©μ μμ²μ μμ© μλΉμ€κ° μꡬνλ νμμΌλ‘ λ³νν¨.
String curPw = request.getParameter("curPw");
String newPw = request.getParameter("newPw");
String memberId = SecurityContext.getAuthentication().getId();
ChangePasswordRequest chPwdReq =
new ChangePasswordRequest(memberId, curPw, newPw);
try{
//μμ© μλΉμ€ μ€ν
changePasswordService.changePassword(chPwdReq);
return successView;
}catch(BacPasswordException | NoMemberException ex){
//μμ© μλΉμ€μ μ²λ¦¬ κ²°κ³Όλ₯Ό μλ§μ μλ΅μΌλ‘ λ³ν
errors.reject("idPasswordNotMatch");
return formView;
}
}
+ μλΉμ€μ μ€ν κ²°κ³Όλ₯Ό μ¬μ©μμκ² μλ§μ νμμΌλ‘ μ 곡νλ κ²λ νν μμμ λͺ«
+ μ¬μ©μμ μ°κ²° μνμΈ μΈμ κ΄λ¦¬
π 6.5. κ° κ²μ¦
μμΉμ μΌλ‘ λͺ¨λ κ°μ λν κ²μ¦μ μμ© μλΉμ€μμ μ²λ¦¬.
μ¬μ©μκ° μ¬λ¬ κ°μ μ λ ₯ν΄μΌ ν λ, μμ© μλΉμ€μμ μλ¬ μ²λ¦¬λ₯Ό ν΄λ²λ¦¬λ©΄ 첫 λ²μ¬ κ°μ΄ μ¬λ°λ₯΄μ§ μμ μ΅μ μ μ΄ λ°μνλ©΄ λλ¨Έμ§ νλͺ©μ λν΄μλ κ²μ¬νμ§ μκ² λ¨. -> μλͺ»λ λͺ¨λ κ°μ νμΈν μ μλλ‘ νλ λ°©λ².
@Transactional
public OrderNo placeOrder(OrderRequest orderRequest){
List<ValidationError> errors = new ArrayList<>();
if(orderRequest == null){
errors.add(ValidationError.of("empty");
} else {
if(orderRequest.getOrdererMemberId() == null)
errors.add(ValidationError.of("ordererMemberId", "empty"));
if(orderRequest.getOrderProducts() == null)
errors.add(ValidationError.of("orderProducts", "empty"));
if(orderRequest.getOrderProducts().isEmpty())
errors.add(ValidationError.of("orderProducts", "empty"));
}
//μμ© μλΉμ€κ° μ
λ ₯ μ€λ₯λ₯Ό νλμ μ΅μ
μ
μΌλ‘ λͺ¨μμ λ°μ
if(!errors.isEmpty()) throw new ValidationErrorException(errors);
...
}
νν μμμμ νμ κ°κ³Ό κ°μ νμμ κ²μ¬νλ©΄ μ€μ§μ μΌλ‘ μμ© μλΉμ€λ id μ€λ³΅ μ¬λΆμ κ°μ λ Όλ¦¬μ μ€λ₯λ§ κ²μ¬νλ©΄ λλ€.
π 6.6. κΆν κ²μ¬
λ³΄ν΅ λ€μ μΈ κ³³μμ κΆν κ²μ¬λ₯Ό μνν μ μλ€.
- νν μμ
- μμ© μλΉμ€
- λλ©μΈ
1. νν μμμμ ν μ μλ κΈ°λ³Έμ μΈ κ²μ¬λ μΈμ¦λ μ¬μ©μμΈμ§ μλμ§ κ²μ¬νλ κ².
urlμ μ²λ¦¬νλ 컨νΈλ‘€λ¬μ μΉ μμ²μ μ λ¬νκΈ° μ μ μΈμ¦ μ¬λΆλ₯Ό κ²μ¬ν΄μ μΈμ¦λ μ¬μ©μμ μΉ μμ²λ§ 컨νΈλ‘€λ¬μ μ λ¬νλ€, μΈμ¦λ μ¬μ©μ μλ κ²½μ° λ‘κ·ΈμΈ νλ©΄μΌλ‘ 리λ€μ΄λ νΈνλ€.
-> μλΈλ¦Ώ νν° Servlet Filter. μ€νλ§ μν리ν°λ μ΄μ μ μ¬ν λ°©μμΌλ‘ νν°λ₯Ό μ΄μ©ν΄ μΈμ¦ μ 보 μμ±νκ³ μΉ μ κ·Όμ μ μ΄.
2. URL λ§μΌλ‘ μ κ·Ό μ μ΄λ₯Ό ν μ μλ κ²½μ° μμ© μλΉμ€μμ λ©μλ λ¨μλ‘ κΆν κ²μ¬.
μλ₯Ό λ€λ©΄ μ€νλ§ μν리ν°μ @PreAuthorize μ λν μ΄μ .
3. κ°λ³ λλ©μΈ κ°μ²΄ λ¨μλ‘ κΆν κ²μ¬.
μ΄ν΄λκ° λμ§ μμ νλ μμν¬ νμ₯μ μνλ μμ€μΌλ‘ ν μ μλ€λ©΄ νλ μμν¬λ₯Ό μ¬μ©νλ λμ λλ©μΈμ λ§λ κΆν κ²μ¬ κΈ°λ₯μ μ§μ ꡬννλ κ²μ΄ μ½λ μ μ§ λ³΄μμ μ 리νλ€.
π 6.7. μ‘°ν μ μ© κΈ°λ₯κ³Ό μμ© μλΉμ€
μ‘°νλ₯Ό μν μμ© μλΉμ€κ° λ¨μ§ μ‘°ν μ μ© κΈ°λ₯μ μ€ννλ μ½λλ°μ μλ€λ©΄ μμ© μλΉμ€λ₯Ό μλ΅ν΄λ 무방ν¨.