JH's Develog

[Spring] 롬복의 단점 (주의할 점) 본문

Spring

[Spring] 롬복의 단점 (주의할 점)

jhkimmm 2022. 1. 13. 10:04

롬복은 getter&setter, toString등의 bolierplate 코드들을 어노테이션 하나로 줄여주어 생산성을 향상 시켜주는 자바 진영의 대표적인 라이브러리 입니다. 그러나 롬복은 편한만큼 조심해야할 부분이 많은데요 그 부분에 대해서 알아보겠습니다.

프로그래머의 의도를 피하는 동작(1)

Item 클래스를 예시로 들어보겠습니다.

사용자가 Item의 필드에 final을 붙일 때 name이라는 필드는 한번 초기화 된 후 변하지 않기 때문에 null값으로 초기화 되기는 기대하지 않을 것 입니다. 그러나 @Builder에 의해 적용된 빌더 패턴으로 인해 name은 의도하지 않은 null 값으로 초기화 될 수 있습니다.

물론 프로그래머의 실수인지 아닌지 논쟁의 여지가 있는 부분이지만 롬복을 사용할 때 주의해야할 점 입니다.

프로그래머의 의도를 피하는 동작(2)

name, age, salary 필드를 갖는 불변객체 Employee가 정의 되어 있다고 가정합니다. 그런데 프로젝트 도중에 정책이나 프로그래머의 취향에 의해 age와 salary 필드가 정의된 순서를 아래와 같이 바꾼다면

@Value 어노테이션에 의해서 자동 생성된 Static 생성자의 파라미터의 위치가 바뀌어 프로그래머의 의도에 맞지않는 값으로 초기화 될 것 이며, 이러한 오류는 정말 찾아내기 쉽지 않을 것 입니다.

toString() 순환참조 문제

위와 같은 Employee 클래스와 Company 클래스가 있다고 가정하겠습니다. (@Data 에는 @ToString이 포함되어 있어서 @ToString까지 붙여줄 필요가 없지만 한눈에 알아보기 위해 두 가지 모두 붙여주었습니다.)

표준 출력을 테스트 해보면 Company와 Employee는 서로를 필드 값으로 갖고 있기 때문에 ToString을 할 때 서로를 계속해서 호줄하는 순환참조 상태에 빠지게 되어 결국 StackOverFlow가 발생합니다.

물론 그냥@ToString 대신에@ToString(exclude="company")를 붙여주면 해당 필드를 문자열 출력에서 제외시켜 순환참조 문제는 발생하지 않으나, 해당 필드값 정보를 toString에서 확인할 수 없는 문제가 생깁니다.

이런 이유 때문에 명확한 의도없는 @Data나 @ToString의 무분별한 사용은 권장되지 않는 것 입니다. 

 
Comments