1. @ToString : toString 메서드를 오버라이딩 해주는 애너테이션

 

<< @ToString 애너테이션 예시 >>

더보기

package jpaStudy;

import lombok.ToString;

@ToString
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;
}

클래스 또는 멤버 변수 마다 @ToString 애너테이션을 사용할 수 있으며 클래스에 @ToString 애너테이션을 사용하면 모든 멤버 변수가 포함된 toString 메서드를 오버라이딩 함

위와 같이 클래스에 @ToString을 사용하면 아래와 같은 toString 메서드가 오버라이딩 됨

package jpaStudy;

public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;

	public String toString() {
		return "Member(idx=" + this.idx + ", name=" + this.name + ", tel=" + this.tel + ", age=" + this.age
				+ ", height=" + this.height + ", bloodType=" + this.bloodType + ")";
	}
}

 

 

멤버 변수 마다 @ToString 애너테이션을 사용한다면 방식이 살짝 달라짐

멤버 변수 마다 @ToString 애너테이션을 사용할 때는 아래와 같이 사용함

package jpaStudy;

import lombok.ToString;

@ToString
public class Member {
	private int idx;
	private String name;
	private String tel;
	@ToString.Exclude
	private int age;
	@ToString.Exclude
	private double height;
	@ToString.Exclude
	private char bloodType;
}

우선 클래스에 @ToString 애너테이션을 사용하고 멤버 변수에는 @ToString.Exclude 애너테이션을 사용함

@ToString.Exclude 애너테이션은 생긴것처럼 제외 대상을 지정할 때 사용하는 애너테이션임

위와 같이 특정 멤버 변수에 @ToString.Exclude 애너테이션을 사용하면 해당 멤버 변수만 toString 메서드에서 빠짐

package jpaStudy;

public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;

	public String toString() {
		return "Member(idx=" + this.idx + ", name=" + this.name + ", tel=" + this.tel + ", height=" + this.height
				+ ", bloodType=" + this.bloodType + ")";
	}
}

 

속성

 

속성 명 callSuper
설명 상속 관계가 맺어져있을 때 자식 클래스에 붙이는 애너테이션으로 부모 클래스의 toString 메소드를 호출할 지 여부를 지정하는 속성

<< callSuper 속성 사용 예시 >>

더보기

아래와 같이 @ToString 애너테이션을 갖고 있는 두 클래스가 있음

package jpaStudy;

import lombok.ToString;

@ToString
public class Parent {
	private int parentField;
}
package jpaStudy;

import lombok.ToString;

@ToString
public class Child extends Parent {
	private int childField;
}

이런 상황에서 자식 클래스가 만들어지는 형태를 보면 아래와 같음

package jpaStudy;

public class Child extends Parent {
	private int childField;

	public String toString() {
		return "Child(childField=" + this.childField + ")";
	}
}

 

이때 자식 클래스의 ToString에서 부모 클래스의 ToString 호출 결과에 본인의 ToString 결과를 합쳐서 return 하고 싶은 경우 callSuper 속성을 사용할 수 있음

package jpaStudy;

import lombok.ToString;

@ToString(callSuper = true)
public class Child extends Parent {
	private int childField;
}

 이와 같을 때 만들어지는 자식 클래스는 아래와 같음

package jpaStudy;

public class Child extends Parent {
	private int childField;

	public String toString() {
		return "Child(super=" + super.toString() + ", childField=" + this.childField + ")";
	}
}

 

 

속성 명 doNotUseGetters
설명 toString 메서드 내에서 멤버 변수에 접근할 때 this 로 접근할 지 getter 로 접근할 지 결정하는 속성
기본적으로 this 로 멤버 변수에 접근하며 이 속성의 값을 true로 지정하면 this 대신 getter 로 멤버 변수에 접근함

<< doNotUseGetters 속성 사용 예시 >>

더보기

package jpaStudy;

import lombok.ToString;

@ToString
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;
}

위와 같은 Member 클래스는 아래와 같이 만들어질 것

package jpaStudy;

public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;

	public String toString() {
		return "Member(idx=" + this.idx + ", name=" + this.name + ", tel=" + this.tel + ", age=" + this.age
				+ ", height=" + this.height + ", bloodType=" + this.bloodType + ")";
	}
}

 

이때 멤버 변수에 접근할 때 this 가 아닌 getter 로 접근하고 싶다면 아래와 같이 doNotUseGetters 속성을 사용할 수 있음

단, 이 속성을 사용하려면 멤버 변수에 Getter 메서드가 필요함

package jpaStudy;

import lombok.Getter;
import lombok.ToString;

@ToString(doNotUseGetters = false)
@Getter
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;
}

 

위와 같이 doNotUseGetters 속성을 사용하면 아래와 같이 toString 메서드가 만들어짐

package jpaStudy;

public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;

	public String toString() {
		return "Member(idx=" + this.getIdx() + ", name=" + this.getName() + ", tel=" + this.getTel() + ", age="
				+ this.getAge() + ", height=" + this.getHeight() + ", bloodType=" + this.getBloodType() + ")";
	}
    
    // Getter
}

 

 

속성 명 exclude
설명 toString 메서드에서 제외할 멤버 변수를 지정하는 속성
멤버 변수의 이름은 배열 형식으로 지정하며 위에서 알아본 @ToString.Exclude 와 같은 역할을 함
또한 롬복은 곧 이 속성을 Deprecated 할 예정이니 이 속성을 사용하지 말고 @ToString.Exclude 애너테이션을 사용할 것을 권장함

<< exclude 속성 예시 >>

더보기

package jpaStudy;

import lombok.ToString;

@ToString(exclude = {"idx", "name", "tel"})
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;
}

위와 같이 toString 메서드에서 제외할 멤버 변수명을 하나 이상 지정할 수 있음

위와 같이 exclude 속성을 사용했을 때 만들어지는 클래스는 아래와 같음

package jpaStudy;

public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;

	public String toString() {
		return "Member(age=" + this.age + ", height=" + this.height + ", bloodType=" + this.bloodType + ")";
	}
}

 

@ToString 애너테이션에 exclude 속성 대신 롬복에서 권장하는 방법인 멤버 변수에 @ToString.Exclude 를 사용하자

package jpaStudy;

import lombok.ToString;

@ToString
public class Member {
	@ToString.Exclude
	private int idx;
	@ToString.Exclude
	private String name;
	@ToString.Exclude
	private String tel;
	private int age;
	private double height;
	private char bloodType;
}

 

 

속성 명 includeFieldNames
설명 toString 메서드에서 멤버 변수의 이름을 포함할 지 여부를 지정하는 속성

<< includeFieldNames 속성 예시 >>

더보기

package jpaStudy;

import lombok.ToString;

@ToString
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;
}

위와 같이 @ToString 애너테이션을 사용했을 때 어떤 클래스가 만들어질 지는 너무 잘 알고 있으니 따로 설명하진 않겠음

 

toString 메서드가 반환하는 문자열에서 멤버 변수 이름은 제외하고 싶다면 includeFieldNames 속성을 사용함

package jpaStudy;

import lombok.ToString;

@ToString(includeFieldNames = false)
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;
}

위와 같이 includeFieldNames 속성을 사용했을 때 아래와 같이 클래스가 만들어짐

package jpaStudy;

public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;

	public String toString() {
		return "Member(" + this.idx + ", " + this.name + ", " + this.tel + ", " + this.age + ", " + this.height + ", "
				+ this.bloodType + ")";
	}
}

 

 

