2022. 12. 18. 15:03ㆍ카테고리 없음
[ Lombok 이란? ]
Lombok이란 어노테이션 기반으로 코드를 자동완성 해주는 라이브러리이다. Lombok을 이용하면 Getter, Setter, Equlas, ToString 등과 다양한 방면의 코드를 자동완성 시킬 수 있다.
package com.example.demo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@Builder//이름, 전화번호, 주소를 개별적으로 사용가능(필요한것만 가져와서 사용)
@AllArgsConstructor
@EqualsAndHashCode(of = {"name","contact"})//직접 비교 대상이 되는 필드 이름만 적기
public class User {
private String name;
private String contact;
private String address;
}
@Data 사용시
:@ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 자동완성 시켜준다. 실무에서는 너무 무겁고 객체의 안정성을 지키기 때문에 @Data의 활용을 지양한다.
@AllArgsConstructor
: 모든 변수를 사용하는 생성자를 자동완성 시켜주는 어노테이션이다.
@Builder
:어노테이션을 활용하면 해당 클래스의 객체의 생성에 Builder패턴을 적용시켜준다. 모든 변수들에 대해 build하기를 원한다면 클래스 위에 @Builder를 붙이면 되지만, 특정 변수만을 build하기 원한다면 생성자를 작성하고 그 위에 @Builder 어노테이션을 붙여주면 된다.
@EqualsAndHashCode
:어노테이션을 활용하면 클래스에 대한 equals 함수와 hashCode 함수를 자동으로 생성해준다. 만약 서로 다른 두 객체에서 특정 변수의 이름이 똑같은 경우 같은 객체로 판단을 하고 싶다면 아래와 같이 해줄 수 있다.
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
@Slf4j //로그
public class TestUser {
public static void main(String [] args) {
User user1 = new User("홍길동","010-1111-1111","서울시 강남구 대치1동");
User user2 = User.builder().name("홍길동").contact("010-1111-1111").build();
log.info("user1 =" + user1);
log.info("user2 =" + user2);
log.info("comparison=" + user1.equals(user2));
}
}
[ @Log 관련 어노테이션 ]
@Log4j2와 같은 어노테이션을 활용하면 해당 클래스의 로그 클래스를 자동 완성 시켜준다. @Log 관련 어노테이션을 활용한 예제는 아래와 같다.
14:43:31.611 [main] INFO com.example.demo.TestUser - user1 =User(name=홍길동, contact=010-1111-1111, address=서울시 강남구 대치1동)
14:43:31.619 [main] INFO com.example.demo.TestUser - user2 =User(name=홍길동, contact=010-1111-1111, address=null)
14:43:31.619 [main] INFO com.example.demo.TestUser - comparison=true
롬봇 어떻게 동작하는가?
Lombok은 소스코드를 컴파일 하는 과정에 개입해서 추가적인 코드를 만들어냅니다. 이것을 애노테이션 프로세싱이라고 하는데, 이러한 애노테이션 프로세싱은 자바 언어에 포함된 기능입니다.
lombok의 애노테이션 프로세서를 통해서 컴파일 시 코드를 추가로 만들어내는 기능을 사용한다는 뜻입니다.
컴파일후 결과
.class 파일 생성
디컴파일로 확인: getter,setter들이 구현 되어 있는 것을 볼수 있다.
http://www.javadecompilers.com/result 해당 사이트로 디컴파일
//
// Decompiled by Procyon v0.5.36
//
package com.example.demo;
public class User
{
private String name;
private String contact;
private String address;
public static User.UserBuilder builder() {
return new User.UserBuilder();
}
public String getName() {
return this.name;
}
public String getContact() {
return this.contact;
}
public String getAddress() {
return this.address;
}
public void setName(final String name) {
this.name = name;
}
public void setContact(final String contact) {
this.contact = contact;
}
public void setAddress(final String address) {
this.address = address;
}
@Override
public String toString() {
return "User(name=" + this.getName() + ", contact=" + this.getContact() + ", address=" + this.getAddress() + ")";
}
public User(final String name, final String contact, final String address) {
this.name = name;
this.contact = contact;
this.address = address;
}
@Override
public boolean equals(final Object o) {
if (o == this) {
return true;
}
if (!(o instanceof User)) {
return false;
}
final User other = (User)o;
if (!other.canEqual(this)) {
return false;
}
final Object this$name = this.getName();
final Object other$name = other.getName();
Label_0065: {
if (this$name == null) {
if (other$name == null) {
break Label_0065;
}
}
else if (this$name.equals(other$name)) {
break Label_0065;
}
return false;
}
final Object this$contact = this.getContact();
final Object other$contact = other.getContact();
if (this$contact == null) {
if (other$contact == null) {
return true;
}
}
else if (this$contact.equals(other$contact)) {
return true;
}
return false;
}
protected boolean canEqual(final Object other) {
return other instanceof User;
}
@Override
public int hashCode() {
final int PRIME = 59;
int result = 1;
final Object $name = this.getName();
result = result * 59 + (($name == null) ? 43 : $name.hashCode());
final Object $contact = this.getContact();
result = result * 59 + (($contact == null) ? 43 : $contact.hashCode());
return result;
}
}
참고:해피쿠 블로그 - [Java] Lombok은 어떻게 동작할까? - AST, 애노테이션 프로세서(1) (happykoo.net)
lombok 의 setter/getter 메소드 생성 시점 문의 - 인프런 | 질문 & 답변 (inflearn.com)