심화 프로젝트 트러블 슈팅

JangUT·2024년 11월 29일

  1. 환전 요청이라는 중간 Entity를 만들어서 1 : N , N : 1 관계를 형성하여 참조 관계 형성-

    -> 강의 내용을 바탕으로 어렵지 않게 해결

  1. 환전 요청시 환전을 요청하는 사람과 어떤 종류의 통화로 환전할지 결정

-> RequestMapping시 ("/users/{uesrId}/currencies/{currencyId}/") 설정하고

각각 HTTP Method를 활용하여 Mapping 시도

-> postman 실행시 다음과 같이 JSON 작성

{
	"beforeExchangeAmount" : 1000
}

반환 값으로는 userId, currencyId, afterExchangeAmount, status 반환

{
	"userId" : 1,
    "currencyId" : 1,
    "afterExchangeAmount" : 720.00,
    "status" : "NORMAL
}

정상적으로 실행 되는 것처럼 보였으나 환전 요청을 하지 않은 유저가 환전 요청 조회시

값이 정상적으로 출력됨 status 또한 환전 요청시 NORMAL로 요청

-> 입력시에 userId, currencyId, status 추가

{
	"userId" : 1,
    "currencyId" : 1,
    "beforeExchangeAmount" : 1000,
    "status" : "NORMAL
}

반환 값

{
	"userId" : 1,
    "currencyId" : 1,
    "afterExchangeAmount" : 720.00,
    "status" : "NORMAL
}

-> 생성된 유저 고유 식별 아이디로 조회 시 요청하지 않은 유저는 환전 요청 조회 실패

-> postman 정상적으로 작동

환전 시 BigDecimal 타입에 대한 지식부족으로 구글링 시도

-> 소수점 자리 표현 및 반올림을 위해 필요한 타입

환전된 금액을 계산하기 위해 [환율 * 환전전 금액] 계산

-> BigDecimal 과 Double 타입 맟춰주기

Formatter 를 이용하여 숫자 타입을 문자 타입 변환 후 금액(국가 화폐)으로 표기

-> print(Number Object, locale locale)

환전 요청 후에 반환값 오류 발생

->

{
    "userId" : 1,
    "currencyId" : 1,
    "beforeExchangeAmount" : 1000,
    "status" : "NORMAL"
}

다음과 같이 beforeExchangeAmount 값을 입력하고 postman을 실행해주면

{
    "exchangeId": 1,
    "userId": 1,
    "currencyId": 1,
    "beforeExchangeAmount": 1000.0,
    "afterExchangeAmount": 518.40,
    "status": "NORMAL"
}

이러한 반환 값을 추출

-> beforeExchangeAmount 금액이 커지면 오류 코드 반환

{
    "userId" : 1,
    "currencyId" : 1,
    "beforeExchangeAmount" : 4000,
    "status" : "NORMAL"
}
{
    "errorCode": "Character , is neither a decimal digit number, decimal point, nor \"e\" notation exponential mark."
}

이과 같이 오류 코드가 반환 된다.

-> 예외 예시에 맞게 수정

-> 로그는 정상적으로 기록되어서 어떤문제인 발견하지 못함.

-> 유효성 검사 하는 Layered는 Service

-> 해당 Layer 에서 이메일 형식과, 환전 금액 형식 Validation 진행

예외 처리 코드는 GlobalExceptionHandler 클래스 생성 후에

ExceptionHandler로 오류 메세지 반환할 IllegalArgumentException 오류 코드를 작성 후에

코드 작성

@ExceptionHandler(ResponseStatusException.class)
   public ResponseEntity<Map<String, String>> handlerResponseStatusException(ResponseStatusException ex) {

       Map<String, String> response = new HashMap<>();
       response.put("errorCode", ex.getMessage());

       return ResponseEntity
               .status(HttpStatus.NOT_FOUND)
               .body(response);
   }

실제 반환 코드를 예시에 맞게 작성.

reponse.put("errorCode", ex.getMessage());
reponse.put("errorMessage", ex.getMessage());

이과 같이 추가 후에

return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);

코드 실행 시

{
    "errorMessage": "요청값이 형식에 맞지 않습니다.",
    "errorCode": "ERR002"
}

프로젝트 진행시 어려웠던 점 :

일단 기본적인 CRUD에 대한 이해는 많이 향상됐습니다.

이번 프로젝트를 통해서 연관 관계 설정하는 법도 이해 됐습니다.

유효성 검사에서 이메일을 검증하는 방식과 일자 데이터 및 길이 등등 Validation 에 대한 개념이 아직 부족한 것 같습니다. PostConstruct도 적용해보려 했지만 작성한 코드가 실제로 구현되지는 않는 것 같습니다. 환전 시 국가 코드 및 숫자를 금액형태로 바꾸는 것 또한 아직 이해가 부족한 것 같습니다.
그래도 이번엔 제 기준에선 필수까지 어느정도 구현한 것 같아서 만족합니다.

profile
평범한 개발자

0개의 댓글