본문 바로가기

개발기/Save The Bunnies

3편: 회원 관리 화면에서 만난 첫 삽질들

반응형

회원 관리 화면

GradeSelect, 계속 초기값으로 돌아오다

회원 목록에서 등급을 바꾸는 드롭다운(GradeSelect)을 만들었는데, 값을 바꿔도 화면이 원래 값으로 돌아오는 문제가 계속 났습니다. 커밋 로그를 보면 하루 동안 이 문제만 붙잡고 있었다는 게 그대로 드러납니다.

 
fix: 등급 변경 후 화면 갱신 수정
fix: 등급/역할 변경 후 화면 갱신 수정
fix: 등급 변경 후 화면 갱신 수정
fix: GradeSelect 초기값 수정
fix: GradeSelect 변경 후 값 유지 수정
fix: GradeSelect 컴포넌트 재작성
fix: GradeSelect 초기값 백엔드 응답값으로 설정

같은 문제를 다른 각도로 계속 건드린 흔적입니다. 결국 원인은 서버 컴포넌트가 내려준 초기값과 클라이언트 상태가 갱신 타이밍에 어긋나는 것이었고, 컴포넌트를 백엔드 응답값 기준으로 다시 짜면서 정리됐습니다.

돌아보면 이 시점에 로그를 남기는 습관(debug: 회원 관리 API 응답 로깅 추가 커밋)이 큰 도움이 됐습니다. 눈으로 코드만 보고 추측하는 것보다, 실제 응답값을 찍어서 확인하니 문제가 명확해졌습니다.

PostgreSQL이 검색어를 bytea로 착각하다

회원 이름 검색 기능에 키워드가 없을 수도 있는(optional) 파라미터를 그냥 JPQL LIKE로 넘겼더니 이런 에러가 났습니다.

 
character varying ~~ bytea 연산자가 존재하지 않습니다

파라미터가 null일 수 있는 상황에서 PostgreSQL + JPQL 조합이 파라미터 타입을 잘못 추론하는 문제였습니다. 대소문자 구분이 필요 없는 한글 검색이라 LOWER()도 안 썼는데 발생했습니다. 원인을 찾고 나서 정한 규칙은 명확합니다.

키워드가 optional(null 허용)인 검색은 JPQL이 아니라 Native Query(+ 필요하면 Projection)로 작성한다.

이 규칙은 이후 증상 마스터 검색, 가이드 검색 등 프로젝트 전반에 그대로 적용됩니다. 하나의 실수에서 컨벤션이 만들어진 셈입니다.

역할 REVOKE가 안 먹히는 문제

권한 회수(REVOKE)가 데이터베이스에 반영되지 않는 버그도 있었습니다. JPA 컬렉션을 다루는 방식이 문제였는데, UserRole 컬렉션에서 직접 제거하는 방식으로 바꾸면서 해결했습니다. 조회 시 등급이 안 나오는 문제도 비슷한 시기에 있었는데, AdminUserProjection + Native JOIN 쿼리로 N+1 없이 한 번에 가져오도록 정리했습니다.

이번 편 요약

  • GradeSelect 버그: 클라이언트-서버 상태 동기화 문제, 로깅으로 원인 파악
  • PostgreSQL bytea 에러: optional 파라미터는 Native Query로 — 프로젝트 전체 컨벤션이 됨
  • 역할 REVOKE 버그: 컬렉션 직접 조작 방식으로 수정

다음 편에서는

회원 관리 다음으로 만든 진짜 콘텐츠 기능 — 가이드 관리와 Quill 에디터 커스터마이징 이야기입니다.

반응형