본문 바로가기
💻 하나씩 차곡차곡/Back-end

[스프링(Spring)] 롬복(Lombok) (롬복이란 / 자주 쓰는 기능 / @Data 사용을 지양해야 하는 이유 등)

by 뚜루리 2024. 8. 2.
728x90
320x100

롬복(Lombok) 이란?

  • 롬복(Lombok)은 자바 개발자들이 코드 작성을 더욱 편리하게 할 수 있도록 도와주는 라이브러리이다.

 

롬복(Lombok)의 특징

  • 컴파일 시점에 코드를 추가한다.
  • 별도의 라이브러리를 추가로 설치해야 한다.
  • IDE의 플러그인을 지원한다.

 


[자주 쓰는 기능]

 

@Getter, @Setter

  • 클래스의 필드에 대한 getter, setter 메서드를 자동으로 생성해 준다.
  • 코드의 양을 줄이고, 가독성을 높일 수 있다.

[사용전]

public class User {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 

[사용 후]

@Getter
@Setter
public class User {
    private String name;
    private int age;
}

 

 


 

@ToString

  • 클래스의 필드를 문자열로 변환하는 toString 메서드를 자동으로 생성해 준다.
  • 객체의 상태를 쉽게 확인할 수 있다.

[사용 전]

public class User {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 

[사용 후]

@ToString
public class User {
    private String name;
    private int age;
}

 

 


 

@EqualsAndHashCode

  • 클래스의 필드를 기반으로 equals, hashCode 메서드를 자동으로 생성해 준다.
  • 객체의 동일성을 정확하게 판단할 수 있다.

 

[사용 전]

public class User {
    private String name;
    private int age;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return age == user.age && Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

 

[사용 후]

public class User {
    private String name;
    private int age;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return age == user.age && Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

 


 

@RequiredArgsConstructor

  • final 또는 @NonNull이 붙은 필드만 포함하는 생성자를 자동으로 생성해 준다.
  • 코드의 양을 줄이고, 객체의 초기화를 간편하게 할 수 있다.

[사용 전]

public class User {
    private final String name;
    private final int age;

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

 

[사용 후]

@RequiredArgsConstructor
public class User {
    private final String name;
    private final int age;
}

 


 

@Data

  • 해당 클래스의 모든 필드에 대한 getter, setter 메서드를 자동으로 생성해 준다.
  • 해당 클래스의 모든 필드를 문자열로 변환하는 toString 메서드를 자동으로 생성해 준다.
  • 해당 클래스의 모든 필드를 기반으로 equals, hashCode 메서드를 자동으로 생성해 준다.

 

[사용 전]

public class User {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return age == user.age && Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

 

[사용 후]

import lombok.Data;

@Data
public class User {
    private String name;
    private int age;
}

 

 


 

@Data 사용을 지양해야 하는 이유

이렇게 보면 @Data 매우 편리한 기능이고, @Data만 사용하면 다될 것 같지만 실제 실무에서는 사용을 지양하고 있다. 이유는 아래와 같다. 

1. 코드의 가독성을 해칠 수 있다. -> 자동으로 생성된 메서드들은 클래스의 내부 구조를 숨기기 때문에 코드의 가독성을 해칠 수 있다.
2. 유지 보수가 어려울 수 있다. -> 직접 작성한 코드에 비해 버그가 발생할 가능성이 높다.
3. 특정 필드에 대한 접근 권한을 제한하기 어렵습니다. -> 모든 필드에 대해 공개 접근이 가능하기 때문에 보안상의 문제가 발생할 수 있다. 

 

첫번째, 두번째 이유보다 개인적으롤 세번째 이유가 가장 크다고 생각한다. 특정 필드에 대한 접근 권한을 제한하기 어렵기 때문에 특히 Setter를 풀어놓으면 어디서든 누구나 수정이 가능하고 나중에 에러가 난다고해도 찾기가 쉽지 않기 때문이다.

 

 

 


  • 인텔리제이에서 롬복 설치하고 활성화하는 방법

https://ddururiiiiiii.tistory.com/400

 

[Spring Boot (스프링부트), 인텔리제이] Lombok(롬복) 설치방법 및 활성화 하는 법

lombok 좋은 거 알았다! 그렇다면 lombok은 어떻게 설치해야 하며 롬복을 설치한후 꼭 활성화를 시켜줘야 한다는데 어떻게 활성화를 시켜줘야 하는가? 에 대한 내용 *** 인테리제이가 IDEA인 경우를

ddururiiiiiii.tistory.com

 

  • 스프링 어노테이션 알아보기

https://ddururiiiiiii.tistory.com/484

 

[스프링(Spring)] 어노테이션(Annotation)이란? (특징, 원리, 자주 쓰는 어노테이션 정리)

스프링에서 사용하는 어노테이션이 무엇인지, 어노테이션의 특징과 자주 쓰는 어노테이션에 대해서 정리해보자.  어노테이션(Annotation)이란?어노테이션은 자바의 메타데이터(metadata)로, 코드에

ddururiiiiiii.tistory.com

 

  • @Data 사용을 지양하는 이유

https://ddururiiiiiii.tistory.com/369

 

[Spring/스프링부트] @Data 사용을 지양하는 이유 (= 단점)

[오늘의 궁금증] @Data 는 여러 어노테이션을 한 번에 쓸 수 있는 유용한 어노테이션이지만 한 편으로는 @Data 사용을 지양하기도 한다 그 이유가 뭘까? @Data 어노테이션이란? @ToString, @Getter, @Setter, @

ddururiiiiiii.tistory.com

 

728x90
320x100