개발자의 공부방/자바

JAVA] DTO를 record로 이용해 만들어 봤다 feat. 사용후기

  • -
728x90
반응형

지금까지 간단한 토이프로젝트를 하면서 record를 사용해봤습니다.

간단한 후기를 남겨보겠습니다.


레코드를 활용한 DTO 디렉토리

 

에러 상황

record를 사용하는 컨트롤러

    @GetMapping("/article")
    public String newArticle(@RequestParam(name="id", required = false) Long id, Model model) {
        if(id == null) {

            model.addAttribute("article", new ArticleViewResponse()); // ! 에러 발생
        } else {
            Article findById = blogService.findById(id);
            model.addAttribute("article", new ArticleViewResponse(findById));
        }

        return "newArticle";
    }

 

DTO용 record

public record ArticleViewResponse(Long id, String title, @Nullable String content, LocalDateTime createdAt) {

    public ArticleViewResponse(Article article) {
        this(article.getId(), article.getTitle(), article.getContent(), article.getCreatedAt());
    }
}

 

 

 

생성자를 확인할 수 없다고 합니다.

당연합니다 record에는 기본생성자가 없기 때문이죵,,,

Cannot resolve constructor 'ArticleViewResponse()'

 

동작을 하게 하려면 record에 생성자를 생성 후 초기화를 시키면 됩니다.

다양한 초기화 방법이 있지만 일단 제일 간단하게 this()로 때려넣었습니다.

public record ArticleViewResponse(Long id, String title, @Nullable String content, LocalDateTime createdAt) {

    public ArticleViewResponse(Article article) {
        this(article.getId(), article.getTitle(), article.getContent(), article.getCreatedAt());
    }

    // 기본 생성자 추가 후 초기화
    public ArticleViewResponse() {
        this(0L, "", null, LocalDateTime.now());
    }
}

 

하지만 제가 의도한 것은 위와 같이 초기화를 해서 사용하는 용도는 절대 아니기때문에 record가 적합하지 않은 것 같습니다.

 

레코드는 데이터를 표현하는 목적이며, record 전에는 단순한 데이터 전달목적인 것에 반해 상당히 많은 양의 코드를 작성해야 했습니다.

그래서 자바14에서부터 레코드를 프리뷰해 도입된 것이죵

 

요약

1. 단순한 DTO용도로 사용해야한다

2. 매개변수가 없는 기본 생성자가 필요한 경우에는 class를 사용하는게 맞는 것 같다

3. 레코드는 단순하고 변경할 수 없는 데이터 전달자다 (제일 중요)

 

 

 

아래는 record를 검색하다가 발견한 github인데 새로운 프로젝트를 하면서 DTO를 레코드로 적용한 성공사례에 대해서 나눈 대화입니다 저는 JSON까지 활용하지 않았지만 JSON까지 활용한 예시도 보여주더군용

그리고 레코드를 도입할 때 아래 글과 같이 한번 생각해보면 좋을 것 같다는 생각에서 첨부해봤습니다

 

 

[REQ] Java Records (JEP 395) support · Issue #10490 · OpenAPITools/openapi-generator (github.com)

 

[REQ] Java Records (JEP 395) support · Issue #10490 · OpenAPITools/openapi-generator

Option to generate java models as records.

github.com

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.