본문 바로가기

Spring

Lombok

@AllArgsConstructor

  • 클래스에 모들 필드에 대한 생성자를 자동으로 생성해준다.
  • 단점 : 기존에 멤버 변수의 순서를 바꾼다면, 기존 생성자의 파라미터의 순서가 바뀐다. 만약 두 멤버 변수의 타입이 동일하다면 개발자가 인지 하기 어렵다.
  • 멤버 변수 생성자 호출 (멤버 변수 순서 변경 전 / 후 모두 동일 소스)
    class UserTest {

        @Test
        @DisplayName("생성자 테스트")
        void constructor_test(){
            User user = new User(1L, "name", "email", "password");
            System.out.println(user);
        }
    }
  • 멤버 변수 순서 변경전
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @Builder
    public class UserData {
        public Long id;
        @NotBlank(message = "잘못된 요청입니다. 파라미터를 확인해 주세요.")
        public String name;
        @Email(message = "잘못된 요청입니다. 파라미터를 확인해 주세요.")
        public String email;
        @NotBlank(message = "잘못된 요청입니다. 파라미터를 확인해 주세요.")
        public String password;
    }
  • 출력(멤버 변수 순서 변경전)
    User(id=1, name=name, email=email, password=password)
  • 멤버 변수 순서 변경(email과 name을 변경)
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @Builder
    public class UserData {
        public Long id;
        @Email(message = "잘못된 요청입니다. 파라미터를 확인해 주세요.")
        public String email;
        @NotBlank(message = "잘못된 요청입니다. 파라미터를 확인해 주세요.")
        public String name;
        @NotBlank(message = "잘못된 요청입니다. 파라미터를 확인해 주세요.")
        public String password;
    }
  • 출력(멤버 변수 순서 변경) → 같은 String 타입이라 별도의 오류가 발생하지 않는다.
    User(id=1, email=name, name=email, password=password)
  • 그렇다고 @AllArgsConstructor 를 삭제 할까?
    • @Builder에서 오류가 발생 → 모든 멤버변수를 갖는 생성자가 필요하다.
    /Users/jw.lee/ljw-study/spring/spring-week5-assignment-1/app/src/main/java/com/codesoom/assignment/domain/User.java:17
    java: constructor User in class com.codesoom.assignment.domain.User cannot be applied to given types;
      required: no arguments
      found:    java.lang.Long,java.lang.String,java.lang.String,java.lang.String
      reason: actual and formal argument lists differ in length
  • access = AccessLevel.PRIVATE 옵션으로 외부에서 접근못하게 막는다
    @Entity
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    @AllArgsConstructor(access = AccessLevel.PRIVATE)
    @Builder
    @Getter
    @ToString
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;

        private String name;

        private String email;

        private String password;

    }

@NoArgsConstructor

  • 기본 생성자를 생성해준다.
  • final 멤버 변수가 있을 경우 초기화 문제로 force = true 옵션으로 final 멤버 변수를 초기화 시켜 생성한다.
  • 단점 : 기본생성자를 public으로 생성하게 되면 객체가 Immutable하지 않다. → 외부 변경에 취약하다. → access = AccessLevel.PROTECTED 으로 접근을 제어하자.

'Spring' 카테고리의 다른 글

Spring REST API 기본호출 구현  (0) 2021.06.10
Spring Boot Start  (0) 2021.06.10
Cross-Origin-Resource-Sharing(CORS) 처리  (0) 2020.07.26
JUnit All Test 생성  (0) 2020.07.26
3-tier Architecture  (0) 2020.07.21