
/payment)에서 요청을 보냈는데, Duplicate entry '' for key 'PRIMARY' 에러 🥵[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'
SESSION_PRIMARY_ID가 여러 번 저장되려고 할 때 발생한다는 것을 알 수 있다.Duplicate entry '' for key 'PRIMARY' 에러는 중복된 기본 키(Primary Key) 값이 테이블에 삽입될 때 발생하는 오류다.Spring Boot + MySQL 환경에서 발생한 세션 중복 저장 문제를 해결하는 과정을 정리한다.paymentId를 세션에 저장하면서 동일한 값이 여러 번 삽입됨.SPRING_SESSION_ATTRIBUTES 테이블에서 같은 SESSION_PRIMARY_ID가 중복 삽입되면서 PRIMARY KEY 충돌 발생.HttpSession session = request.getSession();
session.setAttribute("paymentId", payment.getPaymentId()); // 중복 저장 문제 발생
✅ 세션 저장을 제거하고, @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 충돌 방지
| 문제 원인 | 해결 방법 |
|---|---|
| paymentId를 세션에 저장하면서 중복 삽입됨 | 세션 저장 제거 후 @RequestParam 방식으로 전달 |
| SPRING_SESSION_ATTRIBUTES 테이블에서 PRIMARY KEY 충돌 발생 | paymentId를 직접 HTTP 요청으로 전달하여 중복 저장 방지 |
Duplicate entry '' for key 'PRIMARY' 오류는 세션 중복 저장이 원인이다.paymentId를 세션에 저장했던 이유는 세션을 활용하면 사용자의 결제 데이터를 유지하면서 여러 페이지에서 일관된 값을 참조할 수 있기 때문이라고 생각했다. paymentId가 중복 저장되면서 PRIMARY KEY 충돌이 발생했다. paymentId를 전달하는 방식이 더 안정적인 해결방법이라는 것을 배우게 되었다.