롬복과 관련된 애너테이션들이 많이 있지만 자주 사용하는 애너테이션만 정리했음
특히 이 글에서는 Getter, Setter 메서드만 정리돼있음
1. @Getter : Getter 메서드를 추가해주는 애너테이션
static 키워드가 붙은 멤버 변수는 Getter 메서드가 추가되지 않음
<< @Getter 애너테이션 예시 >>
<< 클래스에 @Getter 애너테이션을 사용했을 경우 >>
package jpaStudy;
import lombok.Getter;
@Getter
public class Member {
private int idx;
private String name;
private String tel;
private int age;
private double height;
private char booldType;
}
클래스에 @Getter 애너테이션을 사용하면 해당 클래스가 갖고 있는 모든 멤버 변수의 Getter 메서드를 추가해줌
<< 멤버 변수에 @Getter 애너테이션을 사용했을 경우 >>
package jpaStudy;
import lombok.Getter;
public class Member {
@Getter
private int idx;
private String name;
@Getter
private String tel;
private int age;
private double height;
@Getter
private char booldType;
}
멤버 변수에 @Getter 애너테이션을 사용하면 해당 멤버 변수만 Getter 메서드를 추가해줌
위 코드는 idx, tel, booldType 멤버 변수만 Getter 메서드가 생성됨
참고로 클래스와 멤버 변수 모두 각자 @Getter 애너테이션을 가질 수 있음
속성 |
속성 명 | onMethod |
설명 | onConstructor 속성과 같은 역할을 하는 속성 속성의 값으로 애너테이션을 사용함 Getter 메서드에 특정 애너테이션을 달아주는 속성 여러 애너테이션을 달때는 배열 형식으로 애너테이션들을 나열하면 됨 자바 8버전까지는 이 속성명이 onMethod_ 이지만 자바 8 이후부터는 이 속성명이 onMethod 로 바뀜 |
속성 명 | value |
설명 | access 속성과 같은 역할을 하는 속성 Getter 메서드에 접근 제어자를 지정할 수 있음 이 속성의 값은 AccessLevel Enum을 사용해 지정함 |
속성 명 | lazy |
설명 | 객체가 필요할 때 Getter 메서드가 그 객체를 생성하는 방식으로 만들어 주는 속성 |
<< onMethod, value 속성 예시 >>
package jpaStudy;
import lombok.AccessLevel;
import lombok.Getter;
@Getter
public class Member {
@Getter(value = AccessLevel.PRIVATE)
private int idx;
private String name;
@Getter(onMethod = @__(@Deprecated))
private String tel;
private int age;
private double height;
private char booldType;
}
우선 클래스에 @Getter 애너테이션이 달려있으므로 Member 클래스가 갖고 있는 모든 멤버 변수에 Getter 메서드가 추가됨
그 후 idx 멤버 변수에는 value 속성이 PRIVATE인 @Getter 애너테이션이 달려있으므로 idx 멤버 변수의 Getter 메서드 접근제어자가 private 으로 바뀜
또한 tel 멤버 변수에는 onMethod 속성이 @Deprecated인 @Getter 애너테이션이 달려있으므로 tel 멤버 변수의 Getter 메서드에 @Deprecated 애너테이션이 달림
생성되는 Getter 메서드의 모습은 아래 코드를 참고하자
package jpaStudy;
@Getter
public class Member {
@Getter(value = AccessLevel.PRIVATE)
private int idx;
private String name;
@Getter(onMethod = @__(@Deprecated))
private String tel;
private int age;
private double height;
private char booldType;
private int getIdx() {
return this.idx;
}
@Deprecated
public String getTel() {
return this.tel;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public double getHeight() {
return this.height;
}
public char getBooldType() {
return this.booldType;
}
}
value 속성을 사용하면 특정 멤버 변수만 Getter 메서드가 만들어지지 않도록 할 수 있음
아래 코드를 보면 idx, height 멤버 변수에 @Getter 애너테이션을 붙였고 value 속성의 값을 AccessLevel.NONE 으로 지정했음
이렇게 하면 해당 멤버 변수만 Getter 메서드가 만들어지지 않음
package jpaStudy;
import lombok.AccessLevel;
import lombok.Getter;
@Getter
public class Member {
@Getter(value=AccessLevel.NONE)
private int idx;
private String name;
private String tel;
private int age;
@Getter(value=AccessLevel.NONE)
private double height;
private char booldType;
}
만들어지는 코드는 아래와 같음
package jpaStudy;
public class Member {
private int idx;
private String name;
private String tel;
private int age;
private double height;
private char booldType;
public String getName() {
return this.name;
}
public String getTel() {
return this.tel;
}
public int getAge() {
return this.age;
}
public char getBooldType() {
return this.booldType;
}
}
<< lazy 속성 예시 >>
아래 lastLoginDateTime 멤버 변수와 같이 멤버 변수를 선언한다면 Member 클래스를 사용해 인스턴스를 생성하는 시점에 멤버 변수의 인스턴스가 만들어질 것
package jpaStudy;
import java.time.LocalDateTime;
import lombok.Getter;
@Getter
public class Member {
private int idx;
private LocalDateTime lastLoginDateTime = LocalDateTime.now();
}
그리고 위 Member 클래스에 @Getter 애너테이션이 붙어있으므로 최종적으로 Member 클래스는 다음과 같이 만들어질 것
package jpaStudy;
import java.time.LocalDateTime;
public class Member {
private int idx;
private LocalDateTime lastLoginDateTime = LocalDateTime.now();
public int getIdx() {
return this.idx;
}
public LocalDateTime getLastLoginDateTime() {
return this.lastLoginDateTime;
}
}
이때 만약 lastLoginDateTime 멤버 변수가 필요하긴 하지만 Member 클래스의 인스턴스를 생성할 때 lastLoginDateTime 멤버 변수의 인스턴스를 생성하는게 아니라 Member 클래스의 인스턴스를 생성하는건 생성하는 거고 그거와 별도로 "내가 원하는 시점에 lastLoginDateTime 멤버 변수의 인스턴스를 생성하고 싶다" 라면 아래와 같은 메서드를 둘 수 있을 것
package jpaStudy;
import java.time.LocalDateTime;
import lombok.Getter;
@Getter
public class Member {
private int idx;
private LocalDateTime lastLoginDateTime;
public LocalDateTime getLastLoginDateTime() {
if(lastLoginDateTime == null) {
lastLoginDateTime = LocalDateTime.now();
}
return lastLoginDateTime;
}
}
이 lastLoginDateTime 멤버 변수처럼 객체가 만들어질 때 인스턴스를 생성하는게 아니라 필요한 시점에 그 인스턴스를 생성하는 걸 "지연 초기화" 라고 함
또는 lazy 를 그대로 직역해 "게으른 초기화" 라고도 함
지연 초기화의 문제점은 "위와 같은 코드를 개발자가 직접 만들어야 하므로 번거롭다" 는 것과 "멀티쓰레딩 환경에서 안전하지 않다" 는 것
@Getter 애너테이선에 lazy 속성을 true로 지정하면 위와 같은 코드를 롬복이 자동으로 생성해주며 쓰레드에 안전하게까지 만들어주므로 위와 같은 상황을 굉장히 간단하게 해결할 수 있음
이제 @Getter 애너테이션에 lazy 속성을 true로 지정한 멤버 변수를 보자
package jpaStudy;
import java.time.LocalDateTime;
import lombok.Getter;
@Getter
public class Member {
private int idx;
@Getter(lazy = true)
private final LocalDateTime lastLoginDateTime = LocalDateTime.now();
}
lastLoginDateTime 멤버 변수의 @Getter 애너테이션을 빼고 본다면 뭐가 특별한거야? 싶은데 우선 @Getter 애너테이션에 lazy 속성을 true로 지정하려면 해당 멤버 변수는 반드시 final 키워드가 붙어야함
그리고 위에서 설명했듯이 @Getter 애너테이션 lazy 속성 덕분에 lastLoginDateTime에는 "지연 초기화"가 적용됨
최종적으로 만들어지는 Member 클래스 코드를 보면 다음과 같음
package jpaStudy;
import java.time.LocalDateTime;
import java.util.concurrent.atomic.AtomicReference;
public class Member {
private int idx;
private final AtomicReference<Object> lastLoginDateTime = new AtomicReference();
public LocalDateTime getLastLoginDateTime() {
Object value = this.lastLoginDateTime.get();
if (value == null) {
AtomicReference var2 = this.lastLoginDateTime;
synchronized (this.lastLoginDateTime) {
value = this.lastLoginDateTime.get();
if (value == null) {
LocalDateTime actualValue = LocalDateTime.now();
value = actualValue == null ? this.lastLoginDateTime : actualValue;
this.lastLoginDateTime.set(value);
}
}
}
return (LocalDateTime) (value == this.lastLoginDateTime ? null : value);
}
public int getIdx() {
return this.idx;
}
}
위 코드를 보고 이해가 된다면 이해하면 되겠지만 이해가 안된다 설명이 필요하다 한다면 이해하지 않아도됨
또한 이해하기 위한 설명은 이 글의 주제와 많이 벗어남
다른 블로그들의 글을 보면 lazy 속성을 캐시, 쓰레드에 안전함 부분에 초점을 맞춰서 설명하는데 그 부분 보다는 "지연 초기화" 에 초점을 맞춰서 이해하는게 중요함
<< @Getter 애너테이션 심화 예시 >>
특정 멤버 변수만 Getter를 개발자가 직접 만들어야한다면 직접 추가하면 됨
개발자가 직접 Getter 애너테이션을 선언했으므로 Getter 애너테이션은 해당 멤버 변수의 Getter 메서드를 생성하지 않음
package jpaStudy;
import java.util.Optional;
import lombok.Getter;
@Getter
public class Member {
private int idx;
private String name;
private String tel;
private int age;
private double height;
private char booldType;
public Optional<Double> getHeight() {
return Optional.ofNullable(height);
}
}
Getter 애너테이션은 boolean 타입 멤버 변수의 Getter 메서드를 만들 때 Getter 메서드 이름에 is를 붙임
package jpaStudy;
import lombok.Getter;
@Getter
public class Member {
private int idx;
private String name;
private String tel;
private int age;
private double height;
private char booldType;
private boolean member;
}
위 Member 클래스 내 마지막 멤버 변수는 member 멤버 변수를 보면 boolean 타입 멤버 변수임
그래서 만들어지는 Getter 메서드를 보면 아래와 같음
package jpaStudy;
public class Member {
private int idx;
private String name;
private String tel;
private int age;
private double height;
private char booldType;
private boolean member;
public int getIdx() {
return this.idx;
}
// ...
public boolean isMember() {
return this.member;
}
}
이때 생기는 문제가 있음
Member 클래스 내 member 멤버 변수는 해당 회원 정보가 가입된 회원의 정보인지 아닌지 여부를 판단할 때 사용할 멤버 변수임
그래서 가입된 회원의 정보일 경우 member 변수의 값은 true로 가입 하기 전 회원의 정보일 경우 member 변수의 값은 false 로 담을 것임
이럴 경우 보통 멤버 변수명은 is로 시작하니 member 멤버 변수의 이름을 isMember 로 바꾸자
package jpaStudy;
import lombok.Getter;
@Getter
public class Member {
private int idx;
private String name;
private String tel;
private int age;
private double height;
private char booldType;
private boolean isMember;
}
이와 같은 상황에서 isMember 멤버 변수의 Getter 메서드명은 어떻게 될까?
isisMember ? isIsMember ? 아래 코드를 보고 isMember 멤버 변수의 Getter 메서드 명을 확인해보자
package jpaStudy;
public class Member {
private int idx;
private String name;
private String tel;
private int age;
private double height;
private char booldType;
private boolean isMember;
public int getIdx() {
return this.idx;
}
// ...
public boolean isMember() {
return this.isMember;
}
}
이런 경우에는 Getter 메서드를 직접 추가해줘야함
package jpaStudy;
import lombok.Getter;
@Getter
public class Member {
private int idx;
private String name;
private String tel;
private int age;
private double height;
private char booldType;
private boolean isMember;
public boolean getIsMember() {
return isMember;
}
}
2. @Setter : Setter 메서드를 추가해주는 애너테이션
static 키워드가 붙은 멤버 변수는 Setter 메서드가 추가되지 않음
final 키워드가 붙은 멤버 변수는 Setter 메서드가 추가되지 않음
<< @Setter 애너테이션 예시 >>
<< 클래스에 @Setter 애너테이션을 사용했을 경우 >>
package jpaStudy;
import lombok.Setter;
@Setter
public class Member {
private int idx;
private String name;
private String tel;
private int age;
private double height;
private char booldType;
}
클래스에 @Setter 애너테이션을 사용하면 해당 클래스가 갖고 있는 모든 멤버 변수의 Setter 메서드를 추가해줌
<< 멤버 변수에 @Setter 애너테이션을 사용했을 경우 >>
package jpaStudy;
import lombok.Setter;
public class Member {
@Setter
private int idx;
private String name;
@Setter
private String tel;
private int age;
private double height;
@Setter
private char booldType;
}
멤버 변수에 @Setter 애너테이션을 사용하면 해당 멤버 변수만 Setter 메서드를 추가해줌
위 코드는 idx, tel, booldType 멤버 변수만 Setter 메서드가 생성됨
참고로 클래스와 멤버 변수 모두 각자 @Setter 애너테이션을 가질 수 있음
속성 |
속성 명 | onMethod |
설명 | onConstructor 속성, @Getter의 onMethod와 같은 역할을 하는 속성 속성의 값으로 애너테이션을 사용함 Setter 메서드에 특정 애너테이션을 달아주는 속성 여러 애너테이션을 달때는 배열 형식으로 애너테이션들을 나열하면 됨 자바 8버전까지는 이 속성명이 onMethod_ 이지만 자바 8 이후부터는 이 속성명이 onMethod 로 바뀜 |
속성 명 | value |
설명 | access 속성과 같은 역할을 하는 속성 Setter 메서드에 접근 제어자를 지정할 수 있음 이 속성의 값은 AccessLevel Enum을 사용해 지정함 |
속성 명 | onParam |
설명 | onConstructor 속성과 비슷한 역할을 하는 속성 속성의 값으로 애너테이션을 사용함 Setter 메서드의 파라미터에 특정 애너테이션을 달아주는 속성 여러 애너테이션을 달때는 배열 형식으로 애너테이션들을 나열하면 됨 자바 8버전까지는 이 속성명이 onMethod_ 이지만 자바 8 이후부터는 이 속성명이 onMethod 로 바뀜 |
@Setter 애너테이션은 @Getter 애너테이션과 대부분 동일하므로 @Getter 애너테이션과 다른 부분인 onParam 속성에 대한 예시만 들겠음
<< onParam 속성 예시 >>
package jpaStudy;
import lombok.NonNull;
import lombok.Setter;
public class Member {
@Setter(onParam = @__(@NonNull))
private int idx;
private String name;
private String tel;
private int age;
private double height;
private char booldType;
}
idx 멤버 변수에만 @Setter 애너테이션이 달렸으므로 idx 멤버 변수에만 Setter 메서드가 생성됨
또한 onParam 속성 값이 @NonNull 이기 때문에 해당 Setter의 매개 변수에 @NonNull 애너테이션이 붙음
여기서 주의할 점은 onParam 애너테이션은 Setter 메서드가 아닌 Setter 메서드의 매개변수에 애너테이션을 붙이는 것
만약 Setter 메서드에 애너테이션을 붙이고 싶다면 Getter와 마찬가지로 onMethod 속성을 사용 해야함
생성되는 Setter 메서드의 모습은 아래 코드를 참고하자
package jpaStudy;
import lombok.NonNull;
public class Member {
@Setter(onParam = @__(@NonNull))
private int idx;
private String name;
private String tel;
private int age;
private double height;
private char booldType;
public void setIdx(@NonNull int idx) {
this.idx = idx;
}
}
참고
- https://velog.io/@0giri/Lombok-%EC%82%AC%EC%9A%A9%EB%B2%95
- https://javabydeveloper.com/lombok-getter-setter-and-lazy-getters-examples/https://javabydeveloper.com/lombok-noargsconstructor-examples/
- https://projectlombok.org/features/
'기타' 카테고리의 다른 글
롬복 사용 / 자주 사용하는 롬복 애너테이션 정리 (Lombok Annotation ) - 메서드 관련 애너테이션 (2) (2) | 2023.06.22 |
---|---|
롬복 사용 / 자주 사용하는 롬복 애너테이션 정리 (Lombok Annotation ) - 생성자 관련 애너테이션 (0) | 2023.06.15 |
이클립스 디컴파일러 설치하기 ( Eclipse Decompiler ) (1) | 2023.06.14 |
롬복 ( Lombok ) 이란? / 롬복 설치 및 적용 (0) | 2023.06.14 |
Eclipse에서 Gradle로 자바 프로젝트 생성하기 (0) | 2023.06.13 |