통화를 추가해 주기 위해 Controller에 PostMapping으로 메서드를 만들고 로직을 구성했다. RequestDTO를 통해서 요청값을 입력하고 DB에 저장됨과 동시에 ResponseDTO를 통해서 응답을 해주는 식이다.
201 Created와 함께 잘 작동하는 구나 하고 넘겼는데.. DB를 보니 null값이 들어와있다..
다시 보니 응답값에도 "exchangeRate"가 null로 찍힌 모습이 보인다.
어디가 문제일까 다시 코드를 보면서 찾아봤는데 RequestDTO 필드 이름도, Controller나 Service 클래스에서도 딱히 문제라고 생각될만 한 건 찾지 못했다. 그리고 다시 postman 화면을 보는데 .. 문제는 여기 있었다.
요청 시 "exchangeRate"라고 적어줘야 하는데 오타가 나는 바람에 "exchangeRage"라고 입력되었다..
오타를 인지하고 알맞게 수정해주었다. 이 것 때문에 소중한 시간을 몇 분이나 소비했는지.. 슬프다 ㅠ 오타에 조금 더 신경써야겠다.
예상대로 제대로 된 응답 값을 받을 수 있었다.
DB에 통화를 저장하고 한번 더 동일한 값으로 요청을 했더니 id는 다르지만 동일한 값이 저장되어서 환전 API를 요청했을 때 제대로 된 값을 얻지 못했다.
동일한 통화가 여러 개 저장된 모습
환전 요청 API 예외 발생
동일한 값이 저장되어서 환전을 할 때 어떤 값으로 계산 로직을 수행해야 하는지 모호해서 발생하는 문제라고 생각되었다.
유니크 설정을 통해 동일한 값이 저장되지 못하도록 처리하였다.
500 Internal Server Error와 함께 값이 중복되었다는 메시지를 출력하고 있다. 실제로 DB를 확인해봤더니 저장되지 않았다. 하지만 또 다른 문제가 발생했다.
UNIQUE 설정으로 인해 값이 저장되지 않도록 했지만 동일한 값을 저장하려고 시도할 때 id값은 올라가는 문제였다. 사진을 보면 다음에 저장한 KRW의 id가 2가 아니라 3으로 저장된 모습을 볼 수 있다.
JPA는 @GeneratedValue 어노테이션을 통해 기본 키 값을 자동 생성한다. 이 때 사용하는 생성 전략(GenerationType)에 따라 ID 값이 증가하는 방식이 달라진다.
IDENTITY 전략을 사용하면 아래와 같이 작동한다.
데이터베이스에 삽입하기 전에 어플리케이션 레벨에서 유효성 검사를 수행해 중복 데이터를 방지할 수 있다.
저장하는 부분에 유효성 검사를 하고 만약에 중복된 데이터가 있다면 사용자 예외를 발생시키도록 구현하였다.
다시 같은 통화를 생성하려고 했을 때 400 Bad Request와 함께 예외 메시지를 출력하고 있다.
데이터베이스를 체크해보면 id값을 건너뛰지 않고 순차적으로 잘 저장된 모습을 볼 수 있다.