속성 명 of
설명 toString 메서드에서 포함할 멤버 변수를 지정하는 속성
멤버 변수의 이름은 배열 형식으로 지정하며 이 속성 대신 멤버 변수에 @ToString.Include 애너테이션을 지정할 수 있음
또한 롬복은 곧 이 속성을 Deprecated 할 예정이니 이 속성을 사용하지 말고 @ToString.Include 애너테이션을 사용할 것을 권장함

<< of 속성 예시 >>

더보기

package jpaStudy;

import lombok.ToString;

@ToString(of = {"idx", "name", "age"})
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;
}

위와 같이 of 속성을 사용해 toString이 반환할 멤버 변수를 지정할 수 있음

그러나 롬복이 권장하는 방법은 아님

of 속성과 동일한 역할을 하지만 롬복이 권장하는 방법은 아래와 같음

package jpaStudy;

import lombok.ToString;

@ToString(onlyExplicitlyIncluded = true)
public class Member {
	@ToString.Include
	private int idx;
	@ToString.Include
	private String name;
	private String tel;
	@ToString.Include
	private int age;
	private double height;
	private char bloodType;
}

 위와 같이 @ToString.Include 애너테이션을 사용하면 아래와 같이 클래스가 만들어짐

package jpaStudy;

public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;

	public String toString() {
		return "Member(idx=" + this.idx + ", name=" + this.name + ", age=" + this.age + ")";
	}
}

여기서 onlyExplicitlyIncluded 속성은 밑에서 설명함


 

 

속성 명 onlyExplicitlyIncluded
설명 @ToString.Exclude, @ToString.Include 애너테이션 적용 여부를 지정하는 속성

<< onlyExplicitlyIncluded 속성 사용 예시 >>

더보기

이 속성의 기본값은 false이며 이 속성의 값이 true이면 @ToString.Include 애너테이션이 동작하고 이 속성의 값이 false이면 @ToString.Exclude 애너테이션이 동작함

 

@ToString.Include 애너테이션을 사용하고 싶다면 반드시 클래스명 위에 @ToString(onlyExplicitlyIncluded = true) 애너테이션을 달아줘야함

 

 

 

@ToString.Exclude 애너테이션을 사용하고 싶다면 반드시 클래스명 위에 @ToString 또는  @ToString(onlyExplicitlyIncluded = false) 애너테이션을 달아줘야함

 

@ToString.Exclude 애너테이션의 선택지가 두 개( @ToString, @ToString(onlyExplicitlyIncluded = false) ) 인 이유는 onlyExplicitlyIncluded 속성의 기본값이 false이기 때문 즉 선택지 두 개가 같은 것



2. @EqualsAndHashCode : equals 메서드와 hashcode 메서드를 오버라이딩 해주는 애너테이션

 

<< @EqualsAndHashCode 애너테이션 예시 >>

더보기

package jpaStudy;

import lombok.EqualsAndHashCode;

@EqualsAndHashCode
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;
}

위와 같이 @EqualsAndHashCode 애너테이션을 사용하면 아래와 같은 클래스가 만들어짐

package jpaStudy;

public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;

	public boolean equals(Object o) {
		if (o == this) {
			return true;
		} else if (!(o instanceof Member)) {
			return false;
		} else {
			Member other = (Member) o;
			if (!other.canEqual(this)) {
				return false;
			} else if (this.idx != other.idx) {
				return false;
			} else if (this.age != other.age) {
				return false;
			} else if (Double.compare(this.height, other.height) != 0) {
				return false;
			} else if (this.bloodType != other.bloodType) {
				return false;
			} else {
				Object this$name = this.name;
				Object other$name = other.name;
				if (this$name == null) {
					if (other$name != null) {
						return false;
					}
				} else if (!this$name.equals(other$name)) {
					return false;
				}

				Object this$tel = this.tel;
				Object other$tel = other.tel;
				if (this$tel == null) {
					if (other$tel != null) {
						return false;
					}
				} else if (!this$tel.equals(other$tel)) {
					return false;
				}

				return true;
			}
		}
	}

	protected boolean canEqual(Object other) {
		return other instanceof Member;
	}

	public int hashCode() {
		int PRIME = true;
		int result = 1;
		int result = result * 59 + this.idx;
		result = result * 59 + this.age;
		long $height = Double.doubleToLongBits(this.height);
		result = result * 59 + (int) ($height ^ $height >>> 32);
		result = result * 59 + this.bloodType;
		Object $name = this.name;
		result = result * 59 + ($name == null ? 43 : $name.hashCode());
		Object $tel = this.tel;
		result = result * 59 + ($tel == null ? 43 : $tel.hashCode());
		return result;
	}
}

이 글을 읽는 분들은 이미 자바를 충분히 익혔을 것이므로 Equals 메서드와 hashCode 메서드에 대해서 따로 설명하진 않음

 

멤버 변수에 static 키워드가 붙으면 @EqualsAndHashCode 애너테이션은 어떻게 반응할까?

멤버 변수에 static, transient 키워드가 붙으면 @EqualsAndHashCode 애너테이션의 대상에서 빠짐

 

아래와 같이 간단하게 static, transient 키워드가 붙은 멤버 변수만 가지고 있는 클래스의 경우를 보자

package jpaStudy;

import lombok.EqualsAndHashCode;

@EqualsAndHashCode
public class Member {
	private static int idx;
	private transient String name;
}

 

멤버 변수에 static, transient 키워드가 붙은 멤버 변수는 이 애너테이션의 대상에서 빠진다고 했으므로 위 Member 클래스는 아래와 같이 만들어짐

package jpaStudy;

public class Member {
	private static int idx;
	private transient String name;

	public boolean equals(Object o) {
		if (o == this) {
			return true;
		} else if (!(o instanceof Member)) {
			return false;
		} else {
			Member other = (Member) o;
			return other.canEqual(this);
		}
	}

	protected boolean canEqual(Object other) {
		return other instanceof Member;
	}

	public int hashCode() {
		int result = true;
		return 1;
	}
}

 

equals 메서드에서는 멤버 변수에 대한 비교는 빠지고 인스턴스 자체만 비교하는 코드가 생성됨

hashCode 메서드에서는 멤버 변수에 대한 해시화가 빠져 1만 return 함을 알 수 있음

 

transient 키워드에 대한 자세한 설명은 아래 블로그를 참고하자

https://nesoy.github.io/articles/2018-06/Java-transient


 

속성

 

속성 명 cacheStrategy
설명 이 인스턴스의 해시값을 기억할지 여부를 지정하는 속성

해시값은 인스턴스의 고유한 값이므로 인스턴스 내 멤버 변수의 값이 변하지 않는다면 hashcode 메서드는 항상 같
은 값을 반환할 것
이러한 점을 활용할 수 있도록 hashcode 메서드를 처음 호출했을 때 계산한 해시값을 기억해두고 hashcode 메서드를 두번째 호출하는 시점부터는 기억해둔 해시값을 반환함

이 속성에 대해서 자세히 알아보기 전에는 메모이제이션 역할이라고 생각했으나 메모이제이션이 아닌 속성명 그대로 이 속성은 캐싱 역할임

<< cacheStrategy 속성 예시 >>

더보기

아래와 같이 cacheStrategy 속성을 사용한 클래스를 보자

package jpaStudy;

import lombok.EqualsAndHashCode;
import lombok.EqualsAndHashCode.CacheStrategy;

@EqualsAndHashCode(cacheStrategy = CacheStrategy.LAZY)
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;
}

 

cacheStrategy 속성을 사용했을 경우 hashcode 메서드는 아래와 같이 만들어짐

