500 Error : Duplicate entry '' for key 'PRIMARY'

심진주·2025년 2월 17일

  • 카페24로 배포한 사이트에서 오랜만에 테스트를 하고 있었는데 500에러..
  • 결제 페이지(/payment)에서 요청을 보냈는데, Duplicate entry '' for key 'PRIMARY' 에러 🥵
  • SQLIntegrityConstraintViolationException → 세션 저장 중 중복된 키가 삽입되면서 충돌한 것으로 보인다
[ErrorPageFilter:182] - Forwarding to error page from request [/payment] due to exception [PreparedStatementCallback; SQL [INSERT INTO SPRING_SESSION_ATTRIBUTES (SESSION_PRIMARY_ID, ATTRIBUTE_NAME, ATTRIBUTE_BYTES)
VALUES (?, ?, ?)
]; Duplicate entry '8dde9dd7-9a12-44cb-9fd9-492eb7551fdc' for key 'PRIMARY']
org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT INTO SPRING_SESSION_ATTRIBUTES (SESSION_PRIMARY_ID, ATTRIBUTE_NAME, ATTRIBUTE_BYTES)
VALUES (?, ?, ?)
]; Duplicate entry '8dde9dd7-9a12-44cb-9fd9-492eb7551fdc' for key 'PRIMARY'
.
.
.
Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '8dde9dd7-9a12-44cb-9fd9-492eb7551fdc' for key 'PRIMARY'
  • log를 보니 SESSION_PRIMARY_ID가 여러 번 저장되려고 할 때 발생한다는 것을 알 수 있다.

🚨 Duplicate entry '' for key 'PRIMARY' 에러 해결 방법 (MySQL & Spring Boot)

  • MySQL에서 Duplicate entry '' for key 'PRIMARY' 에러는 중복된 기본 키(Primary Key) 값이 테이블에 삽입될 때 발생하는 오류다.
  • Spring Boot + MySQL 환경에서 발생한 세션 중복 저장 문제를 해결하는 과정을 정리한다.

1. 문제 원인

  • paymentId를 세션에 저장하면서 동일한 값이 여러 번 삽입됨.
  • MySQL의 SPRING_SESSION_ATTRIBUTES 테이블에서 같은 SESSION_PRIMARY_ID가 중복 삽입되면서 PRIMARY KEY 충돌 발생.

📌 오류 발생 코드

HttpSession session = request.getSession();
session.setAttribute("paymentId", payment.getPaymentId()); // 중복 저장 문제 발생

2. 해결 방법

✅ 세션 저장을 제거하고, @RequestParam을 통해 paymentId를 전달하는 방식으로 변경

📌 수정된 코드

// ❌ 세션 저장 제거
// HttpSession session = request.getSession();
// session.setAttribute("paymentId", payment.getPaymentId());

// ✅ 요청 파라미터로 paymentId 전달
@GetMapping("/payment/order_detail")
public String orderDetail(
    Model model,
    HttpServletRequest request,
    @SessionAttribute("memberInfo") Member memberInfo,
    @RequestParam("paymentId") Integer paymentId, // 요청 파라미터로 받음
    @RequestParam("cart_id") List<Integer> cartIds
) {

📌 이렇게 변경하면 세션 중복 저장 문제 해결 → PRIMARY KEY 충돌 방지


3. 정리

문제 원인해결 방법
paymentId를 세션에 저장하면서 중복 삽입됨세션 저장 제거 후 @RequestParam 방식으로 전달
SPRING_SESSION_ATTRIBUTES 테이블에서 PRIMARY KEY 충돌 발생paymentId를 직접 HTTP 요청으로 전달하여 중복 저장 방지

✅ 최종 결론

  • Duplicate entry '' for key 'PRIMARY' 오류는 세션 중복 저장이 원인이다.
  • 세션을 사용하지 않고, 요청 파라미터를 통해 paymentId를 전달하면 문제 해결 가능! 🚀

4. 마무리

  • paymentId를 세션에 저장했던 이유는 세션을 활용하면 사용자의 결제 데이터를 유지하면서 여러 페이지에서 일관된 값을 참조할 수 있기 때문이라고 생각했다.
  • 하지만, 실제로는 동일한 paymentId가 중복 저장되면서 PRIMARY KEY 충돌이 발생했다.
  • 결과적으로 세션을 사용하지 않고, 요청 파라미터를 통해 paymentId를 전달하는 방식이 더 안정적인 해결방법이라는 것을 배우게 되었다.

0개의 댓글