lombok 실습 이후 결과물 파일 확인하기

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의 애노테이션 프로세서를 통해서 컴파일 시 코드를 추가로 만들어내는 기능을 사용한다는 뜻입니다.

 

AST 는 프로그램 코드(소스)의 구조를 표현하는 프로퍼티이며, 컴파일러의 구문 분석 결과물이라고 할 수 있습니다.

컴파일후 결과

.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)

 

해피쿠 블로그 - [Java] Lombok은 어떻게 동작할까? - AST, 애노테이션 프로세서(1)

누구나 손쉽게 운영하는 블로그!

www.happykoo.net

lombok 의 setter/getter 메소드 생성 시점 문의 - 인프런 | 질문 & 답변 (inflearn.com)

 

lombok 의 setter/getter 메소드 생성 시점 문의 - 인프런 | 질문 & 답변

lombok의 @Getter/@Setter 메소드의 실제 코드 (setXXX, getXXX) 는  Complile 시점에 자동으로 generated 된다. (out 폴더의 class 파일에서 확인가능) 하지만 IntelliJ에서 setXXX 와 getXXX 를 컴...

www.inflearn.com