package jpaStudy;

public class Member {
	private transient int $hashCodeCache;
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;

	// equals 메서드 생략

	public int hashCode() {
		if (this.$hashCodeCache != 0) {
			return this.$hashCodeCache;
		} else {
			int PRIME = true;
			int result = 1;
			int result = result * 59 + this.idx;
			result = result * 59 + this.age;
			long $height = Double.doubleToLongBits(this.height);
			result = result * 59 + (int) ($height ^ $height >>> 32);
			result = result * 59 + this.bloodType;
			Object $name = this.name;
			result = result * 59 + ($name == null ? 43 : $name.hashCode());
			Object $tel = this.tel;
			result = result * 59 + ($tel == null ? 43 : $tel.hashCode());
			if (result == 0) {
				result = Integer.MIN_VALUE;
			}

			this.$hashCodeCache = result;
			return result;
		}
	}
}

 

여기서 멤버 변수의 변화에 주목해야함

처음 계산한 해시값을 기억하기 위해 $hashCodeCache 멤버 변수가 추가됬음

그리고 hashcode 메서드를 처음 호출할 때만 이 인스턴스의 해시값을 비교하고 두 번째 호출부터는 계산해둔 해시값을 반환함

 

즉, 처음 hashcode 메서드를 호출했을 때와 그 이후 hashcode 메서드를 호출했을 때 멤버 변수의 값이 바뀌면 hashcode 메서드는 잘못된 해시값을 반환함


 

 

속성 명 onParam
설명 equals 메서드에 애너테이션을 붙이고 싶을 때 사용하는 속성

생성자와 관련된 롬복 애너테이션에서 onConstructor 속성과 같은 역할을 하는 속성
( onConstructor 속성에 대해서 모른다면 https://codingaja.tistory.com/135 이 글 참고 )

<< onParam 속성 예시 >>

더보기

package jpaStudy;

import lombok.EqualsAndHashCode;
import lombok.NonNull;

@EqualsAndHashCode(onParam=@__({@NonNull}))
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;
}

위와 같이 equals 메서드에 특정 애너테이션을 달 수 있음

위와 같은 경우 아래와 같이 클래스가 만들어짐

package jpaStudy;

import lombok.NonNull;

public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;

	public boolean equals(@NonNull Object o) {
		// 생략
	}

	// canEquals 메서드 생략

	// hashCode 메서드 생략
}

 

 

속성 명 callSuper
설명 상속 관계가 맺어져있을 때 자식 클래스에 붙이는 애너테이션으로 부모 클래스의 equals 메소드와 hashcode 메서드를 호출할 지 여부를 지정하는 속성

 

속성 명 doNotUseGetters
설명 equals 메서드와 hashcode 메서드 내에서 멤버 변수에 접근할 때 this 로 접근할 지 getter 로 접근할 지 결정하는 속성

위에서 알아본 @ToString 애너테이션의 doNotUseGetters 속성과 같음

 

속성 명 exclude
설명 equals 메서드와 hashcode 메서드에서 제외할 멤버 변수를 지정하는 속성

위에서 알아본 @ToString 애너테이션의 exclude 속성과 같음

 

속성 명 of
설명 equals 메서드와 hashcode 메서드에 포함할 멤버 변수를 지정하는 속성
멤버 변수의 이름은 배열 형식으로 지정하며 이 속성 대신 멤버 변수에 @EqualsAndHashCode.Include 애너테이션을 지정할 수 있음
또한 롬복은 곧 이 속성을 Deprecated 할 예정이니 이 속성을 사용하지 말고 @EqualsAndHashCode.Include 애너테이션을 사용할 것을 권장함

위에서 알아본 @ToString 애너테이션의 of 속성과 같음

 

속성 명 onlyExplicitlyIncluded
설명 @EqualsAndHashCode.Exclude, @EqualsAndHashCode.Include 애너테이션 적용 여부를 지정하는 속성

위에서 알아본 @ToString 애너테이션의 onlyExplicitlyIncluded 속성과 같음

5. @With : 불변 ( Immuable ) 객체를 만들 때 사용하는 애너테이션으로 Setter와 비슷하지만 완전히 다른 동작을 하는 with 메서드를 생성해주는 애너테이션

Setter 는 해당 객체의 멤버 변수 값을 바꿔주기만 하기 때문에 Setter 메서드의 반환 타입은 void 임

with 메서드는 해당 객체가 가지고 있는 멤버 변수의 값에 with로 지정한 멤버 변수의 값을 바꾼 새로운 객체를 반환하는 메서드임

따라서 with 메서드의 반환 타입은 클래스임

 

<< @With 애너테이션 예시 >>

더보기

우선 @With 애너테이션을 사용하려면 모든 멤버 변수를 초기화할 수 있는 생성자가 필요함

package jpaStudy;

import lombok.AllArgsConstructor;
import lombok.With;

@AllArgsConstructor
@With
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;
}

위와 같이 @With 애너테이션은 모든 멤버 변수를 초기화하는 @AllArgsConstructor 애너테이션과 함께 사용하며 @With 애너테이션을 사용한 클래스는 아래와 같이 만들어짐

package jpaStudy;

public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char bloodType;

	public Member(int idx, String name, String tel, int age, double height, char bloodType) {
		this.idx = idx;
		this.name = name;
		this.tel = tel;
		this.age = age;
		this.height = height;
		this.bloodType = bloodType;
	}

	public Member withIdx(int idx) {
		return this.idx == idx ? this : new Member(idx, this.name, this.tel, this.age, this.height, this.bloodType);
	}

	public Member withName(String name) {
		return this.name == name ? this : new Member(this.idx, name, this.tel, this.age, this.height, this.bloodType);
	}

	public Member withTel(String tel) {
		return this.tel == tel ? this : new Member(this.idx, this.name, tel, this.age, this.height, this.bloodType);
	}

	public Member withAge(int age) {
		return this.age == age ? this : new Member(this.idx, this.name, this.tel, age, this.height, this.bloodType);
	}

	public Member withHeight(double height) {
		return this.height == height
				? this
				: new Member(this.idx, this.name, this.tel, this.age, height, this.bloodType);
	}

	public Member withBloodType(char bloodType) {
		return this.bloodType == bloodType
				? this
				: new Member(this.idx, this.name, this.tel, this.age, this.height, bloodType);
	}
}

 

각 멤버 변수 이름에 맞는 with 메서드가 생성되며 with 메서드가 반환하는 값은 전달 받은 값을 갖고 있는 새로운 객체임

이렇게 불변 객체를 만들고 싶을 때 간단하게 @With 애너테이션을 사용할 수 있음

 

@With 애너테이션은 위와 같이 클래스에 붙여서 해당 클래스가 갖고 있는 모든 멤버 변수에 맞는 with 메서드를 생성할 수도 있지만 멤버 변수에 @With 애너테이션을 붙여 특정 멤버 변수만 with 메서드가 생성되도록 할 수 있음

package jpaStudy;

import lombok.AllArgsConstructor;
import lombok.With;

@AllArgsConstructor
public class Member {
	@With
	private int idx;
	private String name;
	@With
	private String tel;
	private int age;
	private double height;
	private char bloodType;
}

 

참고

 - https://mangkyu.tistory.com/131

 - https://tecoble.techcourse.co.kr/post/2021-04-26-defensive-copy-vs-unmodifiable/


 

속성

 

속성 명 onMethod
설명 with 메서드에 애너테이션을 추가하고 싶을 때 사용하는 속성

생성자 관련된 애너테이션의 onConstructor 속성과 같은 역할을 하는 속성

 

