개발 slecs

매뉴얼 화면에서 사이드바 메뉴가 뒤섞이던 모델 키 충돌 해결

목차

매뉴얼 자동 생성 화면을 손보다 이상한 현상을 만났음. 본문에 떠야 할 항목 리스트가 가끔 사이드바 메뉴로 둔갑함. 새로고침하면 또 바뀜. 캐시 의심부터 했지만 아니었음.

원인은 단순했음. 공통 인터셉터에서 모든 화면에 menuList 라는 이름으로 GNB/사이드바용 메뉴를 모델에 꽂아주고 있었음. 그런데 매뉴얼 생성기에서도 본문에 출력할 가이드 항목을 menuList 로 담고 있었음. 동일 키. 어느 쪽이 마지막에 들어가느냐에 따라 결과가 달라짐.

어떻게 해결했는가

이름만 바꾸면 끝나는 문제였음. 본문용은 manualMenuList 로 변경.

변수 의미 주입 위치
menuList GNB/사이드바 공통 메뉴 공통 인터셉터
manualMenuList 매뉴얼 본문 항목 매뉴얼 생성 컨트롤러
model.addAttribute("menuList", ...)        // 공통 메뉴 (전역)
model.addAttribute("manualMenuList", ...)  // 매뉴얼 전용

템플릿 쪽도 동일하게 바꿔주고, 매뉴얼 화면이 정상 렌더링되는지 확인. 한 줄짜리 fix 처럼 보이지만 의도치 않게 다른 화면을 망가뜨릴 수 있는 충돌을 끊어낸 변경이라 PR 사이즈에 비해 효과가 컸음.

회고 포인트

  • 공통 모델 키는 사실상 예약어임. 인터셉터/필터에서 자동 주입되는 키를 화면에서 다시 쓰면 충돌. 팀 내 공통 키 목록을 README 어딘가에 박아두는 게 나음.
  • 변수명에 도메인 접두어 붙이기. list, data, items, menuList 같은 일반 명사는 다른 곳에서 쉽게 겹침. manualXxx, partnerXxx 처럼 기능 접두어를 붙이면 충돌이 줄어듦.
  • 재현되는데 원인이 안 보일 땐 모델 덤프부터. 화면이 이상하면 컨트롤러 로직보다 모델에 무엇이 어떤 키로 들어갔는지를 먼저 찍는 게 빠름. 인터셉터의 부작용을 가장 빨리 잡는 길.

리뷰어 입장에서도 menuList 두 개를 동시에 보는 것보다 이름이 갈라져 있으면 PR 해석이 훨씬 쉬워짐. 작은 가드레일을 하나 친 셈.

다음

댓글 0

첫 댓글 달아줘.