Spring

Spring Boot - Lombok

CHun2 2024. 4. 3. 18:45
반응형

LomBok은 반복적이고 지루한 코드를 줄이고 간결하고 가독성 코드를 작성할 수 있도록 도와주는 유용한 라이브러리 이다.
 
롬복은 어노테이션 기반으로 사용가능 하며 @Getter, @Setter, @NoArgsConstructor, @AllArgsConstructor, @ToString 등과 같은 어노테이션을 제공하여, 접근자 및 설정자, 생성자등의 메서드를 자동으로 생성한다.
 

@Getter, @Setter

import lombok.*;

@Getter
@Setter
public class Person {
    private String name;
    private int age;
	
    /* Getter와 Setter 메서드를 @Getter, @Setter 어노테이션으로 대체한다.
        public String getName() {
            return name;
        }

        public int getAge() {
            return age;
        }
        
        // Setter 메서드
        public void setName(String name) {
            this.name = name;
        }

        public void setAge(int age) {
            this.age = age;
        }
    */
    
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("John");
        person.setAge(30);
        
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
    }
}

 
@Getter 및 @Setter는 Getter, Setter 메서드를 자동으로 생성할 수 있다. 위 코드의 주석 부분을 어노테이션 한줄로 대체가능하다.
 


 

@NoArgsConstructor

import lombok.*;

@Setter
@Getter
@NoArgsConstructor
public class Person {
    private String name;
    private int age;
    
    /* 
        매개변수가 없는 기본 생성자, @NoArgsConstructor 어노테이션이 대신한다.
        public Person() {
            기본적으로 아무것도 수행하지 않음
        }
    */
    

    public static void main(String[] args) {
        // 매개변수가 없는 기본 생성자를 사용하여 객체 생성
        Person person = new Person();
        person.setName("John");
        person.setAge(30);

        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
    }

}

 
@NoArgConstructor 어노테이션은 매개변수가 없는 기본 생성자를 직접 작성 할 수 있다. 주석에 있는 코드를 대체한다.
 


@AllArgConstructor

@Getter
@Setter
@AllArgsConstructor
public class Person {
    private String name;
    private int age;
    
    /* 
    	// 모든 필드를 초기화하는 생성자, @AllArgsConstructor가 대신한다.
        public Person(String name, int age) {
        this.name = name;
        this.age = age;
    	}
    */

    public static void main(String[] args) {
        // 모든 필드를 초기화하는 생성자를 사용하여 객체 생성
        Person person = new Person("John", 30);

        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
    }

}

 
@AllArgsConstructor 어노테이션은 모든 필드를 초기화 하는 생성자를 대신한다.
 


 

@RequiredArgsConstructor

@Getter
@RequiredArgsConstructor
public class Person {
    private final String name;
    private final int age;
	
    /*
        // 필요한 필드를 초기화하는 생성자
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    */
    
    public static void main(String[] args) {
        // 필요한 필드를 초기화하는 생성자를 사용하여 객체 생성
        Person person = new Person("John", 30);

        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
    }

}

 
@RequiredArgsConstructor 어노테이션은 final 키워드를 사용하여 필드를 선언하면 해당 필드는 생성자에서 반드시 초기화 되어야 한다.
 


 

@Builder

@Bulider
@Getter
public class Person {
    private String name;
    private int age;

    // private 생성자
    private Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
	
    /*
    // 빌더 클래스, @Bulider로 대체
      public static class Builder {
          private String name;
          private int age;

          public Builder name(String name) {
              this.name = name;
              return this;
          }

          public Builder age(int age) {
              this.age = age;
              return this;
          }

          public Person build() {
              return new Person(name, age);
          }
      }
    */
	
    
    public static void main(String[] args) {
        // 빌더를 사용하여 객체 생성
        Person person = new Person.Builder()
                                  .name("John")
                                  .age(30)
                                  .build();

        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
    }

}

 
@Bulider 어노테이션은 빌더 패턴을 대신 구사해준다. 객체 생성시 가독성, 유연성, 객체 불변성 보장등의 장점이 있다.
 


 

