241111 TIL - 롬복에서 제공하는 생성자 어노테이션 @AllArgsConstructor 외 몇가지 그리고 Builder 패턴

J_log·4일 전
0
post-thumbnail

이번에 일정관리 앱 프로젝트를 진행하면서 롬복에서 제공하는 편리한 기능을 사용했다.
그 중에 생성자를 만들어주는 @AllArgsConstructor 와 Getter를 생성 하는 @Getter를 가장 많이 사용하지 않았나 싶다.

하지만 현재 상황에서는 @AllArgsConstructor 보다 @RequiredArgsConstructor를 사용하는 것이 더 좋아보이고 @AllArgsConstructor를 상황에 맞게 사용하면 좋을 것 같다는 피드백을 받았다.
그럼 생성자 관련 어노테이션을 종류별로 알아보고 @AllArgsConstructor를 지양해야 하는 이유를 알아보자 !


@NoArgsConstructor

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

@NoArgsConstructor
public class User {
	private String name;
    private String email;
}

@NoArgsConstructor 없이 Java 코드로 구현하면 아래와 같다.

public class User {
	private String name;
    private String email;
}

public User() {}

@AllArgsConstructor

@AllArgsConstructor는 클래스의 선언한 모든 필드를 파라미터로 받는 생성자를 자동으로 생성한다.

@AllArgsConstructor
public class User {
	private String name;
    private String email;
}

@AllArgsConstructor 없이 Java 코드로 구현하면 아래와 같다.

public class User {
	private String name;
    private String email;
}
public User(String name, String email) {
	this.name = name;
    this.email = email;
}

@RequiredArgsConstructor

@RequiredArgsConstructor는 final이나 @NonNull로 선언된 필드를 파라미터로 받는 생성자를 자동으로 생성한다.

@RequiredArgsConstructor
public class User {
	private final String name;
    private final String email;
    private String gender;
}

@RequiredArgsConstructor 없이 Java 코드로 구현하면 아래와 같다.

public class User {
	private final String name;
    private final String email;
    private String gender;
}
public User(final String name, final String email) {
	this.name = name;
    this.email = email;
}

따라서 상황에 맞게 생성자 어노테이션을 활용한다면 좋을 것 같다. 그렇다면

@AllArgsConstructor를 지양해야되는 이유는 무엇일까 ?

위의 예시코드인 User 클래스로 예를 들자면 필드가 3개 밖에 없지만 만약에 다른 타입의 필드가 여러개 추가된다면 생성자를 한 눈에 파악하기 힘들 수 있고 원치않는 값으로 생성될 수 있다.

왜냐하면 @AllArgsConstructor는 생성자를 자동으로 생성하고 타입만 일치하면 컴파일 시점에서 에러가 발생하지 않는다. 즉, 자동으로 생성되는 것에 나중에 문제가 발생했을 때 직접 제어할 수 없기 때문에 문제를 잡기 어렵다. 또한 협업시에도 혼동을 줄 수 있다.

위와 같이 객체를 생성할 때 생성자의 타입만 일치하면 컴파일 시점에서 에러를 일으키지 않고 정상적으로 생성이 되지만 원하는 값을 제대로 세팅할 수 없다. 물론 위 사진에서는 IDE에서 제공해주는 기능으로 arguments 들을 명시에 주고 있지만 이건 IDE 환경에 따라 달라질 수 있다고 본다.

하여 결국 문제가 발생하고 User 클래스를 들여다봐야하지만 @AllArgsConstructor 어노테이션만 있고 생성자를 찾을 수 없어 한번 더 체크를 하게 된다.

그래서 어떻게 개선하면 좋을 까?

  • 생성자를 직접 작성한다.
  • 빌더 패턴 사용
    • 생성자를 직접 만들 때 필드의 수가 많다면 순서대로 전달하여 객체를 생성해야 되는데 이 때 잘못된 입력으로 생기는 문제를 방지할 수 있고 인자를 선택적으로 사용할 수 있다.

예로 createUserWithBuilder() 메서드에서 빌더패턴을 적용해 객체를 생성하는 모습이다. 객체를 생성할 때 필요한 필드만 넣어서 객체를 생성할 수 있어 더 안전하고 유연하게 생성할 수 있다.

post-custom-banner

0개의 댓글