속성 명 onParam
설명 with 메서드의 파라미터에 애너테이션을 추가하고 싶을 때 사용하는 속성

@Setter 애너테이션의 onParam 속성과 같은 역할을 하는 속성

 

속성 명 value
설명 with 메서드에 접근 제어자를 지정하는 속성

@Getter, @Setter 애너테이션의 value 속성과 같은 역할을 하는 속성
728x90
LIST

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

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

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


 

1. @NoArgsConstructor : 기본 생성자를 만들어주는 애너테이션

 

<< @NoArgsConstructor 애너테이션 예시 >>

더보기

<< @NoArgsConstructor 애너테이션을 사용하지 않았을 경우 >>

package jpaStudy;

public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
}

생성자가 없으므로 자바는 Member 클래스에 기본 생성자를 추가해줌

 

<< @NoArgsConstructor 애너테이션을 사용했을 경우 >>

package jpaStudy;

import lombok.NoArgsConstructor;

@NoArgsConstructor
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
}

@NoArgsConstructor 애너테이션을 적용했으므로 롬복이 Member 클래스에 기본 생성자를 추가해줌

 

잘 알겠지만 위 두 상황은 똑같이 기본 생성자가 추가되므로 @NoArgsConstructor 애너테이션을 사용한 의미가 없음


 

속성

 

속성 명 force
설명 이 속성은 두 가지 역할을 함

1. 기본 생성자를 강제로 생성할지 여부를 지정할 수 있음
  기본값은 false로 이 속성의 값이 false일 때 생성자가 있을 경우 이 애너테이션은 동작하지 않음
  이 속성의 값이 true일 때 생성자가 있어도 이 애너테이션이 동작해 기본 생성자를 추가함

2. final 키워드가 붙은 멤버 변수가 있을 경우 이 속성의 값을 true로 지정하지 않으면 이 애너테이션이 컴파일 오류를 일으킴
  final 키워드가 붙은 멤버 변수가 있을 경우 이 속성의 값을 반드시 true로 지정해야하며 그렇게 했을 때 롬복은 final 키워드가 붙은 멤버 변수의 값을 기본값으로 초기화해줌

<< force 속성 예시 >>

더보기

<< force 속성을 사용하지 않았을 경우 >>

package jpaStudy;

import lombok.NoArgsConstructor;

@NoArgsConstructor
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
	
	public Member(int idx, String name, String tel, int age, double height, char booldType) {
		super();
		this.idx = idx;
		this.name = name;
		this.tel = tel;
		this.age = age;
		this.height = height;
		this.booldType = booldType;
	}
}

@NoArgsConstructor 애너테이션이 있지만 Member 클래스에 이미 생성자가 있기 때문에 @NoArgsConstructor 애너테이션은 무시되 기본 생성자가 만들어지지 않음

 

<< force 속성을 사용했을 경우 >>

package jpaStudy;

import lombok.NoArgsConstructor;

@NoArgsConstructor(force = true)
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
	
	public Member(int idx, String name, String tel, int age, double height, char booldType) {
		super();
		this.idx = idx;
		this.name = name;
		this.tel = tel;
		this.age = age;
		this.height = height;
		this.booldType = booldType;
	}
}

@NoArgsConstructor 애너테이션의 force 속성을 true로 지정했기 때문에 Member 클래스에는 기본 생성자도 함께 만들어짐

 

<< final 키워드가 붙은 멤버 변수가 있을 경우 >>

package jpaStudy;

import lombok.NoArgsConstructor;

@NoArgsConstructor(force = true)
public class Member {
	private final int idx;
	private String name;
	private final String tel;
	private int age;
	private final double height;
	private final char booldType;
}

멤버 변수에 final 키워드가 붙었을 경우 @NoArgsConstructor 애너테이션을 사용한다면 반드시 force 속성을 true로 지정해줘야함

이렇게 하면 롬복은 Member 클래스의 기본 생성자를 아래와 같이 만들어줌

package jpaStudy;

import lombok.NoArgsConstructor;

@NoArgsConstructor(force = true)
public class Member {
	private final int idx;
	private String name;
	private final String tel;
	private int age;
	private final double height;
	private final char booldType;
	
	public Member() {
		idx = 0;
		tel = null;
		height = 0.0;
		booldType = 0;
	}
}

 

속성 명 access
설명 생성자의 접근제어자를 지정할 수 있음
이 속성의 값은 AccessLevel Enum을 사용해 지정함

<< access 속성 예시 >>

더보기

<< access 속성을 사용하지 않았을 경우 >>

package jpaStudy;

import lombok.NoArgsConstructor;

@NoArgsConstructor
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
}

 @NoArgsConstructor 애너테이션이 생성하는 기본 생성자의 접근 제어자가 public 으로 설정됨

 

<< access 속성을 사용했을 경우 >>

package jpaStudy;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access =  AccessLevel.PRIVATE)
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
}

@NoArgsConstructor 애너테이션의 access 속성을 PRIVATE 로 지정했기 때문에 이 애너테이션이 생성하는 기본 생성자의 접근 제어자가 private 으로 생성됨


 

속성 명 onConstructor
설명 속성의 값으로 애너테이션을 사용함
생성자에 특정 애너테이션을 달아주는 속성
여러 애너테이션을 달때는 배열 형식으로 애너테이션들을 나열하면 됨
자바 8버전까지는 이 속성명이 onConstructor_ 이지만 자바 8 이후부터는 이 속성명이 onConstructor 로 바뀜

<< onConstructor 속성 예시 >>

더보기

<< onConsturctor 속성을 사용하지 않았을 경우 >>

package jpaStudy;

import lombok.NoArgsConstructor;

@NoArgsConstructor
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
}

@NoArgsConstructor 애너테이션이 생성하는 기본 생성자에 아무런 애너테이션도 달리지 않음

 

<< onConstructor 속성을 사용했을 경우 >>

package jpaStudy;

import lombok.NoArgsConstructor;

@NoArgsConstructor(onConstructor = @__(@Deprecated))
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
}

onConstructor 애너테이션의 속성값을 지정하는 방식이 독특한데 @ 다음 밑 줄이 두 개임 ( @_ _ )

위와 같이 onConstructor 속성 값에 애너테이션을 넣으면 아래와 같이 기본 생성자에 그 애너테이션이 붙어서 만들어짐

package jpaStudy;

import lombok.NoArgsConstructor;

@NoArgsConstructor(onConstructor = @__(@Deprecated))
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
	
	@Deprecated
	public Member() {
		
	}
}

만약 onConstructor 속성을 사용해서 애너테이션을 여러 개 지정하고 싶다면 아래와 같이 배열의 형태로 애너테이션들을 나열하면 됨

package jpaStudy;

import lombok.NoArgsConstructor;

@NoArgsConstructor(onConstructor = @__({@Deprecated, @Inject, @NonNull}))
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
}

여기에 사용된 @Inject, @NonNull 애너테이션을 이해할 필요는 없음

이렇게 애너테이션을 여러 개 지정할 수 있다 를 보여주기 위해서 사용한 것


 

속성 명 staticName
설명 생성자를 감출 때 사용하는 속성

<< staticName 속성 예시 >>

더보기

<< staticName 속성을 사용하지 않았을 경우 >>

package jpaStudy;

import lombok.NoArgsConstructor;

@NoArgsConstructor
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
}

이제는 잘 알고 있듯 @NoArgsConstructor는 접근제어자가 public인 기본 생성자를 만들어줌

 

<< staticName 속성을 사용했을 경우 >>

