카테고리 없음
🧨 [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 제약조건 문제! 로그부터 꼭 확인!
- 🙆♂️ 세션 방식 정착하면 팀 프로젝트에서도 매우 유용함!