도입 배경
카카오 쇼핑 서비스를 연결 시 계정에 대한 정보가 들어가면서 쿠폰 시스템 또한 사용자 존재 여부 검증이 필요하다. 기존 시스템에서는 사용자 검증이 없어 유효하지 않은 사용자 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. 사용자 존재 여부를 미리 검증하지 않으면 어떤 문제가 발생하나요?
Related Posts
Search