package jpaStudy;

import lombok.NoArgsConstructor;

@NoArgsConstructor(staticName = "getInstance")
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
}

staticName 속성을 사용하면 생성자를 감추기 위해 생성자의 접근 제어자를 private으로 만듬

즉, access = AccessLevel.PRIVATE 을 사용한 효과도 같이 얻음

그 후 이름은 getInstance 이고 반환 타입은 Member 타입 객체인 메서드를 만들어줌

 

아래 코드를 참고하자

package jpaStudy;

import lombok.NoArgsConstructor;

@NoArgsConstructor(staticName = "getInstance")
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
	
	private Member() {
		
	}
	
	public Member getInstance() {
		return new Member();
	}
}


2. @RequiredArgsConstructor : final 키워드가 붙은 멤버 변수만 포함된 생성자를 만들어주는 애너테이션

 

<< @RequiredArgsConstructor 애너테이션 예시 >>

더보기

<< @RequiredArgsConstructor 애너테이션을 사용하지 않았을 경우 >>

package jpaStudy;

public class Member {
	private final int idx;
	private String name;
	private final String tel;
	private int age;
	private final double height;
	private final char booldType;
}

 멤버 변수에 final 키워드가 있기 때문에 컴파일 오류가 발생하는 코드임

컴파일 오류를 피하려면 개발자가 직접 아래와 같이 어떤 값을 할당해주거나 생성자를 통해 어떤 값을 할당 받도록 해야함

 

<< @RequiredArgsConstructor 애너테이션을 사용했을 경우 경우 >>

package jpaStudy;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class Member {
	private final int idx;
	private String name;
	private final String tel;
	private int age;
	private final double height;
	private final char booldType;
}

 @RequiredArgsConstructor 애너테이션을 사용했을 경우 final 키워드가 붙은 멤버 변수만 값을 할당하는 생성자가 만들어짐

 

만들어지는 생성자의 형태는 아래 코드 참고

package jpaStudy;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class Member {
	private final int idx;
	private String name;
	private final String tel;
	private int age;
	private final double height;
	private final char booldType;

	public Member(int idx, String tel, double height, char booldType) {
		this.idx = idx;
		this.tel = tel;
		this.height = height;
		this.booldType = booldType;
	}
}

 

속성

 

속성 명 access
설명 생성자의 접근제어자를 지정할 수 있음
이 속성의 값은 AccessLevel Enum을 사용해 지정함

※ @NoArgsConstructor 애너테이션에서 설명한 것과 동일한 속성이므로 예시는 생략 ※

 

속성 명 onConstructor
설명 속성의 값으로 애너테이션을 사용함
생성자에 특정 애너테이션을 달아주는 속성
여러 애너테이션을 달때는 배열 형식으로 애너테이션들을 나열하면 됨
자바 8버전까지는 이 속성명이 onConstructor_ 이지만 자바 8 이후부터는 이 속성명이 onConstructor 로 바뀜

※ @NoArgsConstructor 애너테이션에서 설명한 것과 동일한 속성이므로 예시는 생략 

 

속성 명 staticName
설명 생성자를 감출 때 사용하는 속성

※ @NoArgsConstructor 애너테이션에서 설명한 것과 동일한 속성이므로 예시는 생략 

3. @AllArgsConstructor : 모든 멤버 변수를 포함한 생성자를 만들어주는 애너테이션

 

<< @AllArgsConstructor 애너테이션 예시 >>

더보기

<< @AllArgsConstructor 애너테이션을 사용했을 경우 >>

package jpaStudy;

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
}

@AllArgsConstructor 애너테이션을 사용했을 경우 아래와 같이 모든 멤버 변수에 값을 할당하는 생성자가 만들어짐

package jpaStudy;

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class Member {
	private int idx;
	private String name;
	private String tel;
	private int age;
	private double height;
	private char booldType;
	
	public Member(int idx, String name, String tel, int age, double height, char booldType) {
		super();
		this.idx = idx;
		this.name = name;
		this.tel = tel;
		this.age = age;
		this.height = height;
		this.booldType = booldType;
	}
}

 

속성

 

생성자의 접근제어자를 지정할 수 있음
이 속성의 값은 AccessLevel Enum을 사용해 지정함

※ @NoArgsConstructor 애너테이션에서 설명한 것과 동일한 속성이므로 예시는 생략 

 

속성 명 onConstructor
설명 속성의 값으로 애너테이션을 사용함
생성자에 특정 애너테이션을 달아주는 속성
여러 애너테이션을 달때는 배열 형식으로 애너테이션들을 나열하면 됨
자바 8버전까지는 이 속성명이 onConstructor_ 이지만 자바 8 이후부터는 이 속성명이 onConstructor 로 바뀜

※ @NoArgsConstructor 애너테이션에서 설명한 것과 동일한 속성이므로 예시는 생략 

 

속성 명 staticName
설명 생성자를 감출 때 사용하는 속성

※ @NoArgsConstructor 애너테이션에서 설명한 것과 동일한 속성이므로 예시는 생략 

참고

 - https://velog.io/@0giri/Lombok-%EC%82%AC%EC%9A%A9%EB%B2%95

 - https://lovethefeel.tistory.com/71

 - https://javabydeveloper.com/lombok-noargsconstructor-examples/

 - https://projectlombok.org/features/

728x90
LIST

어떤 라이브러리 내 프로그램 ( .class 로 끝나는 파일 ) 내부를 보고 싶거나 Lombok ( 이하 롬복 ) 같은 라이브러리를 사용해 코드를 자동 생성했을 때 자동 생성된 코드 ( 역시나 .class 로 끝나는 파일 ) 내부를 보고 싶을 때가 있음

그럴 때는 디컴파일러로 .class 로 끝나는 파일의 내부를 볼 수 있음

 

InteliJ의 경우에는 디컴파일러가 내장되어있는 듯 하지만 Eclipse의 경우에는 디컴파일러가 내장되어있지 않아 별도로 설치해줘야함

 

이클립스에 디컴파일러를 설치하는 방법을 알아보자


이클립스 내 [ Help ] (1) -> [ Eclipse Marketplace ] (2) 로 이동

 

decompiler 검색 (1) -> Enhanced Class Decompilter XXX (2) 설치

 

이클립스에 설치되는 프로그램을 확인 후 [ Confirm ] (1) 클릭

 

라이선스 (1) 동의 (2) 후 [ Finish ] (3) 버튼을 클릭해 설치 진행

 

종종 진짜 이 프로그램을 이클립스에 설치하는게 맞냐는  확인창이 나오는데 [ 맞다 ] (1) 로 체크 후 [ Trust Selected ] (2) 버튼 클릭

 

해당 프로그램이 이클립스에 설치되면 이클립스를 재시작 하라는 안내창이 뜸

[ Restart Now ] (1) 버튼 클릭해 이클립스를 재시작하자

 

여기까지 이클립스에 디컴파일러 설치 완료 !


이클립스에서 우리가 설치한 디컴파일러를 사용해 .class 파일을 열도록 설정하자

 

이클립스 내 [ Window ] (1) -> [ Preferences ] (2)

 

[ Java ] (1) -> [ Decompiler ] (2) 에서 디컴파일러 관련된 설정을 할 수 있음

 

디컴파일러 관련된 설정을 한다면 주로 [ Default Class Decompiler ] 인 어떤 디컴파일러를 사용할 것인지 지정할 것

 

이게 무슨 말이냐 ~ ! 궁금하다면 접힌 글을 참고 ~ !

더보기

