[SpringBoot] Lombok

WoojinΒ·2023λ…„ 8μ›” 18일
0

SpringBoot

λͺ©λ‘ 보기
13/15

πŸ’‘ Java 라이브러리둜 κ°œλ°œμ„ ν•˜λ©΄μ„œ κΈ°κ³„μ μœΌλ‘œ μž‘μ„±ν•˜κ²Œ λ˜λŠ” Getter, Setter, ToString λ“±μ˜ λ©”μ„œλ“œ μž‘μ„± μ½”λ“œλ₯Ό Annotation으둜 λŒ€μ‹ ν•΄ μ½”λ“œ λ‹€μ΄μ–΄νŠΈλ₯Ό λ„μ™€μ€Œ

μž₯점

  • μ–΄λ…Έν…Œμ΄μ…˜ 기반의 μ½”λ“œ μžλ™ 생성을 ν†΅ν•œ 생산성 증가
  • μ½”λ“œ λ‹€μ΄μ–΄νŠΈλ₯Ό ν†΅ν•œ μ½”λ“œ 가독성 및 μœ μ§€λ³΄μˆ˜μ„± 증가

Ex>

κΈ°μ‘΄ μ½”λ“œ

public class Car {

    private String seqNumber;
    private String id;
    private String name;

    public Car() {}

    public Car(String seqNumber, String id, String name) {
        this.seqNumber = seqNumber;
        this.id = id;
        this.name = name;
    }

    public String getSeqNumber() {
        return seqNumber;
    }

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

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

Lombok ν™œμš© μ½”λ“œ

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Car {

    private String seqNumber;
    private String id;
    private String name;

}

πŸ’‘ Lombokμ—μ„œ μ‚¬μš©ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜!!

Lombok의 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” gradle의 dependencies에
implementation 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok'
λ₯Ό μΆ”κ°€ν•΄μ€˜μ•Ό ν•œλ‹€.

  • @Getter & @Setter

    • μ‹€μ§ˆμ μœΌλ‘œ κ°€μž₯ 많이 ν™œμš©λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μ΄λ‹€.

    • @Getter : Getter λ©”μ†Œλ“œ 생성

    • @Setter : Setter λ©”μ†Œλ“œ 생성

    • μ–΄λ…Έν…Œμ΄μ…˜μ„ 클래슀 μœ„μ— μž‘μ„±ν•˜λ©΄ ν•΄λ‹Ή 클래슀의 λͺ¨λ“  λ³€μˆ˜μ— 적용이 κ°€λŠ₯ν•˜κ³ , λ³€μˆ˜ 이름 μœ„μ— μž‘μ„±ν•˜λ©΄ ν•΄λ‹Ή λ³€μˆ˜μ—λ§Œ 적용이 λœλ‹€.

