실무 프로젝트로 배우는 Kotlin & Spring/JAVA 프로젝트에 코틀린 도입하기

코틀린과 롬복

webmaster 2022. 11. 5. 00:35
728x90

Lombok을 사용한 JAVA 코드

@EqualsAndHashCode
@ToString
public class Hero {
  @Getter
  @Setter
  private String name;

  @Getter
  @Setter
  private int age;


  private String address;

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public static void main(String[] args) {
    /*
    Hero hero = new Hero();
    hero.setName("아이언맨");
    hero.setAge(53);
    hero.setAddress("스타크타워");
     */
  }
}

Kotlin 코드에서 사용

fun main() {
  	//롬복이 만들어준 getter/setter가 동작이 안된다.
    //코틀린 컴파일러가 컴파일이후 어노테이션 프로세싱이 동작하기 떄문에 사용시 오류가 발생하는 것이다.
    val hero = Hero()
    hero.name = "아이언맨"
    println(hero.name)
}

컴파일 과정

  • JAVA에서는 Lombok을 사용하면 쉽게 getter/setter, toString, equals, hashCode 함수를 만들 수 있다
  • Lombok을 통해서 작성한 JAVA코드를 코틀린에서 사용할 때, 오류가 발생한다.
    • 직접 작성한 getter/setter는 사용이 가능하다.
    • 코틀린이 컴파일이 된 이후 애노테이션 프로세싱(컴파일 타임에 애노테이션을 읽어서 동적 코드 생성, 변경)이 동작하기 때문에 기본적으로 Lombok을 사용할 수 없다
    • 최근에는 롬복 플러그인을 사용해 이 문제를 해결할 수 있다.

이슈 해결 방법

1. IDE의 자동 생성 방법 이용

public class Hero {
  
  private String name;

  private int age;

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    Hero hero = (Hero) o;
    return age == hero.age && Objects.equals(name, hero.name) && Objects.equals(
        address, hero.address);
  }

  @Override
  public int hashCode() {
    return Objects.hash(name, age, address);
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  private String address;

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public static void main(String[] args) {
    /*
    Hero hero = new Hero();
    hero.setName("아이언맨");
    hero.setAge(53);
    hero.setAddress("스타크타워");
     */
  }
}
  • Lombok을 제거하고 IDE생성 기능을 이용한다.

2. 코틀린의 data 클래스로 마이그레이션

data class HeroKt(
    val name: String,
    val age: Int,
    val address: String
) {

}
  • Lombok이 적용된 클래스는 대부분 data 관련 클래스이다.
  • 코틀린의 data class를 적용하면, toString, equals, hashCode 와 같이 기본적인 기능을 제공한다.
728x90