본문 바로가기
📚Framework & Library/Lombok

[Lombok] Lombok Annotation. 어노테이션

by inbeom 2023. 9. 10.
728x90

💡 Lombok에서 사용하는 어노테이션!!

*Lombok의 어노테이션을 사용하기 위해서는 gradle의 dependencies에 implementation 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' 를 추가해줘야 한다.

 

@Getter @Setter

실질적으로 가장 많이 활용되는 어노테이션이다.

@Getter →** Getter 메서드를 생성해준다.

@Setter →** Setter 메서드를 생성해준다.

어노테이션을 클래스 위에 작성하면 해당 클래스의 모든 변수에 적용이 가능하고, 변수 이름 위에

작성하면 해당 변수에만 적용이 된다.

 

Ex >

@Getter
public class Car {

		@Setter
		private String seqNumber;
    private String id;
    private String name;
    private String color;
    private Integer serialNumber;
    private boolean isOnSale;

}

/** 컴파일 완료 소스 **/

public class Car {
    private String seqNumber;
    private String id;
    private String name;
    private String color;
    private Integer serialNumber;
    private boolean isOnSale;

    public Car() {
    }

    public String getSeqNumber() {
        return this.seqNumber;
    }

    public String getId() {
        return this.id;
    }

    public String getName() {
        return this.name;
    }

    public String getColor() {
        return this.color;
    }

    public Integer getSerialNumber() {
        return this.serialNumber;
    }

    public boolean isOnSale() {
        return this.isOnSale;
    }

    public void setSeqNumber(String seqNumber) {
        this.seqNumber = seqNumber;
    }
}

/**

@Getter 어노테이션을 클래스 상단에 적용함으로써 모든 변수에 대한 Getter 메서드가 작성됨.
@Setter 어노테이션을 seqNumber 변수에만 적용했기 때문에 해당 변수의 Setter 메서드가 작성됨

**/

@ToString

@ToString 어노테이션은 해당 클래스의 ToString 메서드를 생성해준다.

출력을 원치 않는 변수 위에 @ToString.Exclude 어노테이션을 적용하면 출력을 제외한다.

부모 클래스에 대해서도 toString을 적용하고자 한다면 @ToString(callSuper = true) 어노테이션을 적용하면 된다.

 

Ex >

@ToString
public class Car {

    private String seqNumber;
    private String id;
    private String name;
    private String color;
    private Integer serialNumber;
		@ToString.Exclude
    private boolean isOnSale;

}

/** 컴파일 완료 소스 **/
public class Car {

    private String seqNumber;
    private String id;
    private String name;
    private String color;
    private Integer serialNumber;
    private boolean isOnSale;

    @Override
    public String toString() {
        return "Car{" +
                "seqNumber='" + seqNumber + '\\'' +
                ", id='" + id + '\\'' +
                ", name='" + name + '\\'' +
                ", color='" + color + '\\'' +
                ", serialNumber=" + serialNumber
                '}';
    }
}

@AllArgsConstructor @NoArgsConstructor

@AllArgsConstructor → 모든 변수를 사용하는 생성자를 생성해준다.

@NoArgsContructor → 변수를 사용하지 않는 기본 생성자를 생성해준다.

 

Ex >

@AllArgsConstructor
@NoArgsConstructor
public class Car {

    private String seqNumber;
    private String id;
    private String name;
    private String color;
    private Integer serialNumber;
    private boolean isOnSale;

}

/** 컴파일 완료 소스 **/

public class Car {

    private String seqNumber;
    private String id;
    private String name;
    private String color;
    private Integer serialNumber;
    private boolean isOnSale;

		public Car () {}

    public Car(String seqNumber, String id, String name, String color, Integer serialNumber, boolean isOnSale) {
        this.seqNumber = seqNumber;
        this.id = id;
        this.name = name;
        this.color = color;
        this.serialNumber = serialNumber;
        this.isOnSale = isOnSale;
    }
}

/**

@NoArgsConstructor 적용함으로써 기본 생성자가 작성됨
@AllArgsConstructor 적용함으로써 모든 변수에 대한 생성자가 작성됨

**/

@RequiredArgsConstructor

@RequiredArgsConstructor 어노테이션은 특정 변수에 대한 생성자를 생성해준다.

주로 의존성 주입, 즉 DI 의 편의를 위해 사용되곤 한다.

해당 어노테이션으로 생성될 생성자의 인자를 추가하는 조건은 아래와 같다.

  • 변수를 final로 선언
  • 변수에 @NonNull 어노테이션을 적용

 

Ex >

@RequiredArgsConstructor
public class Car {

    private final String seqNumber;
    private final String id;
    private String name;
    private String color;
    @NonNull
    private Integer serialNumber;
    private boolean isOnSale;

}

/** 컴파일 완료 소스 **/

public class Car {
    private final String seqNumber;
    private final String id;
    private String name;
    private String color;
    @NonNull
    private Integer serialNumber;
    private boolean isOnSale;

