Search

[Applicaion]17.카카오쇼핑 연동: coupon-core: 사용자 검증 로직 추가

Publish Date
2024/11/27
Tags
Status
Done
1 more property
사용자 검증 로직 추가
사용자 검증 로직은 유효하지 않은 사용자 ID로 인한 데이터베이스 오류를 방지하기 위해 도입한다. 이를 통해 쿠폰 발급 요청 시 정상 사용자만 처리되도록 하여 시스템의 안정성과 데이터 무결성을 확보하는 것이 목표이다.
Table of Content

도입 배경

카카오 쇼핑 서비스를 연결 시 계정에 대한 정보가 들어가면서 쿠폰 시스템 또한 사용자 존재 여부 검증이 필요하다. 기존 시스템에서는 사용자 검증이 없어 유효하지 않은 사용자 ID가 쿠폰 발급 요청에 포함되었고, 이로 인해 coupon-consumer 에서 데이터베이스 외래 키 제약 조건 오류가 발생하였다. 이를 해결하기 위해 사용자 검증 로직을 추가하여 유효하지 않은 사용자의 쿠폰 요청을 사전에 필터링하고 안정적인 시스템 운영을 목표로 한다.
coupon-consumer 에러메시지

사용자 검증 로직

사용자 검증 로직은 쿠폰 발급 요청 시 유효한 사용자 ID인지 확인하여 잘못된 요청을 사전에 차단한다. 이를 통해 데이터베이스의 외래 키 제약 조건 오류를 방지하고 시스템의 안정성과 데이터 무결성을 보장한다.

구조 및 구현

coupon-BE/ ├── coupon-core/ │ ├── src/main/java/com/example/couponcore/ │ │ ├── model/ │ │ │ └── User.java │ │ ├── repository/ │ │ │ └── mysql/ │ │ │ └── UserJpaRepository.java │ │ ├── service/ │ │ │ └── AsyncCouponIssueServiceV2.java │ │ └── exception/ │ │ └── ErrorCode.java
Java
복사
파일명
내용
User.java
user_tb 테이블과 매핑되는 사용자 엔티티 클래스
UserJpaRepository.java
JPA를 통해 사용자 존재 여부를 확인하는 인터페이스
AsyncCouponIssueServiceV2.java
사용자 존재 여부를 검증하고 쿠폰 발급 요청을 처리
ErrorCode.java
사용자 검증 실패 시 반환할 오류 코드 INVALID_USER_ID를 정의

소스코드

User.java
user_tb 테이블과 매핑되는 사용자 엔티티로, 사용자 정보를 정의한다.
package com.example.couponcore.model; import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter @NoArgsConstructor @Entity @Table(name = "user_tb") // user_tb 테이블과 매핑 public class User { // v3.2 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본 키 자동 생성 private Long id; @Column(nullable = false, unique = true, length = 100) private String email; @Column(nullable = false, length = 256) private String password; @Column(nullable = false, length = 45) private String username; @Column(nullable = true, length = 30) private String roles; }
Java
복사
UserJpaRepository.java
사용자 ID의 존재 여부를 확인하는 JPA 인터페이스이다.
package com.example.couponcore.repository.mysql; import com.example.couponcore.model.User; import org.springframework.data.jpa.repository.JpaRepository; public interface UserJpaRepository extends JpaRepository<User, Long> { // v3.2 }
Java
복사
AsyncCouponIssuServeciV2.java
사용자 검증 로직 validateUserIdExists를 추가하여 존재하지 않는 사용자 ID로 쿠폰 발급 요청을 처리하지 않도록 방지한다. 이를 통해 데이터베이스의 외래 키 제약 조건 오류를 사전에 방지한다.
package com.example.couponcore.service; ... import com.example.couponcore.repository.mysql.UserJpaRepository; // v3.2 validation userIdExists import static com.example.couponcore.exception.ErrorCode.INVALID_USER_ID; @RequiredArgsConstructor @Service public class AsyncCouponIssueServiceV2 { ... private void validateUserIdExists(long userId) { // v3.2 validation userIdExists boolean exists = userJpaRepository.existsById(userId); // userRepository를 통해 존재 여부 확인 if (!exists) { throw new CouponIssueException(INVALID_USER_ID, "존재하지 않는 사용자 ID입니다: %d".formatted(userId)); } } }
Java
복사
항목
설명
validateUserIdExists
사용자 ID가 존재하는지 UserJpaRepository를 통해 확인 존재하지 않으면 예외 발생
예외 처리
존재하지 않는 사용자 ID일 경우 INVALID_USER_ID 오류 코드
ErrorCode.java
사용자 검증 실패 시 반환할 오류 코드를 정의한다.
package com.example.couponcore.exception; public enum ErrorCode { ... INVALID_USER_ID("존재하지 않는 사용자 ID입니다."); public final String message; ErrorCode(String message) { this.message = message; } }
Java
복사

결과

사용자 검증 로직이 추가됨으로써 쿠폰 발급 요청 시 유효하지 않은 사용자를 사전에 차단할 수 있다. 이는 데이터베이스의 무결성을 보장하고 외래 키 제약 조건으로 발생하는 시스템 오류를 예방한다. 시스템 성능에 크게 영향을 미치지 않으면서도 안정적인 서비스 운영이 가능해졌다.

Q&A

Q. 사용자 검증이 추가되면서 성능 저하가 발생하지 않나요?
Q. 사용자 존재 여부를 미리 검증하지 않으면 어떤 문제가 발생하나요?
Search
Main PageCategoryTagskkogggokkAbout MeContact