lombok.config #2 @Data 사용하지 않기

아이스__아메리·2022년 9월 26일
0

lombok.config

목록 보기
1/2

@Data는 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor을 한번에 사용하는 강력한 어노테이션

강력한 어노테이션인 만큼 그에 따른 부작용도 많다.

  • 무분별한 Setter 남용
    @Data를 사용하면 자동으로 Setter를 지원하게 한다.
    Setter는 그 의도가 분명하지 않고 객체를 언제든지 변경할 수 있는 상태가 되어서 객체의 안전성이 보장받기 힘들다.
    즉 email의 변경 포인트를 제공하지 않음으로써 email 변경 기능이 없다는 것을 표현한다.

  • ToString으로 인한 양방향 연관관계시 순환 참조 문제
    아래 코드 코드처럼 Member 객체와 Coupon 객체가 양방향 영관관계일 경우 ToString을 호출하면 무한 순환 참조가 발생합니다. JPA를 사용하다 보면 객체를 Json으로 직렬화 하는 가정에서 발생하는 문제와 동일한 이유다. 이 처럼 무분별하게 @Data를 사용하게 되면 이러한 문제를 만나기 쉽다

@ToString(exclude = "coupons")
public class Member {...}

해당 어노테이션을 이용해서 ToString 항목에서 제외

정말 깊게 생각한다면 @Getter도 바람직하지는 않다고 생각한다. 모든 멤버필드에 대해서 Getter를 제공해주는 것은 캡슐화에 좋은 영향을 준다고 생각하지 않는다. 무분별하게 Getter를 제공해주면 객체를 사용하는 곳에서 get 메서드를 이용해서 로직들을 구현하는 경우가 있는데 사실 이러한 기능들은 해당 객체가 캡슐화해서 제공해주는 것이 바람직하다.

하지만 이렇게까지 설계하는 것은 현실적으로 어렵다고 생각합니다. 그래서 @Getter는 사용하되 최대한 객체가 캡슐화하여 해당 객체가 그 기능을 제공해주는 것이 바람직하다.

@RequiredArgsConstructor 이용한 의존성 주입

RequiredArgsConstructor 사용함에 있어서 반드시 알아야 할 개념

final키워드를 사용한 인스턴스들만 Bean 객체로 등록을 한다는 것

final 키워드를 사용하지 않고 사용하면 NullPointerException 이 발생

@RequiredArgsConstructor를 사용하는 이유

의존성 주입에는 크게 3가지 방법이 존재하는데
1) 필드 주입
2) setter 주입
3) 생성자 주입

이 중 스프링에서 공식적으로 추천하는 방법은 생성자 주입이다.

그 이유는 바로 한번 의존성을 주입받은 객체는 프로그램이 끝날때 까지 변하지 않는 특징을 가지므로 불변성을 표시해주는 것이 좋기 때문이다.
*불변성

그래서 의존성을 주입할 객체는 final 키워드를 사용하는 것 + @Autowired 어노테이션을 생략할 수 있다.

스프링 빈들의 관계 구성
어플리케이션이 실행하면 스프링 컨테이너는 1->2->3순으로 객체를 생성하게 되는데 의존하는 순서는 1->2->3일 경우 순환 종속성 또는 순환 참조 문제가 발생한다.(이 경우 Spring은 컨텍스트를로드하는 동안 BeanCurrentlyInCreationException을 발생시킨다.) 그래서 필요할때 생성자가 생성이 되어 오류를 피할 수 있다.

@Service
@RequiredArgsConstructor
class Test{
    private final MemberRepository memberRepository;
}

생성자가 단 한개만 선언이 되어있으면 @Autowired 어노테이션을 생략할 수 있다

@RequiredArgsConstructor 어노테이션은 필드주입생성자를 대처해주고 현재 생성자가 하나밖에 없는 상태이니 @Autowired 어노테이션을 생략해도 알아서 의존성이 주입되기 때문

lombok.config 설정

lombok.Setter.flagUsage = error
lombok.AllArgsConstructor.flagUsage = error
lombok.data.flagUsage= error
lombok.addLombokGeneratedAnnotation = true
lombok.anyconstructor.addconstructorproperties=true

lombok.config 설정 파일을 통해서 lombok 어노테이션을 제한하여
위험 부담이 잇는 어노테이션들을 해당 설정에서 제한 할 수 .

* 각자 환경과 상황에 알맞게 Lombok을 사용하는 것이 바람직하다.

profile
츠케멘 좋아

0개의 댓글