원래 디컴파일러를 사용하려면 디컴파일러 프로그램을 다운 받아 cmd 명령을 사용해 디컴파일러 프로그램으로 .class 파일을 디컴파일 해 봐야함

이 디컴파일러 프로그램의 종류는 여러 개가 있지만 가장 많이 사용하는 디컴파일러는 [ Default Class Decompiler ] 에 있는 CFR, FernFlower, JD-Core, Procyon, Quiltflower 임


디컴파일은 소프트웨어 리버스 엔지니어링에 속함

소프트웨어 리버스 엔지니어링은 다양하게 좋은 쪽으로 활용되기도 하지만 우리가 쉽게 생각할 수 있는 소프트웨어 리버스 엔지니어링의 활용은 해킹이나 소프트웨어 복제임

 

A 회사에서 카카오톡을 똑같이 복제한 초콜렛톡을 만들고 싶다고 해보자

합법적인 방법은 카카오톡의 기능들을 하나씩 사용해보면서 그 기능을 분석해 카카오톡과 똑같은 기능을 갖고 있는 초콜렛톡을 만들 수 있을 것

그러나 기능을 따라한 것이지 소스 코드를 따라한것은 아니기 때문에 카카오톡의 소스코드와 초콜렛톡의 소스코드는 다를 것

 

A 회사가 카카오톡과 소스 코드까지 똑같은 초콜렛톡을 만들고 싶다면 카카오 회사에 몰래 잠입해 카카오톡의 모든 소스 코드를 빼오는 방법이 있을 것

그러나 이는 발각 되기 쉬우므로 A 회사가 선택할 수 있는 또 다른 불법적인 방법은 소프트웨어 리버스 엔지니어링임


실행 프로그램 ( 자바로 예를 들면 .class로 끝나는 파일 / 윈도우에서 실행되는 파일들은 .exe 로 끝나는 파일 ) 은 바이트 코드 내지는 기계어로 이뤄져있기 때문에 일반적인 사람들이나 개발자들이 실행 프로그램을 열어 보더라도 이 프로그램이 어떤 코드로 이뤄졌는지 알 수는 없음

 

그러나 A 회사가 바이트 코드 내지는 기계어에 능통한 전문가를 채용한다면 말이 달라짐

바이트 코드 내지는 기계어로 구성된 실행 프로그램을 이 전문가가 분석한다면 바이트 코드 내지는 기계어를 통해 역(Reversing)으로 소스 코드를 알아낼 수 있음


그러나 이 전문가가 역으로 알아낸 소스 코드는 실제 카카오톡의 소스 코드와 완전히 100% 일치하지는 않음

소스코드를 직접 보고 배낀게 아니라 바이트 코드 내지는 기계어에서 소스코드를 유추한 것이기 때문임

마치 맛집 레시피를 훔치면 당연히 그 맛집 레시피와 동일한 레시피를 손에 넣겠지만 맛집에서 음식을 먹고 "이 음식은 이런 이런 재료가 들어갔을꺼야" 라고 추측 하는 것과 같음

 

전문가가 바이트 코드 내지는 기계어에 얼마나 능통하느냐에 따라 유추한 소스 코드의 질이 달라질 것


우리가 이클립스에 설치한 [ Enhanced Class Decompilter ] 는 디컴파일러 관련된 설정을 도와주는 프로그램이고 실제 디컴파일을 수행하는 주체는 Default Class Decompiler 로 선택한 디컴파일러 프로그램임

디컴파일러 프로그램이 제대로 만들어졌다면 디컴파일한 소스 코드의 질이 좋을 것이고 디컴파일러 프로그램이 제대로 만들어지지 않았다면 디컴파일한 소스 코드의 질이 낮을 것


[ Enhanced Class Decompilter ] 을 설치했을 때 기본 디컴파일러로 선택된 FernFlower 디컴파일러도 충분히 좋은 디컴파일러이지만 다른 디컴파일러도 좋은 디컴파일러임

각 디컴파일러에 대해서 자세히 설명하진 않겠음

각 디컴파일러에 대해서 자세히 알고 싶다면 https://woonizzooni.tistory.com/entry/Java-Decompiler-%EC%A2%85%EB%A5%98 이 글을 참고하거나 검색엔진에 각 디컴파일러 명으로 검색해보자


 

디컴파일러 설정은 그대로 두고 이제 .class 로 끝나는 파일을 디컴파일러가 해석해 소스 코드로 보여주도록 설정해야함

[ General ] (1) -> [ Editors ] (2) -> [ File Associations ] (3) 로 이동하자

 

모든 .class 로 끝나는 파일 (1) 을 열 때 사용할 기본 뷰어로 디컴파일러 (2) 를 선택 (3) 하자


소스 코드가 없는 .class 로 끝나는 파일 (1) 을 열 때 사용할 기본 뷰어로 디컴파일러 (2) 를 선택 (3) 하자


이제 보고 싶었던 .class 로 끝나는 파일을 열어 보면 ( 더블클릭 해보면 ) 보일 것

728x90
LIST

롬복 ( Lombok ) 이란 자바의 클래스와 멤버 변수를 위한 여러 가지 애너테이션을 제공해주는 라이브러리임

 

자바로 만든 클래스들은 Getter, Setter, 생성자 등을 갖고 있어야하는 경우가 많음

이럴 때 이클립스와 같은 개발툴을 사용하면 Getter, Setter, 생성자 등을 클릭 몇 번으로 만들 수 있음

그러나 클래스가 점점 많아지면 이 반복적인 작업도 귀찮아지기 마련...

귀찮아지다 보면 실수로 놓치는 경우가 생기고 그로 인해 예외가 발생할 수 있음

 

이렇게 Getter, Setter, 생성자 등이 반드시 필요한 클래스에 롬복이 제공하는 애너테이션을 사용하면 Getter, Setter, 생성자 등이 자동으로 추가됨


프로젝트에서 롬복을 사용하려면 우선 사용하고 있는 개발툴에 롬복을 설치해야함

 

롬복을 설치하기 위해 검색엔진에서 lombok 검색 (1) -> 첫 번째 검색 결과 (2) 로 이동

