Lombok이란?
Lombok은 어노테이션 기반으로 코드를 자동완성 해주는 라이브러리이다.
예를 들어 다음과 같이 건물에 대한 클래스가 있다고 생각해보자.
public class Building {
private String buildingName ;
private String buildingAddress ;
private String telephone ;
private double latitude ;
private double longitude ;
public String getBuildingName () {
return buildingName ;
}
public void setBuildingName ( String buildingName ) {
this . buildingName = buildingName ;
}
public String getBuildingAddress () {
return buildingAddress ;
}
public void setBuildingAddress ( String buildingAddress ) {
this . buildingAddress = buildingAddress
}
public String getTelephone () {
return telephone ;
}
public void setTelephone ( String telephone ) {
this . telephone = telephone ;
}
public double getLatitude () {
return latitude ;
}
public void setLatitude ( double latitude ) {
this . latitude = latitude ;
}
public double getLatitude () {
return latitude ;
}
public void setLongitude ( double longitude ) {
this . longitude = longitude ;
}
}
위와 같이 getter와 setter 함수만 작성해도 매우 긴 코드가 되고, 추가로 생성자나, toString 함수도 override할 경우 1개의 클래스가 상당히 길어져 가독성이 떨어지는 등의 단점이 생긴다. 만약 위와 같은 코드에 Lombok을 적용하면 아래와 같이 줄일 수 있다.
@Getter
@Setter
public class Building {
private String buildingName ;
private String buildingAddress ;
private String telephone ;
private double latitude ;
private double longitude ;
}
위 예시는 모든 변수들에 대해 Getter와 Setter를 적용시킨 예시이다. 훨씬 간결한 코드가 가능해진다.
Lombok의 여러가지 기능
@Getter / @Setter
Lombok에서 가장 자주 활용되는 어노테이션으로써 클래스 이름 위에 적용시키면 모든 변수들에 적용이 되고, 변수 이름 위에 적용시키면 해당 변수들만 적용할 수 있다.
@Getter
public class Building {
@Setter
private String buildingName ;
private String buildingAddress ;
private String telephone ;
private double latitude ;
private double longitude ;
}
이와 같은 경우, Getter는 모든 변수에 대해 사용가능하지만, Setter는 buildingName에 대해서만 가능해진다.
@AllArgsConstructor
@AllArgsConstructor는 모든 변수를 사용하는 생성자를 자동완성 시켜준다.
@Getter
@AllArgsConstructor
public class Building {
private String buildingName ;
private String buildingAddress ;
private String telephone ;
private double latitude ;
private double longitude ;
/* @AllArgsConstructor는 아래의 생성자를 자동 생성해준다.
public Building(String buildingName, String, buildingAddress, String telephone, double latitude, double longitude) {
this.buildingName = buildingName;
this.buildingAddress = buildingAddress;
this.telephone = telephone;
this.latitude = latitude;
this.longitude = longitude;
}
*/
}
@NoArgsConstructor
@NoArgsConstructor는 어떠한 변수도 인자로 갖지 않는 생성자를 자동완성 시켜준다.
@Getter
@NoArgsConstructor
public class Building {
private String buildingName ;
private String buildingAddress ;
private String telephone ;
private double latitude ;
private double longitude ;
/* @NoArgsConstructor는 아래의 생성자를 자동 생성해준다.
public Building() {}
*/
}
@RequiredArgsConstructor
@RequiredArgsConstructor는 특정 변수만을 활용하는 생성자를 자동완성 시켜준다.
생성자의 인자로 추가할 변수에 @NonNull 어노테이션을 추가해주거나, 해당 변수를 final로 선언하면 된다.
@Getter
@RequiredArgsConstructor
public class Building {
@NonNull
private String buildingName ;
private final String buildingAddress ;
private String telephone ;
private double latitude ;
private double longitude ;
/* @RequiredArgsConstructor는 아래의 생성자를 자동 생성해준다.
public Building(String buildingName, String buildingAddress) {
this.buildingName = buildingName;
this.buildingAddress = buildingAddress;
}
*/
}
@EqualsAndHashCode
@EqualsAndHashCode는 클래스에 대한 equals 함수와 hashCode 함수를 자동으로 생성해준다. 만약 서로 다른 두 객체에서 특정 변수의 이름이 똑같은 경우 같은 객체로 판단을 하고 싶다면 아래와 같이 할 수 있다.
@RequiredArgsConstructor
@EqualsAndHashCode ( of = { "buildingName" , "buildingAddress" })
public class Building {
@NonNull
private String buildingName ;
@NonNull
private String buildingAddress ;
private String telephone ;
private double latitude ;
private double longitude ;
/* @NoArgsConstructor는 아래의 생성자를 자동 생성해준다.
public Building() {}
*/
}
따라서 한 객체의 buildingName과 buildingAddress가 다른 객체의 것과 똑같다면, 같은 객체로 인식하도록 해주는 것이다.
실제로, 다음과 같이 시험해볼 수 있다.
@RestController
@RequestMapping ( value = "/building" )
@Log4j2
public class BulidingController {
@GetMapping ( value = "/test" )
private ResponseEntity test () {
Building b1 = new Building ( "빌딩 이름" , "주소1" );
Building b2 = new Building ( "빌딩 이름" , "주소1" );
Building b3 = new Building ( "빌딩 이름" , "주소2" );
log . debug ( b1 . equals ( b2 )); // true
log . debug ( b1 . equals ( b3 )); // false
return ResponseEntity . ok (). build ();
}
}
@ToString
@ToString은 클래스의 변수들을 기반으로 ToString 메소드를 자동으로 완성시켜 준다. 출력을 원하지 않는 변수에 @ToString.Exclude 어노테이션을 붙여주면 제외시킬 수 있다.
@ToString
@AllArgsConstructor
public class Building {
@ToString . Exclude
private String buildingName ;
private String buildingAddress ;
private String telephone ;
private double latitude ;
private double longitude ;
}
위 클래스에 대한 객체를 만들어서 출력해보면,
Building ( buildingAddress = 랜덤주소 , telephone = 010000 , latitude = 32.2342 , longitude = 235.2342 )
이렇게 결과가 출력된다.
@Data
@Data를 활용하면 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 자동완성 시켜준다.
@Builder
@Builder를 사용하면 해당 클래스의 객체의 생성에 Builder패턴을 적용시켜준다. 모든 변수들에 대해 build를 하려면 클래스 위에 @Builder를 붙이면 되고, 특정 변수만을 build하고 싶다면 생성자를 작성하고 그 위에 @Builder를 써주면 된다.
@Getter
@NoArgsConstructor
public class Building {
private String buildingName ;
private String buildingAddress ;
private String telephone ;
private double latitude ;
private double longitude ;
@Builder
public Building ( String buildingName , String buildingAddress ) {
this . buildingName = buildingName ;
this . buildingAddress = buildingAddress ;
}
}
이 Builder를 아래와 같이 활용할 수 있다.
@RestController
@RequestMapping ( value = "/store" )
@Log4j2
public class BuildingController {
@GetMapping ( value = "/init" )
private ResponseEntity init () {
Building building = Building . builder ()
. buildingName ( "건물이름" )
. buildingAddress ( "건물주소" )
. build ();
return ResponseEntity . ok ( building );
}
}
출처: https://mangkyu.tistory.com/78
Leave a comment