이전에 새로 설계한 모델에 맞춰서 JPA 의 엔티티도 새로 구현하였다.

사실 DDL 을 먼저 작성해서 인덱스나 UNIQUE 제약조건 부터 확실하게 정하고 가는게 맞아보이긴 하지만 아직 물리적 모델링을 배운 상태가 아니라서 일단은 엔티티부터 구현하였다.

인덱스는 JPA 엔티티 구현에서는 크게 신경쓰지 않아도 되고, UNIQUE 제약 조건도 굳이 JPA 엔티티에 모두 표현하기보다는 단일 컬럼에 대한 UNIQUE 제약조건 정도만 표현해놓는 편이라서 구체적인 사항들은 나중에 DDL 을 정의하면서 결정해도 충분하다고 판단하였다.

엔티티 설계

첫번째로는 JPA 엔티티의 핵심적인 설계들을 설명하겠다.

일단 엔티티의 내용들은 설계했던 모델과 똑같으므로 굳이 다시 설명하지는 않고, JPA 엔티티를 구현하면서 바뀐 부분 위주로 설명하겠다.

또한 모델의 설계는 아니지만 코드 입장에서도 약간 변경이 있었다.

문자열 필드가 비어있을때 NULL VS 빈 문자열

이전에 엔티티 모델 재설계 1편에서는 선택적 문자열 필드가 비어있다면 NULL 로 표현하는 것이 좋겠다고 말했는데, 좀 더 고민해보니 이 부분도 상황에 따라 조금씩 달라질 것 같았다.

일단 소설/회차의 소개, 유저의 자기소개 같은 컬럼은 사실 비어있냐 비어있지 않냐 정도만 판단되면 충분하다. 만약 설명이 비어있는 소설의 수치를 파악해 설명을 작성하도록 유도하는 문구를 넣을 지 말지 결정해야 한다고 해도 그냥 빈 문자열의 수치를 계산하면 된다.

하지만 만약 추천인 코드나 가입시에 특별 코드를 입력하면 포인트를 더 준다거나 하는 비즈니스 요구사항이 있으면, 존재하지 않는다는 것을 단순하게 빈 문자열로 표현하는 것 보다는 NULL 로 표현하는게 더 명확할수도 있다.

예를 들어 !specialCode.isEmpty() 보다는 specialCode != null 이 조금 더 코드가 존재한다는 것을 드러내기 좋다.

그래서 이런식으로 문자열은 상황에 따라 조금 다를 것 같다고 생각하였다. 지금 내 서비스의 소설, 회차, 유저의 소개들은 굳이 NULL 과 빈 문자열을 구분하여 표현할 정도로 비어있다 라는 상태가 중요하지는 않다고 보고, 그냥 비어있으면 무조건 빈 문자열을 넣도록 결정하였다.

사실 이런 부분을 생각하게 된 이유는 선택적 업데이트를 지원하는 도메인 메서드를 만들면서 생긴 문제 때문이었다. 보통 클라이언트에서 수정 요청을 보낼 때 설명이 수정되지 않았다면 요청에 포함하지 않고, 수정되었다면 NULL 혹은 빈 문자열로 필드를 설정해 보내게 된다.

이럴 때 선택적 업데이트를 구현하기 위해 메서드의 description 인자가 업데이트 가능한 상태면 갱신해주고, 아니라면 무시하는 조건문을 넣어야 하는데, != null 조건으로 검사하기에는 설명을 수정하지 않아야 하는 상황에서 description 필드가 NULL 일수도 있어 단순히 비어있는지, 업데이트 하지 않아야 하는지 판단하기 애매하고, 그렇다고 .isBlank 조건으로 검사하기에는 또 업데이트가 되어야 하는 값이지만 비어있는 값일수도 있어 이 조건으로도 애매하다는 생각이 들었다.