( 검색 결과가 다르다면 직접 URL을 입력해 Lombok 공식 홈페이지로 들어가자 / https://projectlombok.org/ )

 

 

롬복 공식 홈페이지 내 상단 메뉴 -> [ Download ] (1) 버튼 클릭

 

 

[ Download XXX ~ ] (1) 클릭 해 롬복 설치 파일을 다운로드 받자

 

 

그럼 이와 같이 jar 파일(1)이 다운 받아졌을 것

 

요즘에는 롬복을 설치할 수준이면 다들 jar 파일이 무엇인지 잘알겠지만~

jar 파일은 압축 파일의 한 형식으로 이 안에는 자바로 만든 프로그램이 들어있음


jar 파일을 압축 풀기 위해서는 java 명령을 사용해야함

lombok.jar 파일의 압축을 풀기 위해서는

 

1. cmd 창 열기

2. cmd 내에서 lombok.jar 파일이 위치한 다운로드 폴더로 이동

3. java -jar lombok.jar 명령을 사용해 jar 파일의 압축 풀기

 

를 진행해야함

 

cmd 창 열기 전에 우선 lombok.jar 파일이 위치한 다운로드 폴더의 경로를 복사해두자

 

lombok.jar 파일 우클릭(1) -> 속성(2) 클릭 -> 위치 (3) 복사

 

이제 순서대로 cmd 창을 열자

 

 

cd 명령과 복사해둔 다운로드 폴더 경로를 사용해 cmd 내에서 lombok.jar 파일이 위치한 다운로드 폴더로 이동하자

 

 

이제 dir (1) 해보면 다운로드 폴더에 들어있는 lombok.jar 파일 (2) 이 보일 것

 

 

이제 java -jar lombok.jar 명령 (1) 을 사용해 jar 파일의 압축 풀자


이제 압축이 풀리면서 롬복 설치 프로그램이 자동으로 실행됨

 

롬복 설치 프로그램이 실행됐을 때 어떤 문구가 뜰 수 있는데 어떤 문구가 뜬다면 무시해도됨

위에서 얘기했듯 프로젝트에서 롬복을 사용하려면 개발툴에 롬복을 설치해야함

그래서 여기까지 온 것

 

이제 롬복을 설치할 개발툴을 선택해야하는데 개발툴이 IDEs (1) 에 뜰 수도 있고 뜨지 않을 수 있음

개발툴이 IDEs에 떴다면 내가 사용하는 개발툴인지 반드시 확인하자

 

 

IDEs에 개발툴이 뜨지 않거나 떴는데 내가 사용하는 개발툴이 아니라면 바로 밑에 있는 [ Specify location ] 을 클릭해 롬복을 설치할 개발툴을 선택하면 됨

다음과 같이 롬복을 설치할 개발툴을 선택 (1) 하자

 

 

그 후에 [ Install / Update ] (2) 버튼을 클릭하면 설치 완료!
롬복을 설치하기 전 ! 개발툴이 열려있다면 닫고 설치하자

닫기 전에 설치해도 아마 문제는 생기지 않을 것

 

 

보통은 설치 버튼을 누르자마자 설치가 완료됨 ↓ ↓ ↓


인스톨러를 닫고 개발툴을 실행시키자

 

그 후 메이븐 또는 그래들로 자바 프로젝트를 하나 생성하자

 

Meven Repository 에서 lombok 라이브러리 dependency 를 추가하자

더보기

검색엔진에서 maven repositry 검색 (1) -> Maven Repository 사이트 선택 (2)

 

lombok 검색 (1) -> lombok 라이브러리 선택 (2)

 

적절한 버전 선택 (1)

 

메이븐을 사용하는 분은 Maven (1) 탭의 dependency 복사

그래들을 사용하는 분은 Gradle (2) 탭의 dependency 복사

 

메이븐을 사용하는분은 프로젝트 -> pom.xml -> dependencies 태그 내 복사한 dependency 붙여넣기

그래들을 사용하는분은 프로젝트 -> build.gradle -> dependencies 태그 내 복사한 dependency 붙여넣기


 

이제 프로젝트에서 롬복을 사용할 준비가 됐음

728x90
LIST

이미 이와 같은 문제? 를 겪고 이 글을 찾아온 분들이 대부분이겠지만 우선 이 글을 쓴 목적에 대해서 알아보자

Eclipse에서 자바 프로젝트를 생성하면 다음과 같이 생성됨

 

src 안에 패키지들을 추가해서 이런 저런 자바 프로그램을 개발함

 

 

그리고 어느 IDE든 Spring Boot 로 Gradle을 사용하는 SpringFramework 프로젝트를 생성하면 다음과 같이 생성됨

 src/main/java 안에 패키지들을 추가해 이런 저런 API들을 개발함

 

 

이번에는 Eclipse 내지는 STS4 를 사용해 Gradle을 사용하는 자바 프로젝트를 만들자

! 잠시 !

더보기

다른 블로그의 글들을 보면 컴퓨터에 Gradle을 다운 받고 gradle init 명령으로 Gradle 자바 프로젝트 를 만드는 글이 있는데 그런 경우는 개발툴을 활용하고 있지 못하는 경우임

세세하게 핸들링을 하려면 Gradle을 다운 받아 gradle 명령을 사용해서 프로젝트를 생성하지만 우리는 세세하게 핸들링을 할 필요까지는 없음

 

자바 프로그램을 개발 하는 방법이 여러 가지가 있겠지만 개발툴 없이 메모장으로 자바 코드를 작성하고 cmd 창에서 java 명령을 사용해서 직접 컴파일하고 실행시켜보면서 개발할 수도 있음

그러나 이렇게 개발하면 굉장히 불편하기 때문에 개발툴을 사용하는 것

 

이런것처럼 이클립스를 사용해서 편하게 Gradle 자바 프로젝트를 생성할 수 있는데 불편하게 Gradle을 다운 받고 gradle 명령을 사용해 프로젝트를 생성할 필요 없음

개발툴 안에서 마우스 몇 번 클릭이면 Gradle 자바 프로젝트를 만들 수 있음


Eclipse, STS4로 Gradle 자바 프로젝트를 만들려면 이클립스에 [ Buildship Gradle Integration 3.0 ] 이 설치되있어야함

 

개발툴 내 > [ Help ] > Eclipse Marketplace ] > gradle 검색 > Buildship Gradle Integeration 3.0 이 설치 되어있는지 확인하자

 

설치가 되어있지 않다면 굵은 글씨로 [ Install ] 버튼이 활성화 되어있고 설치 되어있다면 아래 이미지처럼 기울어진 채로 [ Installed ] 버튼이 비활성화 되어있을 것


설치가 되어있지 않다면 [ Install ]  버튼 눌러서 설치하면 됨

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

설치가 되어있는걸 확인한 후 Eclipse Marketplace 창은 닫고 [ Ctrl + N ] > gradle 검색(1) > Gradle Project 선택(2) > [ Next ] 클릭(3)

 

그러면 다음과 같이 소개 페이지가 보이는데 무시하고 [ Next ] (1) 클릭

 

생성할 프로젝트명, 설정 등을 하는 화면이 나오는데 우선 프로젝트명(1)은 demo로 입력하자

그 후 [ Next ] (2) 클릭

 

프로젝트와 관련된 여러 설정을 하는데 우선은 이 상태 그대로 넘어가자

[ Next ] (1) 클릭

 

마지막으로 만들어질 프로젝트 스펙이 나옴

 

(1). 프로젝트가 만들어질 위치

(2). 프로젝트에서 사용할 Gradle 버전

(3). 프로젝트에서 사용할 JDK의 위치

 

프로젝트 스펙을 확인 한 후 [ Finish ] (4) 클릭

 

 

 

 

 

 

 

 

 

 

 

 

이제 Gradle 자바 프로젝트가 만들어졌음

만들어진 Gradle 자바 프로젝트를 확인하기 전에 다시 한번 여기까지 온 과정을 떠올려보자

(1). 그냥 자바 프로젝트를 생성했을 때 프로젝트 구조

(2). Spring Boot를 사용해 Gradle을 사용하는 SpringFramework 프로젝트 구조

 

이번에는 방금 만든 Gradle 자바 프로젝트 구조를 보자

 

...?

 

우린 분명히 Gradle 자바 프로젝트를 만들었는데 구조가 왜 이럴까?

 

 

 

 

 

 

 

 

 

 


Gradle 6.6.1 이후 버전부터는 자바 프로젝트를 만들면 [ 프로젝트명 ] 으로 프로젝트가 만들어지고(1) 이 프로젝트와 연결된 lib 프로젝트가 하나 더 만들어짐(2) 

 

그리고 이 lib 프로젝트가 자바 프로젝트임

 

 

 

Gradle 6.6.1 이후 버전부터는 gradle 명령으로 프로젝트를 생성할 때 세세하게 핸들링을 할 수 있도록 Gradle 프로젝트의 구조가 바뀐 것

 

