[Spring]Lombok @All/NoArgsConstructor이란 무엇인가?

Paek·2024년 1월 24일
0

Spring프로젝트

목록 보기
3/9
post-thumbnail

@All/NoArgsConstructor이런것들은 스프링으로 개발을 하다보면 자주 사용 하는 어노테이션인데, 정확히 무엇인지 알고 사용한다는 느낌이 들지 않았다.

lombok은 불필요한 코드나 작업을 간소화 시켜주지만 잘못 사용하면 더 헷갈릴 수 있기에 명확히 알고 사용하고자 글을 작성하게 되었다.

생성자 어노테이션

생성자를 자동 생성해주는 어노테이션은 아래 세가지가 있다.

  • @NoArgsConstructor : 파라미터가 없는 디폴트 생성자를 생성
  • @AllArgsConstructor : 모든 필드 값을 파라미터로 받는 생성자를 생성
  • @RequiredArgsConstructor : final이나 @NotNull으로 선언된 필드만을 파라미터로 받는 생성자를 생성

예를 들어 User라는 엔티티가 있고 , 우리가 이 생성자를 만드는 경우라고 가정을 해보자.

public class User {
    
    public String name;
    public int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

위와 같이 생성자를 직접 작성해준다. 하지만 위의 3개의 어노테이션은 이 과정을 손쉽게 만들어준다.

@NoArgsConstructor

@NoArgsConstructor 어노테이션은 파라미터가 없는 디폴트 생성자를 자동으로 생성한다. 이 어노테이션을 사용하면, 클래스에 명시적으로 선언된 생성자가 없더라도 인스턴스를 생성할 수 있다.

이 경우 초기값 세팅이 필요한 fianl 변수가 있을 경우 컴파일 에러가 발생할 수 있다.

@NoArgsConstructor(force=true) 를 사용하면 모든 final field는 null,0 등 기본값으로 초기화 된다. 하지만 @NotNull 같은 제약이 있다면 force=true 옵션을 주어도 들어가지 않기에 개발자가 나중에 따로 할당해야 한다.

주로 @Data나 어노테이션을 생성하는 생성자 등과 함꼐 사용한다.

@NoArgsConstructor
public class User {
    
    public String name;
    public int age;

/*
아래 생성자를 자동으로 생성
    public User() {
    }
*/
}

@RequiredArgsConstructor

@RequiredArgsConstructor 어노테이션은 final 변수 또는 @NotNull으로 선언된 필드만을 파라미터로 받는 생성자를 자동으로 생성한다. 클래스가 의존하는 필드를 간단히 초기화할 수 있다.

특히 @NotNull이 달려있는 field의 경우, 생성되는 생성자 내부에 명시적인 Null 체크 로직이 생성된다. 그래서 하나라도 Null값이 포함되게 된다면 NullPointerException이 발생하게 된다.

생성자의 Parameter 순서는 클래스 내부에서 선언된 field의 순서로 매칭된다.

@RequiredArgsConstructor
public class User {
    
    public static String name;
    public int age;

/*
 NotNull 또는 static
아래 생성자를 자동으로 생성
    public User(String name) {
        this.name = name;
    }
*/
}

@AllArgsConstructor

@AllArgsConstructor 어노테이션은 클래스의 모든 필드 값을 파라미터로 받는 생성자를 자동으로 생성해준다. 클래스 의 모든 필드를 한 번에 초기화가 가능하다.

@RequiredArgsConstructor와 마찬가지로 파라미터의 순서는 클래스 내부에서 선언된 필드의 순서대로 생성되며, @NotNull이 붙은 필드의 경우도 Null check 로직이 들어간다.

@AllArgsConstructor
public class User {
    
    public String name;
    public int age;

/*
아래 생성자를 자동으로 생성
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
*/
}

옵션

staticName

모든 어노테이션에 사용될 수 있다. 아래처럼 생성자에 of가 붙게되고 바로 User타입을 반환한다.

@AllArgsConstructor(staticName = "of")
public class User {
    
    public String name;
    public int age;

/*
아래 생성자를 자동으로 생성
    public static User of(String name, int age) {
        return new User(name, age);
    }
*/
}

access

이 옵션에는 아래와 같은 접근 제어자가 존재한다.

  • PUBLIC : 기본값, 모든 클래스에서 생성자에 접근 가능
  • PROTECTED : 같은 패키지의 클래스와 상속받은 클래스에서 생성자에 접근 가능
  • PACKAGE : 같은 패키지의 클래스에서 생성자에 접근 가능
  • PRIVATE : 해당 클래스 내부에서만 생성자에 접근 가능

@NoArgsConstructor(access = AccessLevel.PROTECTED)와 같이 사용한다.

Force

위에서 언급하였듯이 @NoArgsConstructor 어노테이션에서만 사용이 가능하고 해당 옵션 지정시 primitive type에 맞는 기본 값이 설정된다.


정리

@AllArgsConstructor 이나 @RequiredArgsConstructor는 파라미터의 순서를 잘못 넣었을 경우 큰 장애를 초래할 위험이 있다.

따라서 필요한 경우에는 직접 만든 생성자에 @Builder 어노테이션을 붙이는 것을 권장한다. 빌더 패턴은 순서가 중요하지 않고 가독성 측면에서 더 낫다고 생각한다. 또한 이름으로 값을 설정하기에 리팩토리에 유연한 대응이 가능하다.

참고자료

profile
티스토리로 이전했습니다. https://100cblog.tistory.com/

0개의 댓글