본문 바로가기
프로젝트/리팩토링

객체를 망치지 않는, Lombok의 사용

by 임지혁코딩 2024. 1. 16.

 

여태까지는 모든 공부 과정에서 Lombok을 사용해왔다. 

이러한 Lombok은 생성자의 형성 등 간단하고 명료하게 객체의 생성을 지원한다.

허나 Lombok의 오사용은, 객체를 망가뜨릴수 있다. 

 

1. @DATA를 지양해야 할 수 있다. 

 

ID,EMAIL,NAME이 있는 TABLE이 있다고 생각해보자 .

무분별하게 모든 FIELD에 대해 생성자를 형성했다고도 가정해보자 .

 

그렇다면 , 생성자로 들어올 수 있는 EMAIL은 EMAIL의 변경이 가능함을 의미하는 것이 아닌가?

혹은, EMAIL과 NAME이 동시에 바뀌어야 한다면 (즉, 데이터의 쌍이 있다면)

SETTER가 이러한 쌍의 변경이 아닌 한 데이터만의 변환을 유발할 수도 있다.

 

  @EQUALSANDHASHCODE는 두 객체의 값과 동일성을 비교해준다. 

@DATA는 이를 자동으로 생성하기 때문에, 동작 속도를 감소시킬 수 있다. 

 

- LOMBOK의 세팅을 lombok.setter(원하는 것).flagusage = error 등등  사용하지 못하게 할 수도 있다. 

 

이러한 객체가 있다고 생각해보자. 

 

email과 name이 필수값인데, 이가 null로 들어갈 수도 있다 . 

+ id를 내가 삽입할 수도 있다. (createdate도,updateat도)

그 이유는,builder는 원하는 형태의 객체를 생성하는 어노테이션이기 때문이다 ( 큰 단위의 )

 

좀 더 현명한 방식이다. 이제는 test가 좀더 용이하다. (id나 , date time등이 들어오면 오류가 발생)

 

builder를 사용하려면, 생성자에 다는 것이 현명하고 관리에 용이하다! 

 

2. Team에서 일할때, lombok의 사용 제약을 두는 법 . 

lombok.config 생성. 

그 이후 lombok.setter.flagUsage=ERROR(WARNING)등등. 

 

3. 도메인 자체를 명료하게 설계하라

 

이후 테스트를 진행

 

 

이는 잘 통과하나, 만약에 빈 값이 들어옴을 test하려면 어떨까?

문제는, 이러한 것도 통과된다는 것이다. 

이는 단순하게 nullable=false가 성립하나 보는 validation이라고 볼 수도, 객체 설계의 잘못이라고 할 수도 있다. 

ㅇ물론. 다른 곳에서 이를 처리해줄 수도 있지만, 그렇다면 이객체를 확인하기는 좀 더 복잡하고 난해해진다.

 

 

builder에 해당 line 추가. hastext는 주어진 매개변수를 확인하고 그가 null이라면 ILLEGALEXCEPTION을 던져준다.

 

이와 같은 방식으로, null이 왔을때 IllegalStateException이 발생하는지를 TEST로써 확인할 수 있다.

* 도메인 테스트 . 도메인의 역할을 다하게 하기 위해 exception을 발생시키게 유도했기 때문이다. 

 

4. 어느 level에서 valid가 들어가는지를 확인하라 

 nulable = false로 되어있지만, 이는 런타임 과정에서 null이 불가능함을 의미하는 것이 아니라 db에 삽입 과정에서 null 이 check된다. 그러므로 test에 null을 넣으면 이는 pass,db삽입 과정에선 PersistenceException가 발생한다.

 

5. 조금 더 복잡하게, 환불 객체를 생성해 보자 . 

 

 

주문 table과는 1대1 관게를 지닌다. 

카드 결제시 결제 카드 정보를 받고 싶다. 

환불계좌는 무통장 or 카드 결제 로 진행할 수 있다. 

 

null을 적극적으로 사용한 방법 -> creditcard,accont 중 1개를 받아서 객체를 생성할 수 있게 설계하였다.

 

builder에 이름을 생성하므로써, 후에 test에서

Refund.ByAccountBuilder 혹은 Refund.ByCredit~~ 과 같이 경우에 따라 다르게 생성할 수 있게끔 하였다. 

 

++ 

spring에서는 refund안에 order가 있는 형태로, mysql에서는 order_id를 refun의 fk로 가지는 형태로 생성되나?
 

'프로젝트 > 리팩토링' 카테고리의 다른 글

객체 구조를 어떻게 설정할까?  (0) 2024.01.20
ERROR /예외 처리  (1) 2024.01.20
Exception의 종류들  (0) 2024.01.16
오류보단, 예외로 처리하자  (0) 2024.01.16
패키지 구조  (0) 2024.01.16