즉 (1)번 프로젝트는 자바 프로젝트에 적용될 gradle 설정이 들어있는 프로젝트이고 (2)번 프로젝트가 자바 프로젝트임

 

 

 

 

 

 

 

 

 

 


여기서 settings.gradle 파일 (1) 을 열어보자

이때 include('lib') (2) 가 보이는데 여기를 통해 실제 자바 프로젝트가 어떤 것인지 찾을 수 있음

 

상황에 따라서는 rootProject.name 값과 include 를 함께 참고해야 실제 자바 프로젝트가 어떤 것인지 찾을 수 있으니 [ Package Explorer ] 내 프로젝트 이름과 함께 대조해보면 됨

 

 

 

 


lib 프로젝트 > src/main/java > 패키지 안에 아래와 같이 샘플 코드를 추가해 실행시켜보자


이렇게 lib 프로젝트에 자바 프로그램을 개발하면 되지만 "난 이 구조가 너무 신경쓰인다! 하나로 통합된 구조의 프로젝트를 만들고싶다!" 라는 분은 Gradle의 버전을 6.6.1 이하로 낮추면 됨

 

이제 [ demo ] 프로젝트를 지워보자

그럼 지금까지 일반적인 자바 프로젝트를 지울 때와 다른 선택지(1)가 보임

이를 통해서 또 두 프로젝트가 연결되어있다는걸 확인할 수 있음

 

하나로 연결된 두 프로젝트를 컴퓨터에서 아예 지우고 [ 하나로 통합된 구조의 Gradle 자바 프로젝트 ] 를 만들 것이기 때문에 (2) 번을 체크한 후 지우자

 

다시 [ Ctrl + N ] > gradle 검색 > Gradle Project 선택 > 프로젝트명을 입력하는 단계까지 오자

프로젝트명은 전과 마찬가지로 demo 로 하고 [ Next ] (1) 클릭

 

Gradle 설정 화면에서 다음과 같이 [ Override workspace settings ] (1) 를 클릭해 지금 만들 프로젝트의 Gradle 버전을 바꾸자

 

Gradle 버전은 (2) 에서 바꿀 수 있으며 6.6.1 버전 이하로 선택하자

단! 이때 Gradle 6.6.1 이하 버전은 JDK 11 버전 이하로 선택해야함

그래서 (3) 과 같이 JDK 11 이하 버전의 디렉토리 경로를 지정해주자

 

그 후 [ Next ] (4) 를 눌러 프로젝트 스펙을 확인하고 프로젝트를 만들어도 되고 바로 [ Finish ] (5) 를 눌러 프로젝트를 만들어도 됨

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이제 우리의 마음을 편안하게? 해줄 구조로 자바 프로젝트가 만들어졌음

 

 

Gradle 최신 버전을 사용해서 둘로 나눠진 프로젝트이든 Gradle 6.6.1 이하 버전을 사용해서 만든 프로젝트이든 자바 프로젝트이므로 어느것을 사용해도 상관 없음


<< 참고 >>

- https://jiurinie.tistory.com/123

- https://jiurinie.tistory.com/122

- https://taisou.tistory.com/776

728x90
LIST

깃허브에 레파지토리를 만들었다는 전제하에 시작함

 

깃허브의 레파지토리와 이클립스 또는 sts와 연동을 할 때는 먼저 [ Git Repository ] 뷰를 추가해야함

( 이클립스 또는 sts 를 이제부터 이클립스라고 통칭하겠음 )

 

<< [ Git Repository ] 뷰 추가하는 방법 >>

[ Window ] -> [ Show View ] -> [ Other ]

 

[ git 으로 검색 ] -> [ Git Repositories 클릭 ] -> [ Open 클릭 ]

 

 

이제 [ Git Repositories ] 뷰에서 깃허브 레파지토리와 이클립스를 연동하자

이클립스 하단에 있는 [ Git Repositories ] 뷰 내에서 빈 영역을 우클릭 -> [ Clone a Git Repository... ] 클릭

[ Clone a Git Repository... ] 는 깃허브 레파지토리를 내 컴퓨터에 다운 받는 기능임

 

다운 받을 깃허브 레파지토리 정보들을 입력하자

1. Location

 -> URI : 내 컴퓨터에 다운 받을 깃허브 레파지토리의 주소

 -> Host : URI 를 입력하면 자동으로 입력됨

 -> Repository path : URI 를 입력하면 자동으로 입력됨

 

2. Connection : 레파지토리를 다운 받기 위한 세부 설정 / 그대로 둬도됨

 

3. Authentication : 레파지토리를 다운 받기 위한 깃허브 계정 정보

 -> User : 깃허브에 접속할 때 입력하는 아이디 또는 닉네임

 -> Password : 깃허브에서 로그인 후 생성한 Personal Access Token ( PAT )

 

1, 3 을 입력 후 [ Next ] 클릭

 

 

내려 받을 브랜치들 확인 후 [ Next ]

 

 

다운 받은 깃허브 레파지토리를 내 컴퓨터의 어디에 둘건지 설정하는 부분 

 

1. 내 컴퓨터에 둘 경로

 -> Directory : 깃허브 레파지토리를 다운 받아 내 컴퓨터의 이 경로에 두겠다

 

내 컴퓨터의 어디에 둘 지 지정 후 [ Finish ]

 

다시 아이디, PAT 를 입력하는 부분이 나옴

아이디, PAT 를 저장해두지 않으면 매우 귀찮으므로 이번에 입력해 두고 [ Store in Secure Store ] 체크 한 후 [ Log in ] 클릭

 

그러면 비밀번호 힌트 설정할래? 창이 나오는데 PAT 이므로 힌트를 지정해도 알 수 없으니 [ No ] 를 누르자

 

 

여기까지 연동 끝~!

연동이 제대로 됐다면 아래와 같이 [ Git Repositories ] 에 연동된 레파지토리가 보일 것


이렇게 연동은 했는데 완전히 끝난건 아님

깃허브에서 다운 받은 레파지토리(프로젝트)를 이클립스로 불러오기 까지 해야 완전히 끝~!

 

프로젝트를 이클립스로 불러오는 방법을 알아보자

 

상단에 [ File ] -> [ Import ]

 

[ General ] -> [ Projects from Folder or Archive ] 클릭 -> [ Next ] 클릭

 

 

[ Directory... ] 을 클릭해 앞서 깃허브 레파지토리를 다운 받아 저장했던 위치로 찾아간 후 [ 폴더 선택 ] 하면 됨

( 깃허브 레파지토리를 다운 받아 저장했던 위치 를 모르겠다면 밑 이미지를 먼저 보자 )

 

혹시 [ 깃허브 레파지토리를 다운 받아 저장했던 위치 ] 를 모르겠다면 [ Git Repositories ] 뷰에 다운 받은 레파지토리 이름 옆을 보면 어디에 저장했는지 나와있음

 

이제 [ Project Explorer ] 뷰를 보면 이클립스와 깃허브 레파지토리 연동이 된 걸 볼 수 있음

여기까지 완전히 끝~!

728x90
LIST

내 컴퓨터에서 가상 호스트의 서버로 접근하려니 안됨

 

그래서 척척박사 chatGPT에게 물어보니 다음과 같은 대답이 돌아왔음

와우... 대답을 한참 후에 할 줄 알았으나 즉답... 그리고 답의 정확도도 매우 정확함

 

chatGPT의 말대로 가상 호스트의 네트워크 설정을 보니 NAT 로 되어있음

네트워크 설정을 다음과 같이 바꿔야함

 

728x90
LIST