[C#] 엔티티 클래스에서 nullable 참조 형식을 활성화 했을 경우 문제점과 해결 방법

우리가 다양한 목적으로 엔티티 클래스 형식을 사용합니다. 전통적으로 엔티티 클래스는 비즈니스에서 정보의 단위로 사용했으며 데이터베이스에서 조회 결과를 담는 목적으로 사용하거나 파일에 저장하는 용도로 이런 형태를 사용합니다.

가장 일반적인 모습은 값 만을 가진 형태입니다.

public class UserInfo
{
    public string UserCode { get; set; }
    public string UserName { get; set; }
    ...
}

그런데 nullable 참조 형식을 활성화 할 경우 위의 코드는 경고 대상이 됩니다. 왜냐하면 UserCodeUserName은 null일 수 있는데도 불구하고 nullable 참조 형식으로 표현되어 있지 않기 때문입니다. 경고를 피하기 위해서는 다음과 같이 수정해야 합니다.

    public string? UserCode { get; set; }
    public string? UserName { get; set; }
    ...

그런데 null일 경우가 없는 경우가 있죠. 그런데 위의 선언 형태로는 그것을 표현할 방법이 없습니다. 그래서 nullable 참조 형식을 활성화 했을 경우 다음 처럼 반드시 생성자 시점에서 초기화 되거나 기본 값을 할당해야 합니다.

    public string UserCode { get; set; }
    public string UserName { get; set; }

    public UserInfo(string userCode, string userName) => (this.UserCode, this.UserName) = (userCode, userName);
    ...

또는,

    public string UserCode { get; set; } = "DefaultCode";
    public string UserName { get; set; } = "DefaultName;
    ...

만약 직렬화 라이브러리에서 생성자를 통한 역직렬화를 지원한다면 그것을 택해도 되고, 만약에 지원하지 않는다면 다음처럼 하면 경고를 해결할 수 있습니다.

    public string UserCode { get; set; } = default!;
    public string UserName { get; set; } = default!;
    ...

!는 ‘반드시 null이 아니다’ 라고 컴파일에게 알려주는 방법입니다. 로직으로 null이 반드시 올 수 없는 경우에만 사용해야 합니다.

좋아요 3

.NET 6 부터는 기본 프로젝트 템플릿에 nullable 참조 형식을 활성화 하기 때문에 이것을 비활성화 하거나 적응해서 null 관련 예외를 줄이는 방향으로 코딩에 적응할 필요가 있습니다.

image

좋아요 3

잘 모르겠는 부분이 있어 질문드립니다.

엔티티 클래스라고 하시는 부분이 정확히 어떤 부분인지 모르겠는데, ef core에서 사용되는 일반 DAO 클래스에서 code first migration을 하면 string 타입일 경우 string?으로 표기하지 않아도 자동으로 nullable로 들어갔던 것으로 기억하고 있습니다. Not Null임을 명시하기 위해서는 RequiredAttribute를 사용하고 있습니다. 아마도 말씀하시는 엔티티클래스에 대해서 제가 잘 몰라서 그런 것 같습니다.

혹시 Visual Studio의 경고 코드를 알 수 있을까요?

엔티티가 DAO 입니다; 저는 DAO 뿐만 아니라 "값"만을 담는 객체를 엔티티라고 많이 써서요. DAO라고 안쓰는 편입니다.

image

RequiredAttribute는 EF Core에서 필수 컬럼을 지정합니다. 제가 말씀 드린 것은 nullable 참조 형식을 활성화 했을 때 나오는 경고 메시지예요.

좋아요 1

아…활성화 해야 나오는 경고 메세지였군요… 감사합니다!