개발 환경
- OS: macOS Big Sur 11.5.2
- IDE: RubyMine 2023.1.2
- Ruby: ruby 2.6.9p207 (2021-11-24 revision 67954) [x86_64-darwin20]
- Ruby on Rails: Rails 5.2.6.2
- SCM: git version 2.40.1
상황 설명
외래키(foreign key)를 가지고 있는 테이블에서 외래키 값이 NULL인 데이터를 업데이트하고자 할 때 UPDATE 구문이 실행 후 ROLLBACK되는 현상을 확인하였다. 좀 더 확인해보니 기존에 있는 데이터뿐만 아니라 새로운 데이터에 외래키를 NULL로 하려고 해도 오류가 나는 상태였다. 간단하게 예를 들면 팀과 직원이라는 Entity가 있을 때 팀이 없는 직원은 생성과 수정이 안되는 상태였다.
브라우저 상의 응답코드는 422 Unprocessable Entity. 자주 만나는 오류는 아니라 검색해보니 "서버가 요청을 이해하고 요청 문법도 올바르지만 요청된 지시를 따를 수 없음"을 의미한다고 한다. 서버에 찍히는 오류 로그도 응답 코드와 동일했다.
# 서버 로그
Completed 422 Unprocessable Entity in 44.83ms
해결 과정
DB에는 Nullable 설정이 되어 있었기 때문에 서버 상에서 외래키가 NULL이 되는 걸 방지하는 것으로 예상되었다. 코드 내 연관관계 로직과 관련 설정들을 주로 검색해보았고 스택오버플로우에서 답을 찾을 수 있었다. 레일즈 5부터는 belongs_to 연관관계 설정 시 required 옵션이 기본으로 설정되어 별도로 optional 설정을 하지 않으면 NULL 입력이 제한된다고 한다. 레일즈 버전이 변경되면서 생긴 오류로 예상되었고 아래와 같이 optional: true 추가한 후 정상동작을 확인하였다.
belongs_to :team, class_name: team.name, foreign_key: "team_no", optional: true
참고 자료 및 사이트
- https://stackoverflow.com/questions/10462676/best-practice-about-empty-belongs-to-association