객체를 망치지 않는, Lombok의 사용
여태까지는 모든 공부 과정에서 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~~ 과 같이 경우에 따라 다르게 생성할 수 있게끔 하였다.
++