본문 바로가기

issue & tip

Lombok 라이브러리

반응형

Lombok 라이브러리는 Java 코드를 컴파일할때 자동으로 추가 메서드를 만들어 컴파일해 주는 라이브러리라고 할 수 있다.


Lombok은 설정(표시) 어노테이션을 기준으로 '.class' 파일을 만들 때 getter/setter 등을 자동으로 추가하도록 만들 수 있기 때문에 개발자의 입장에서는 약간의 어노테이션을 추가하기만 하면 된다.


Getter/Setter 메서드를 생성하거 toString(), 생성자 함수를 생성하는 등의 일상화된 작업의 반복을 자동화함으로써 개발 시간을 단축할 수 있다.


Lombok의 어노테이션


 @NotNull

 Null값이 될수 없다는 것을 명시. NullPointerException에 대한 대비책 

 @Cleanup

 자동으로 close() 메서드를 호출하는 역할 

 @Getter/Setter

 코드가 컴파일될 때 속성들에 대해 Getter/Setter 메서드를 생성 

 @ToString

 @ToString(exclude={"변수"})

 toString() 메서드를 생성 

 원하지 않는 속성을 출력하지 않도록 제어

 @EqualsAndHashCode

 해당 객체의 equals()와 hashCode() 메서드를 생성 

 @NoArgsConstructor

 @RequiredArgsConstructor

 @AllArgsConstructor

 파라미터를 받지 않는 생성자를 만들어주거나(@NoArgsConstructor)

 지정된 속서들에 대해서만 생성자를 만들거나(@RequiredArgsConstructor)

 모든 속성에 대해서 생성자를 만들어낸다(@AllArgsConstructor)

 @Data

 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 포함 

 @Value

 불변(immutable) 클래스를 생성할 때 사용 

 @Log

 자동으로 생기는 log라는 변수를 이용해서 로그를 찍음 

 @Builder

 빌더 패턴을 사용할 수 있도록 코드를 생성

 new AA().setA().setB().setC()와 같이 체이닝을 할 수 있는 코드를 생성 

 @SneakyThrows

 예외발생시 Throwable 타입으로 반환 

 @Syncronized

 메서드에서 동기화를 설정 

 @Getter(lazy=true)

 동기화를 이용해서 최초 한번만 getter를 호출 


@Data 사용 주의


@Data는 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor의 묶음이다.

하나의 어노테이션만으로 개발에 관련된 대부분의 메서드가 자동으로 생성되기 때문에 편하지만, ORM에서 주의해야한다.


ORM은 객체와 객체가 관계를 가지는 조합의 형태로, 테이블 간의 연관관계를 표현한다.

단 이런 경우 부모의 객체와 자식의 객체의 toString()에서 문제가 생기게 된다.


public class Member {

private String id;

private String pw;


private Address addr;


@Override

public String toString() {

return "Member [id=" + id +", "pw=" + pw + ", addr=" + addr +"]";

}

}



public class Address{

private String zipcode;

private Member member;



@Override

public String toString() {

return "Address[zipcode=" + zipcode +", "member=" + member +"]";

}

}




상호호출의 문제

바깥쪽(Member)의 인스턴스의 toString()을 호출하면 안쪽(Address) 객체의 toString()을 호출하고, 다시 안쪽 객체는 바깥쪽의 toString()을 호출하는 무한 반복 호출이 진행되기 때문에 조금만 주의를 기울이지 않아도 무한 루프에 빠지면 StackOverflow를 볼수 있다.


@ToString은 include나 exclude 같은 속성을 이용해서 toString() 작성시에 포함하거나, 빼야하는 인스턴스 변수를 설정할 수 있지만 @Data는 설정이 불가능하다.


따라서 @Getter, @Setter 등을 이용하는 편이 코드를 작성할때 더 안전하다.

반응형

'issue & tip' 카테고리의 다른 글

백세코딩 #소프트웨어 개발 방법론과 DevOps  (0) 2018.04.16
백세코딩 #개발자(이력과 회사)  (0) 2018.04.15
백세코딩#개발자  (0) 2018.04.13
자바 원시타입  (0) 2018.03.09
자료구조 #리스트  (0) 2018.02.23