-
Notifications
You must be signed in to change notification settings - Fork 181
Lombok 설명 및 활용
Lombok이란 어노테이션 기반으로 코드를 자동완성 해주는 라이브러리이다.
Lombok을 이용하면 Getter, Setter, Equlas, ToString 등과 다양한 방면의 코드를 자동완성 시킬 수 있다.
- 어노테이션 기반의 코드 자동 생성을 통한 생산성 향상
- 반복되는 코드 다이어트를 통한 가독성 및 유지보수성 향상
- Getter, Setter 외에 빌더 패턴이나 로그 생성 등 다양한 방면으로 활용 가능
Lombok에서 가장 자주 활용하는 어노테이션이다.
@Getter와 @Setter를 클래스 이름 위에 적용시키면 모든 변수들에 적용이 가능하고, 변수 이름 위에 적용시키면 해당 변수들만 적용 가능하다.
@Getter
public class SessionVO implements Serializable {
private static final long serialVersionUID = -2848741427493626376L;
/** 아이디 */
@Setter
private String sUserId;
/** 이름 */
private String sUserNm;
/** 이메일 */
private String sEmail;
/** 사용자구분 */
private String sUserSe;
/** 조직(부서)ID */
private String orgnztId;
/** 고유아이디 */
private String uniqId;
}
@AllArgsConstructor는 모든 변수를 사용하는 생성자를 자동완성 시켜주는 어노테이션이다.
@Getter
@AllArgsConstructor
public class SessionVO implements Serializable {
/** 아이디 */
private String sUserId;
/** 이름 */
private String sUserNm;
/* AllArgsConstructor를 통해 아래의 생성자를 자동 생성할 수 있다.
public SessionVO(String sUserId, String sUserNm) {
this.sUserId = sUserId;
this.sUserNm = sUserNm;
}
*/
}
@NoArgsConstructor는 어떠한 변수도 사용하지 않는 기본 생성자를 자동완성 시켜주는 어노테이션이다.
@Getter
@NoArgsConstructor
public class SessionVO implements Serializable {
/** 아이디 */
private String sUserId;
/** 이름 */
private String sUserNm;
/* AllArgsConstructor를 통해 아래의 생성자를 자동 생성할 수 있다.
public SessionVO() {
}
*/
}
@RequiredArgsConstructor는 특정 변수만을 활용하는 생성자를 자동완성 시켜주는 어노테이션이다.
생성자의 인자로 추가할 변수에 @NonNull 어노테이션을 붙여서 해당 변수를 생성자의 인자로 추가할 수 있다.
아니면 해당 변수를 final로 선언해도 의존성을 주입받을 수 있다.
@Getter
@RequiredArgsConstructor
public class SessionVO implements Serializable {
/** 아이디 */
@NonNull
private String sUserId;
/** 이름 */
private final String sUserNm;
/** 이메일 */
private String sEmail;
/** 사용자구분 */
private String sUserSe;
/** 조직(부서)ID */
private String orgnztId;
/** 고유아이디 */
private String uniqId;
/* RequiredArgsConstructor 통해 아래의 생성자를 자동 생성할 수 있다.
public SessionVO(String sUserId, String sUserNm) {
this.sUserId = sUserId;
this.sUserNm = sUserNm;
}
*/
}
@EqualsAndHashCode 어노테이션을 활용하면 클래스에 대한 equals 함수와 hashCode 함수를 자동으로 생성해준다.
만약 서로 다른 두 객체에서 특정 변수의 이름이 똑같은 경우 같은 객체로 판단을 하고 싶다면 아래와 같이 해줄 수 있다.
@RequiredArgsConstructor
@EqualsAndHashCode(of = {"companyName", "industryTypeCode"}, callSuper = false))
public class Store extends Common {
@NonNull
private String companyName; // 상호명
@NonNull
private String industryTypeCode; // 업종코드
private String businessCodeName; // 업태명
private String industryName; // 업종명(종목명)
private String telephone; // 전화번호
private String regionMoneyName; // 사용가능한 지역화폐 명
private boolean isBmoneyPossible; // 지류형 지역화폐 사용가능 여부
private boolean isCardPossible; // 카드형 지역화폐 사용가능 여부
private boolean isMobilePossible; // 모바일형 지역화폐 사용가능 여부
private String lotnoAddr; // 소재지 지번주소
private String roadAddr; // 소재지 도로명주소
private String zipCode; // 우편번호
private double longitude; // 경도
private double latitude; // 위도
private String sigunCode; // 시군 코드
private String sigunName; // 시군 이름
}
위의 Store에서는 @EqualsAndHashCode(of = {"companyName", "industryTypeCode"}) 로 설정하여
companyName과 industryTypeCode가 동일하다면 같은 객체로 인식하도록 해주고 있다.
또한 Common를 상속하고 있는데, 상위 클래스의 경우 적용시키지 않기 위해 callSuper=false로 해주었다.
@RestController
@RequestMapping(value = "/store")
@Log4j2
public class StoreController {
@GetMapping(value = "/test")
private ResponseEntity test(){
Store store1 = new Store("가게 이름", "업종코드1");
Store store2 = new Store("가게 이름", "업종코드1");
Store store3 = new Store("가게 이름", "업종코드2");
// "companyName과 industryTypeCode가 같기 때문에 true가 나옴
log.debug(store1.equals(store2));
// "companyName과 industryTypeCode가 다르기 때문에 false가 나옴
log.debug(store1.equals(store3));
return ResponseEntity.ok().build();
}
}
@ToString 어노테이션을 활용하면 클래스의 변수들을 기반으로 ToString 메소드를 자동으로 완성시켜 준다.
출력을 원하지 않는 변수에 @ToString.Exclude 어노테이션을 붙여주면 출력을 제외할 수 있다.
또한 상위 클래스에 대해도 toString을 적용시키고자 한다면 상위 클래스에 @ToString(callSuper = true) 를 적용시키면 된다.
@Data 어노테이션을 활용하면 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 자동완성 시켜준다.
실무에서는 너무 무겁고 객체의 안정성을 지키기 때문에 @Data의 활용을 지양한다.
@Builder 어노테이션을 활용하면 해당 클래스의 객체의 생성에 Builder패턴을 적용시켜준다.
모든 변수들에 대해 build하기를 원한다면 클래스 위에 @Builder를 붙이면 되지만,
특정 변수만을 build하기 원한다면 생성자를 작성하고 그 위에 @Builder 어노테이션을 붙여주면 된다.
@Getter
@NoArgsConstructor
public class Store extends Common {
private String companyName; // 상호명
private String industryTypeCode; // 업종코드
private String businessCodeName; // 업태명
private String industryName; // 업종명(종목명)
private String telephone; // 전화번호
private String regionMoneyName; // 사용가능한 지역화폐 명
private boolean isBmoneyPossible; // 지류형 지역화폐 사용가능 여부
private boolean isCardPossible; // 카드형 지역화폐 사용가능 여부
private boolean isMobilePossible; // 모바일형 지역화폐 사용가능 여부
private String lotnoAddr; // 소재지 지번주소
private String roadAddr; // 소재지 도로명주소
private String zipCode; // 우편번호
private double longitude; // 경도
private double latitude; // 위도
private String sigunCode; // 시군 코드
private String sigunName; // 시군 이름
@Builder
public Store(String companyName, String industryTypeCode){
this.companyName = companyName;
this.industryTypeCode = industryTypeCode;
}
}
위와 같이 작성한 부분을 실제 활용한다면 아래와 같이 사용할 수 있다.
@RestController
@RequestMapping(value = "/store")
@Log4j2
public class StoreController {
@GetMapping(value = "/init")
private ResponseEntity init(){
Store store = Store.builder()
.companyName("회사이름")
.industryTypeCode("업종코드")
.build();
return ResponseEntity.ok(store);
}
}
@Log4j2와 같은 어노테이션을 활용하면 해당 클래스의 로그 클래스를 자동 완성 시켜준다.