@ToString

import lombok.ToString;

@ToString
public class Person {
    private String name;
    private int age;

    public static void main(String[] args) {
        Person person = new Person();
        person.setName("John");
        person.setAge(30);
        
        System.out.println(person); 
        
        // 출력: Person(name=John, age=30)
    }
    
    /* toString 메서드, @ToString이 대체한다.
      @Override
      public String toString() {
          return "Person{name='" + name + "', age=" + age + "}";
      }
    */

}

 
@ToString은 주석에 있는 ToString을 대체한다. 주로 디버깅 및 로깅, 가독성을 목적으로 사용된다. 객체자체를 그냥 출력하면 "Person@15db9742"와 같이 해쉬코드가 출력되는데 이 이유는 모든 클래스는 Object 클래스를 상속 받기 떄문에 클래스에서 hashCode() 메서드를 오버라이드 하지 않으면 hashCod() 메서드가 호출된다. 이 메서드는 객체 메모리 주소를 기반으로 한 해시 코드를 반환한다.
 


 

@Data

@Data // @Getter, @Setter, @ToString @EqualsAndHashCode, @RequiredArgsConstructor를 모두 사용가능하게 해준다.
public class Person {

}

 
@Data 어노테이션은  @Getter, @Setter, @ToString @EqualsAndHashCode, @RequiredArgsConstructor를 모두 사용가능하게 해준다.
 


 

@Value

import lombok.Value;

@Value
public class Person {
    private String name;
    private int age;
}

    /* @Value를 대체하는 코드
    public class Person {
        private final String name;
        private final int age;

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

        public String getName() {
            return name;
        }

        public int getAge() {
            return age;
        }
    }
    */

public class Main {
    public static void main(String[] args) {
        // @Value 애노테이션을 사용한 경우
        Person person = new Person("John", 30);
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());

        // Setter 메서드가 생성되지 않았으므로 필드를 변경할 수 없다.
        // person.setName("Alice"); // 컴파일 에러 발생

        /* 어노테이션을 사용하지 않은 경우
        Person person = new Person("John", 30);
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());

        // Setter 메서드가 생성되지 않았으므로 필드를 변경할 수 없다.
        // person.setName("Alice"); // 컴파일 에러 발생
        */
    }
}

 
@Value 어노테이션은 불변(immutable)한 클래스를 생성할 때 사용한다. 필드는 모두 private fainal로 선언되고, 생성자, Getter 메서드만 생성된다. Setter는 사용되지 않는다. (@AllargsConstructor와 @Getter를 사용한 것과 유사하다.)
 


 

@Slf4j

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Example {
    public static void main(String[] args) {
        log.info("This is an info message");
        log.warn("This is a warning message");
        log.error("This is an error message");
    }
}

 
@Slf4j 어노테이션은 간단한 로깅 기능을 제공한다. 로깅 레벨에는 info warn, error등이 있으며 각 레벨에 따라 다른 메서드를 사용하여 로깅할 수 있다. 자동으로 log 객체를 생성하고 초기화하여 사용자가 별도로 로거를 설정할 필요가 없다.
 
info : 정보성 로그 메세지, 정상 동작을 기록
warn : 경고성 로그 메세지, 경고, 잠재적인 문제등을 기록
error : 에러 로그 메세지, 오류나 예외등을 기록
 

예제

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/example")
@Slf4j
public class ExampleController {

    @GetMapping("/hello")
    public String hello() {
        log.info("GET request received for /example/hello");
        return "hello";
    }

    @GetMapping("/error")
    public String error() {
        log.error("An error occurred while processing /example/error");
        return "error";
    }
}

 
/example/hello 엔드포인트로 GET 요청을 처리하는 메서드는 info 레벨로 출력하고
/example/error 엔드포인트로의 GET 요청은 error 레벨의 로그를 출력한다.