newcodingtest / ProjectManagementSystem

:sunny::sunny:레거시 코드 리펙토링 해보기:sunny::sunny:
1 stars 0 forks source link

서버에게 nullable한 값이 들어왔을때 처리를 어떻게 해야 하는가??? #31

Open newcodingtest opened 2 years ago

newcodingtest commented 2 years ago

https://engkimbs.tistory.com/824

newcodingtest commented 2 years ago

게시판을 예로 들어서 title 은 필수 값이지만 content는 선택 값이라고 하자 title 은 무조건 값을 가지고 있겠지만 content는 값을 가지고 있지 않으면 서버로 null값을 전달할것이다. 물론 클라이언트 코드에서 null값이면 공백값으로 변환하여 전달할수도 있지만 이 상황은 제외해보자.

서버는 DTO 값으로 데이터를 받고 있으며, DB에 저장 시에는 서버스 로직을 호출하여, 서비스 로직에서는 레포지토리를 다시 호출할 것이며, DTO 타입은 Entity 타입으로 변경하여 Entity 타입을 레포지토리 메서드 안에 넣어서 DB에 반영 시키는 과정이다.

이 과정에서 DTO 를 Entity로 변환하는 부분에서 nullable 한 값을 어떻게 처리 할것인지가 문제이다.

public static TestDtoToEntity(TaskDTO dto){

     return Dto.builder()
              .tid(dto.getTid())
              .title(dto.getTitle())
                  .content(dto.getContent())    //nullable
              .build();
}

위의 예제 코드에서 Content 값은 nullable한 값이다. DTO를 Entity로 변환하는 부분에서 null 값이 들어가면 Repository를 호출하여 DB저장하는 과정에서 에러를 발생시킨다...

nullalble한 값을 미리 검사하여 그에 따라서 다른 dtoToEntity 메서드를 만들어서 호출해야하는 것일까???? 조금의 고민이 필요하다.....

newcodingtest commented 2 years ago

[해결]

@DynamicInsert

엔티티에 해당 어노테이션을 붙여주면 등록 시점에서 null값인 컬럼들은 jpa가 알아서 제외를 시켜준다.

    @Test
    @DisplayName("@DynamicInsert null값은 스스로 제외된다.")
    void insertNullTest() {
        TaskDTO given = TaskDTO.builder()
                .taskTitle("테스트")
                .taskContents(null)
                .taskStartDate("2022-03-08T10:10")
                .taskEndDate("2022-03-08T10:10")
                .build();

        Task target = TaskDTO.dtoToEntity(given);

         Task result = repository.save(target);

         assertThat(result.getTaskContents()).isEqualTo(null);
    }