애정코딩 💻

WEB/JAVA 2022.03.11 댓글 0 Joana

[Lombok] Difference Between @Value and @Data

컴파일과정에서 생성해 주는 방식으로 동작하는 java라이브러리입니다.

@Value

기본적으로 불변객체로 만들어준다.

class에 선언하면 아래의 어노테이션이 기본적으로 포함된다.

@Getter @AllArgsConstructor 

@ToString  @EqualsAndHashCode 

@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)

 

하지만 

 

@Setter 는 포함되지 않는다.

왜냐하면 기본적으로 불변성을 보장하기 때문에 setter를 생략하는 것은 당연하다

 

@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) 는 private이나 final 을 사용할 수 있게 해준다.

 

최종적으로 @Value 를 사용한는 것은 아래와 같다.

        import lombok.Getter;
        import lombok.ToString;
        import lombok.EqualsAndHashCode;
        import lombok.experimental.FieldDefaults;;
        import lombok.AllArgsConstructor;
        
        @Getter
        @ToString
        @EqualsAndHashCode
        @FieldDefaults(makeFinal = true)
        @AllArgsConstructor
        public class Student  {
            private String name;
            private int section;
        }

 

@Data

 

    
        import lombok.EqualsAndHashCode;
        import lombok.Getter;
        import lombok.RequiredArgsConstructor;
        import lombok.Setter;
        import lombok.ToString;
        
        @Getter
        @Setter
        @ToString
        @EqualsAndHashCode
        @RequiredArgsConstructor
        public class Person  {
            private Long id;
            private String firstName;
            private String lastName;
            private String email;
            private int age;

        }

 

+ @Data With @Builder

 

@Data 는 필수 생성자를 생성한다.

하지만 @Builder를 함께 사용하면 갑자기 @Data 가 모든 필드 값을 파라미터로 받는 생성자를 생성한다.

 

Spring DI 는 객체를 초기화하기 위해 파라미터가 없는 기본 생성자에 의존하기 때문에

@NoArgsConstructor를 사용하여 기본생성자를 사용해줘야 한다.

 

안그러면 에러남

        @AllArgsConstructor
        @NoArgsConstructor
        @Data
        @Builder
        public class Person  {
            ...
        }

 

@NoArgsConstructor 파라미터가 없는 기본 생성자 생성
@AllArgsConstructor 모든 필드 값을 파라미터로 받는 생성자 생성
@RequiredArgsConstructor final , @NonNull인 필드 값만 파라미터로 받는 생성자 생성

 

 

 

참고 사이트

https://devwithus.com/lombok-data-annotation/

반응형