인생을 코딩하다.

[Effective Kotlin] kotlin에서 lombok이 필요할까? Data Class와 비교하여 고찰 본문

Kotlin

[Effective Kotlin] kotlin에서 lombok이 필요할까? Data Class와 비교하여 고찰

Hyung1 2021. 6. 9. 02:33
728x90
반응형

1. 롬복은 왜 써야할까요

  • 어노테이션 기반이기 때문에 코드 자동생성을 통한 생산성을 향상 시킬 수 있습니다.
  • 그에 따라 반복되는 코드르 줄여 가독성 및 유지보수를 향상 시킬 수 있습니다.
  • 추가로 빌더 패턴이나 로그 생성 등 다양하게 활용할 수 있습니다.

하지만 롬복에는 주의사항도 있습니다.

  • @AllArgsConstructor,@RequiredArgsConstructor을 사용했을 떄, 필드 순서를 바꾸면 생성자의 순서도 바뀌는데, 기존 코드의 수정은 필요하지 않기 때문에, 개발자가 의도한 대로 동작하지 않아 버그가 생길 가능성이 큽니다.
  • @Setter의 사용은 객체를 언제든지 변경할 수 있는 상태가 되어서 객체의 안전성이 보장받기 힘듭니다.
  • @Data를 사용하면 모든 어노테이션을 한 번에 사용하기 떄문에 많은 부작용이 있습니다.
  • ToString으로 인한 양방향 연관관계시 순환 참조 문제가 발생할 수도 있습니다.

해결방안으로, 접근 권한을 protected하여 외부에서 생성을 차단하는 것, 빌더 패턴 고려 등이 있습니다.

2. 롬복은 어떤 원리로 동작하는걸까요?

  • 롬복 어노테이션이 붙은 자바 소스를 컴파일할 때 annotation processor로 등록된 lombok processor가 어노테이션을 확인하고 그에 맞는 코드를 자동으로 생성해서 바이트코드로 변환하여 원하는 부분을 주입해주는 방식으로 동작합니다.

3. 코틀린 프로젝트에서 롬복이 필요할까요?

  • 롬복에서 지원하는 @Data 어노테이션의 비슷한 기능을 코틀린의 data class가 지원합니다. getter, setter, toString, HashCode, equals를 Data Class로 생성할 수 있습니다.
  • 또 코틀린의 val, var, 주 생성자 등으로 @Getter, @Setter , @RequiredArgsConstructor, @Builder를 대체할 수 있습니다.
  • 추가로 Entity Class에서 @NoArgsConstructor(access = AccessLevel.PROTECTED)대신 org.jetbrains.kotlin.plugin.jpa" 플러그인을 적용하여 대체할 수 있습니다.
  • Data Class 사용시 정적 팩토리 메서드를 만들 필요도 없습니다. Data Class를 사용하면 생성자에 Static이 자동으로 붙고, EqualsAndHashCode를 자동으로 재정의 해주기 때문입니다. (이펙티브 자바 1장에서 자바의 문제점을 코틀린 Data Class를 이용해서 보완하고 있다고 생각이 들었습니다.)
728x90
반응형
Comments