롬복과 관련된 애너테이션들이 많이 있지만 자주 사용하는 애너테이션만 정리했음

특히 이 글에서는 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/

 

728x90
LIST