    public Car(String seqNumber, String id, @NonNull Integer serialNumber) {
        if (serialNumber == null) {
            throw new NullPointerException("serialNumber is marked non-null but is null");
        } else {
            this.seqNumber = seqNumber;
            this.id = id;
            this.serialNumber = serialNumber;
        }
    }
}

/**

final로 선언하거나 @NonNull 어노테이션이 적용된 변수들만을 인자로 받는 생성자가 작성됨.

**/

@NonNull

@NonNull어노테이션은 생성자에서 변수에 대한 NPE(Null Pointer Exception)를 검증해준다.

 

Ex >

@RequiredArgsConstructor
public class Car {

    private final String seqNumber;
    @NonNull
    private final String id;
    private String name;
    private String color;
    @NonNull
    private final Integer serialNumber;
    private boolean isOnSale;

}

/** 컴파일 완료 소스 **/

public class Car {
    private final String seqNumber;
    @NonNull
    private final String id;
    private String name;
    private String color;
    @NonNull
    private final Integer serialNumber;
    private boolean isOnSale;

    public Car(String seqNumber, @NonNull String id, @NonNull Integer serialNumber) {
        if (id == null) {
            throw new NullPointerException("id is marked non-null but is null");
        } else if (serialNumber == null) {
            throw new NullPointerException("serialNumber is marked non-null but is null");
        } else {
            this.seqNumber = seqNumber;
            this.id = id;
            this.serialNumber = serialNumber;
        }
    }
}

/**

생성자로 Object를 생성할 때, @NonNull이 적용된 변수에 대한 Null 체크를 진행한다.

**/

@Data

@Data 어노테이션은 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 자동완성 시켜준다.

실무에서는 너무 무겁고 객체의 안정성을 지키기 때문에 @Data의 활용을 지양한다.


@Builder

@Builder 어노테이션은 해당 클래스의 생성자에 Builder 패턴을 적용시켜준다.

모든 변수에 적용시키려면 클래스 상단에 @Builder 를 적용하고, 특정 변수에 대한 Build를 원한다면

생성자를 작성하고 해당 생성자 위에 @Builder 를 적용하면 된다.

 

Ex >

public class Car {

    private String seqNumber;
    private String id;
    private String name;
    private String color;
    private Integer serialNumber;
    private boolean isOnSale;

    @Builder
    public Car(String seqNumber, String id, Integer serialNumber) {
        this.seqNumber = seqNumber;
        this.id = id;
        this.serialNumber = serialNumber;
    }
}

/** 사용 예제 **/

public class CarFactory {

    public Car initCar(String seqNumber, String id, Integer serialNumber) {
        Car car = Car.builder()
                .seqNumber(seqNumber)
                .id(id)
                .serialNumber(serialNumber)
                .build();

        return car;
    }

}

/**

@Builder 어노테이션을 통해 해당 Object에 대해 Builder 패턴이 적용된 것을 확인할 수 있다.
step-by-step으로 필요한 인자를 선택해서 add하여 한번에 객체를 생성할 수 있다.

**/

Builder Pattern

객체를 생성할 때, 흔히 사용되는 디자인 패턴 중 하나이다.

Car car = Car.builder()
         .seqNumber(seqNumber)
         .id(id)
         .serialNumber(serialNumber)
         .build();

장점

  • 각 인자가 어떤 의미인지 파악하기 쉽다.
  • setter 메서드가 없으므로 변경 불가 객체를 만들 수 있다.
  • 한번에 객체를 생성함으로써 제공 상태에 대한 일관성을 얻는다.
  • 객체 생성 최종 단계인 build() 내부에서 값을 검증한다던지의 추가적인 처리가 가능하다.

@Log 관련 어노테이션

Lombok은 여러가지의 Log 어노테이션을 제공해준다.

📖 Lombok에서 제공하는 Log 어노테이션

로그 어노테이션을 적용하면 해당 클래스에 대한 로그 클래스를 자동으로 생성한다.

 

Ex >

@Log4j
public class Car {
    private String seqNumber;
    private String id;
    private String name;
    private String color;
    private Integer serialNumber;
    private boolean isOnSale;
}

/** 컴파일 완료 소스 **/
public class Car {
    private static final Logger log = Logger.getLogger(Car.class);
    private String seqNumber;
    private String id;
    private String name;
    private String color;
    private Integer serialNumber;
    private boolean isOnSale;
}

/**

적용시킨 Log 어노테이션에 맞는 Log 클래스를 자동으로 생성해준다.

**/

 

💡 Lombok Annotation 적용 에러

annotation Processor를 설정해줘야 한다!

  1. Setting-> Build,Execution,Deployment -> Compiler -> Annotation Processors설정에서 Enable Anntation processing 체크박스 활성화
  2. build.gradle 파일에서 dependencies{annotationProcessor('org.projectlombok:lombok:')} 추가
728x90

'📚Framework & Library > Lombok' 카테고리의 다른 글

[Lombok] Lombok이란?  (0) 2023.09.10