IT/development

[springBoot] JPA @Entity에서 @NoArgsConstructor, @AllArgsConstructor, @Builder... 사용 관련 정리

알 수 없는 사용자 2022. 11. 22. 07:07
반응형

목차

     

    개인 프로젝트 에서 단순 CRUD는 JPA로 구현하려고 많이 하고 있다.

    역시 미래의 내가 보기위해 기록한다.

     

    부끄럽지만 java8, JPA를 최근에 사용하게 되어서 @Builder 어노테이션도 처음 써보고 이제 막 적응이 살짝 되가는 중이다.(JPA에서는 엔티티에 setter 사용을 최대한 지양한다.)


     

    @Entity에서 필요로 하는 것은 기본 생성자이고 @Builder에서 필요로 하는 것은 모든 필드를 전부 매개변수로 가지고 있는 생성자이다.(값 세팅하기 위해서)

     

    둘 다 생략할 경우 IDE에서 친절하게 아래처럼 에러를 뱉어준다.(엔티티에 기본 생성자 없을 경우엔 컴파일 단계에서 표시) 빌더에 매개변수 생성자 없을 경우 빌드시 표시해준다.

     

    Entity에서 @NoArgsConstructor 생략 시 아래처럼 에러가 표시된다.

    lombok 어노테이션으로 생성자를 선언해주거나 직접 선언하거나 해야한다.

     

    @Builder 사용 시 @AllArgsConstructor 생략 시 빌드시에 아래처럼 에러가 표시된다.

     

    JPA의 Entity는 반드시 불변 객체여야 하므로 Getter만 사용해야 한다.

    JPA의 핵심은 영속성이다.

     

    그래서 값 세팅을 위해 세터가 아닌 @Builder를 이용하고 이 빌더란 친구는 반드시 모든 필드를 매개변수로 가지고 있는 생성자를 필요로 한다.

    JPA의 엔티티는 기본 생성자를 필요로 한다.

     

    그리고 @JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)는 클라이언트에 돌려줄 경우 값을 JSON네이밍으로 변경해서 돌려주기 위해서 사용했다.

    서버 사이드에서는 Camel case를 쓰고 클라이언트 사이드에서는 Snake case를 쓰기 때문이다.

     

    아래처럼 java의 카멜케이스 네이밍을 스네이크 네이밍으로 변환해서 돌려주기 위해서이다.

    // java 필드 네이밍
    private String memberId;
    // js 필드 네이밍
    let member_id

     

    필드에 @JsonProperty("변환할 필드명")으로 선언해도 되는데 나중에 혹시나 필드가 더 많아질수 있으니 미리 클래스레벨에 @JsonNaming...를 선언했다.(사실 필드 몇개 안되지만 귀찮아서 그랬다.)

     

    어노테이션이 코드 수를 많이 줄여주지만 사용해본 적이 없는 나 같은 사람은 역시 이를 사용하기 위해 공부를 해야 한다.

    몰랐던 새로운 걸 알아가는 이 과정이 즐겁다.

    뭔가를 사용할 때는 원리를 알고 쓰는게 좋으니 즐거운 마음으로 포스팅에 올린다.

     

    아래의 어노테이션이 많은 코드를 줄여준다. 하지만 모르면 공부를 해야 한다. 

    @Getter
    @NoArgsConstructor
    @AllArgsConstructor
    @Entity
    @Builder
    @Table(name = "test")
    @JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)

     

    개인 공부를 정리한 포스팅이라 틀린 점이 있을 수 있습니다.

    틀린 점은 댓글로 부탁 드립니다.

    반응형