일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- custom annotation
- @Header
- 운영체제
- ReflectUtils
- 롬복주의점
- hiberbate
- task_struct
- OS
- 도커
- SystemCall
- 쓰레드 라이브러리
- none이미지
- strict stubbing
- java.util.function
- FunctionalInterface
- Thread Multiplexing
- spring-data-jpa
- django-crontab
- 함수형 인터페이스
- Spring
- 프로세스
- 문자열 불변성
- AOP
- 문자열 리터럴
- Process
- Thread Library
- sql-mappler
- python-socketio
- rainbow table
- functional interface
- Today
- Total
JH's Develog
[Spring] 롬복의 단점 (주의할 점) 본문
롬복은 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의 무분별한 사용은 권장되지 않는 것 입니다.
'Spring' 카테고리의 다른 글
[Spring Data JPA] Querydsl 세팅하기 (Springboot+mysql) (0) | 2022.01.30 |
---|---|
[Spring Data JPA] MyBatis vs Hibernate vs Spring Data JPA (0) | 2022.01.23 |
[SpringBoot] application.properties에 환경변수 설정하기 (@ConfigurationProperties) (0) | 2022.01.10 |
[SpringBoot] @Component vs @Bean vs @Configuration (0) | 2022.01.10 |
[SpringCore] Validation (유효성 검증) (0) | 2021.12.27 |