        @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)Β μ–΄λ…Έν…Œμ΄μ…˜μ„ μ μš©ν•˜λ©΄ λœλ‹€.

        @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
                        '}';
            }
        }
  • @Builder

    • λΉŒλ” νŒ¨ν„΄μ„ μžλ™μœΌλ‘œ 생성해쀀닀.
    • builder() : λΉŒλ” 클래슀의 μΈμŠ€ν„΄μŠ€ 생성
    • build() : μ‹€μ œ μƒμ„±μž ν˜ΈμΆœν•˜μ—¬ 객체 생성
  • @AllArgsConstructor & @NoArgsConstructor(access = AccessLevel.PROTECTED)

    @AllArgsConstructor

    β†’λͺ¨λ“  ν•„λ“œ 값을 νŒŒλΌλ―Έν„°λ‘œ λ°›λŠ” μƒμ„±μž 생성

    @NoArgsConstructor

    β†’ νŒŒλΌλ―Έν„°κ°€ μ—†λŠ” κΈ°λ³Έ μƒμ„±μž 생성

    β†’ @Entity 적용 μ‹œ κΈ°λ³Έ μƒμ„±μžλŠ” ν•„μˆ˜μ΄κΈ° λ•Œλ¬Έμ— λ‘¬λ³΅μ—μ„œ μ œκ³΅ν•˜λŠ” 이 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•œλ‹€.

    β†’ @Builder와 @NoArgsConstructorλ₯Ό ν•¨κ»˜ μ‚¬μš© μ‹œ λͺ¨λ“  맀개 λ³€μˆ˜λ₯Ό λ°›λŠ” μƒμ„±μžκ°€ μ—†μœΌλ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

    @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

    • νŠΉμ • λ³€μˆ˜μ— λŒ€ν•œ μƒμ„±μžλ₯Ό 생성해쀀닀.

    • 주둜 μ˜μ‘΄μ„± μ£Όμž…, 즉 DI 의 편의λ₯Ό μœ„ν•΄ μ‚¬μš©λ˜κ³€ ν•œλ‹€.

    • ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ 생성될 μƒμ„±μžμ˜ 인자λ₯Ό μΆ”κ°€ν•˜λŠ” 쑰건은 μ•„λž˜μ™€ κ°™λ‹€.

    • λ³€μˆ˜λ₯Ό final둜 μ„ μ–Έ

    • λ³€μˆ˜μ— @NonNull μ–΄λ…Έν…Œμ΄μ…˜μ„ 적용

      @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

    μƒμ„±μžμ—μ„œ λ³€μˆ˜μ— λŒ€ν•œ NPE(Null Pointer Exception)λ₯Ό 검증해쀀닀.

    @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 체크λ₯Ό μ§„ν–‰ν•œλ‹€.
    
    **/
  • @Date

    @ToString,Β @EqualsAndHashCode,Β @Getter,Β @Setter,Β @RequiredArgsConstructorλ₯Ό μžλ™μ™„μ„± μ‹œμΌœμ€€λ‹€.

    μ‹€λ¬΄μ—μ„œλŠ” λ„ˆλ¬΄ 무겁고 객체의 μ•ˆμ •μ„±μ„ 지킀기 λ•Œλ¬Έμ—Β @Data의 ν™œμš©μ„ μ§€μ–‘ν•œλ‹€.

  • @Builder

    @Builder μ–΄λ…Έν…Œμ΄μ…˜μ€ ν•΄λ‹Ή 클래슀의 μƒμ„±μžμ— Builder νŒ¨ν„΄μ„ μ μš©μ‹œμΌœμ€€λ‹€.

    λͺ¨λ“  λ³€μˆ˜μ— μ μš©μ‹œν‚€λ €λ©΄ 클래슀 상단에 @Builder λ₯Ό μ μš©ν•˜κ³ , νŠΉμ • λ³€μˆ˜μ— λŒ€ν•œ Buildλ₯Ό μ›ν•œλ‹€λ©΄

    μƒμ„±μžλ₯Ό μž‘μ„±ν•˜κ³  ν•΄λ‹Ή μƒμ„±μž μœ„μ— @Builder λ₯Ό μ μš©ν•˜λ©΄ λœλ‹€.

    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 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ œκ³΅ν•΄μ€€λ‹€.

    둜그 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ μš©ν•˜λ©΄ ν•΄λ‹Ή ν΄λž˜μŠ€μ— λŒ€ν•œ 둜그 클래슀λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•œλ‹€.

    @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 클래슀λ₯Ό μžλ™μœΌλ‘œ 생성해쀀닀.
    
    **/
  • μ½”λ“œ

    import lombok.*;
    
    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    @ToString
    public class TestDto {
    
        private String name;
        private int age;
    
    }

πŸ’‘ Lombok Annotation 적용 μ—λŸ¬

annotation Processorλ₯Ό μ„€μ •ν•΄μ€˜μ•Ό ν•œλ‹€!

  1. Setting-> Build,Execution,Deployment -> Compiler -> Annotation Processorsμ„€μ •μ—μ„œ Enable Anntation processing μ²΄ν¬λ°•μŠ€ ν™œμ„±ν™”
  2. build.gradle νŒŒμΌμ—μ„œ dependencies**{**annotationProcessor('org.projectlombok:lombok:')} μΆ”κ°€

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보