상황
기능 테스트를 위해 신규 가입 및 로그인 후 직접 포인트 충전 api를 호출했는데, "포인트 정보를 찾을 수 없다"는 에러가 발생했다.
그동안 서버 시작 시 사전에 입력한 sql 쿼리문을 통해 등록한 유저로 테스트할 때는 문제가 없었지만, jwt 구현 이후에는 토큰을 넣어줘야 하기 때문에 Postman으로 처음 시도하는 과정에서 에러를 맞닥트린 것이다.
에러 메시지를 보니 토큰 문제는 아니고, 요청 형식이 잘못된 것도 아니다.

원인 분석
먼저 해당 에러 메시지는 POINT_NOT_FOUND의 에러 메시지이며, PointService의 charge() 메서드를 실행하는 과정에서 발생한 것이다.

사용자가 충전 요청을 보내면 서버는 사용자의 id를 바탕으로 userPointRepository를 조회하는데, 조회 결과가 존재하지 않으면 해당 에러를 반환하도록 설계했다. 이 에러가 반환된 원인은 사용자의 id를 가지고 있는 user_point 데이터가 없기 때문이다.
아래 DB에서 위 2개는 서버 시작과 동시에 SQL 쿼리문을 통해 자동 생성한 사용자이고, 아래 2개는 포스트맨에서 jwt 구현 이후 직접 회원가입한 사용자(각각 USER, ADMIN 권한)이다.

문제는 사용자가 생성될 때 user_point도 자동으로 생성돼야 하는데, 그렇지 않아서 사용자는 있는데 지갑이 없어 돈을 넣어줄 수 없는 상황이 된 것이다.

결론
user 생성과 동시에 user_point가 생성되도록 설계하지 않아 발생한 설계적 결함이다.
아래처럼 user가 생성될 때 user_point가 생성되도록 조치했다.

인사이트
지금까지는 사용자의 포인트 잔액을 사용자의 필드로 관리했기 때문에 이럴 일이 없었지만, 이번 프로젝트는 특별히 별도의 테이블로 관리하게 되면서 이런 문제가 발생했다. 이처럼 동시에 형성돼야 하지만 기술적 고려에 의해 별도의 테이블로 생성되는 관계에 있는 엔티티들을 설계할 때는, 주의 사항에 반드시 명기하도록 해야겠다.
'Projects > [Spring] Coffee Shop Project' 카테고리의 다른 글
| [JWT] 현재 인증 방식 분석 — 완전한 Stateless인가? (0) | 2026.04.05 |
|---|---|
| [트러블슈팅] : Redis 캐시 역직렬화 실패 - 기본 생성자가 없는 경우 (0) | 2026.04.05 |
| [트러블슈팅] Spring Boot 4.x 업그레이드 시 Jackson 패키지 변경 주의하기 (0) | 2026.04.05 |
| [트러블슈팅] UnnecessaryStubbingException 해결하기 (0) | 2026.04.05 |
| [트러블슈팅] soft delete된 메뉴의 인기 랭킹 처리, 어떻게 할까? (0) | 2026.04.05 |