문제 상황
- User와 UserCategory 간의 단방향 일대다 관계에서 사용자 관심 카테고리 수정 시 "Column 'user_id' cannot be null" 에러가 발생했습니다.
- 첫 번째 수정은 정상 동작하지만 두 번째 수정부터 에러가 발생하는 문제였습니다.

원인 분석
- 단방향 일대다 관계에서 Hibernate는 다음 순서로 SQL을 실행합니다:
- 새로운 레코드 삽입
- 기존 레코드의 외래키를 NULL로 설정 (여기서 에러 발생)
- NULL인 레코드들 삭제
- 자식 엔티티(UserCategory)가 부모 엔티티(User)에 대한 참조를 모르기 때문에 외래키가 있는 테이블을 직접 제어할 수 없어 이런 방식으로 처리됩니다.
애그리거트 설계 관점
- UserCategory는 User 없이는 의미가 없는 엔티티로, 생성/수정/삭제가 모두 User에 의해 결정됩니다.
- 독립 애그리거트로 분리하면 DDD 애그리거트 경계 위반과 트랜잭션 일관성 문제가 발생하고, 비즈니스 로직이 서비스 계층으로 분산됩니다.
- User가 UserCategory의 생명주기를 완전히 관리하는 단일 애그리거트가 더 적합한 구조입니다.
해결 방법
- 단방향 관계를 양방향 관계로 전환했습니다:
- UserCategory에 User 참조 추가:
@ManyToOne
관계 설정
- User에서
mappedBy = "user"
설정으로 UserCategory가 관계의 소유자임을 명시
- 양방향 관계에서는 기존 레코드를 직접 삭제한 후 새 레코드를 삽입하여 NULL UPDATE 단계가 제거됩니다.
결과
- NULL 제약조건 위반 에러가 완전히 해결되었고, 효율적인 SQL 생성으로 불필요한 UPDATE 쿼리가 제거되었습니다. User가 UserCategory의 생명주기를 완전히 관리하는 애그리거트 패턴을 유지하면서 기술적 제약을 해결할 수 있었습니다.