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 레벨의 로그를 출력한다.
'Spring' 카테고리의 다른 글
Spirng Boot - REST API로 CRUD 만들기 (0) | 2024.04.03 |
---|---|
Spring Security 살펴보기 (0) | 2024.02.22 |
스프링 핵심 원리 - 스프링 컨테이너 생성, 빈 조회 (0) | 2024.01.22 |
스프링 핵심 원리 - 예제 만들기 (0) | 2024.01.14 |
객체지향 설계와, 스프링 (1) | 2024.01.12 |