카테고리 없음

🧨 [Spring MVC] 지출 등록 시 member_id 저장이 안 되는 문제 해결기 (세션 기반 로그인)

별초롱언니 2025. 7. 22. 17:30

💬 문제 상황

  • 지출 등록 폼에서 값을 입력하고 저장했을 때,
    member_id는 분명히 넘겼다고 생각했는데…
  • DB에 저장 안 됨!
  • 로그도 찍히고, 400도 아닌데…
  • 결국 500 Internal Server Error 💣

🧪 에러 로그

Cannot add or update a child row: a foreign key constraint fails (`wallet`, CONSTRAINT `fk_wallet_member` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`))
 

즉, member_id 값이 null이거나,
DB에 존재하지 않는 외래키 값이 넘어가고 있다는 뜻!

 

🧠 원인 분석

체크 포인트 상태
폼에 <input type="hidden" name="member_id" value="..."> 있음 ✅ 있음
Wallet 객체에 member_id 필드 있음 ✅ 있음
컨트롤러에서 @ModelAttribute Wallet wallet으로 받음 ✅ 정상 바인딩
member_id가 null 또는 0으로 넘어감 💣 문제 발생 포인트!
DB는 외래키로 연결된 member_id가 필요함 ❗ 실패

🕵️‍♀️ 그럼 왜 null로 들어갔을까?

문제의 원인은 바로 이거였음:

@RequestParam("member_id")로 넘기길 기대했지만,
사실 member_id는 로그인한 사용자 정보에서 꺼내야 하는 값이었다!

→ 근데 로그인 후에도 session.setAttribute("member_id", ...) 해주지 않아서
→ 세션에서 member_id를 꺼낼 수 없었고
→ 결국 폼에서 hidden 필드로도 제대로 못 넣음
→ insert 시 null 넘어감 → 💥 500 에러

 

✅ 해결 방법

1. 로그인 성공 시 세션에 member_id 저장

session.setAttribute("member_id", member.getId());
 
 

2. 폼 진입 시 세션에서 member_id 꺼내서 뷰에 전달

@GetMapping("/create") public String addWallet(HttpSession session, Model model) { Integer member_id = (Integer) session.getAttribute("member_id"); model.addAttribute("wallet", new Wallet()); model.addAttribute("memberId", member_id); // jsp로 전달 return "walletCreateForm"; }

 

3. JSP에서 hidden 필드에 세팅

<input type="hidden" name="member_id" value="${memberId}" />
 

4. 저장 시에도 세션에서 member_id 꺼내서 강제 세팅 (선택)

@PostMapping("/save") public String save(@ModelAttribute Wallet wallet, HttpSession session) { Integer member_id = (Integer) session.getAttribute("member_id"); wallet.setMember_id(member_id); walletService.save(wallet); return "redirect:/wallet"; }

 
 

✅ 결과

  • member_id가 정확하게 바인딩되어 DB에 잘 들어감
  • 500 에러 사라짐
  • URL에 ?member_id=... 같은 노출 없이 깔끔하게 처리 가능
  • 사용자 인증 기반 접근 제어까지 자연스럽게 해결 🎯

🧠 배운 점 정리

  • 🔒 로그인 기반 처리라면 파라미터로 넘기는 것보다 세션이나 인증 정보에서 꺼내는 구조가 더 안전
  • 🌐 URL 파라미터에 의존하면 쉽게 깨질 수 있음
  • 💥 500 에러 = 내부 코드 or DB 제약조건 문제! 로그부터 꼭 확인!
  • 🙆‍♂️ 세션 방식 정착하면 팀 프로젝트에서도 매우 유용함!