- 프로젝트 요구사항
- Kotlin + JPA 로 구성하는데 set을 쓰면 안되고, Entity객체의 기본값은 설정해야함
- (생성자에서 디폴트값을 부여하거나, empty() 함수를 통해 기본값을 설정해줘서 항상 초기화 후에 static 함수를 한번 더 호출해서 해시코드 값을 변하지 않도록 고정해주도록 함(불변성))
- 객체의 값을 변경할 때에는 set, change(set의 변형한 메소드형태로 만듦) 와 같은 기존에 내가 프로젝트에서 하던 방법을 사용하지 않고,
기존 객체의 변수값을 변경할 때에는 객체 자체를 복사해서 통째로 바꿔버리도록 해야한다. (Kotlin의 copy()와 같은 방식과 같음)
--> 이번에는 static으로 생성하여 해시코드를 고정하는 깊은복사 방법을 구현하진 않았고, 얕은복사 정도의(copy()할 때 참조형 변수가 들어있으면 실행되는 방식) copy를 직접 구현했다.
-> 깊은 복사를 이용하고 싶다면 companion Object 로 정적 팩토리 메서드도 이용해서 구현해야함.
---> kotlin action에서 private constructor 와 companion Object를 이용하라고 하는데, 나는 연관관계를 맺고있어서 Entity객체 프록시 객체를 생성해야하는데 생성자가 private 처리돼있어서 부생성자를 만들어야 한다는 문제가 인텔리제이에서 있었다. (이건 근데, no-arg 설정을 했기 때문에 이문제는 정답은 아닌 것 같긴함..;)
- 고려한 사항
- Entity에서 {} 안에서 변수에 선언했는데, ()생성자 안에 컬럼을 선언하도록 했음 (주생성자에서 변수를 선언하는 동시에 기본값을 설정하기 위해서)
-> 이때 문제점. {} 안에 변수를 선언 & 기본값을 설정하고, 생성자에서는 들어갈 변수들을 나열해줬는데(userId:String, type:String)
이 때 1개의 파라미터가 들어오지 않으면 생성되지 않는 문제가 발생했음.
-> 생성자 안에 변수를 디폴트값과 같이 설정해주니 파라미터에 변수를 넣지 않으면 알아서 생성자에 설정한 디폴트 값으로 객체를 생성하니 편함 -> 그대신, 이름을 확실히 명시 해줘야함.
(ex, Drug(userId = userId))- 후에 drug를 저장하고 drugDetail을 수정할 API가 필요하기 때문에 drugDetail을 MutableList로 설정하려 했으나, add나 remove와 같이 객체를 변하게 조작할 수 없어야 함!
List로 선언하고 객체 copy로 drugDetail & drug 자체를 통째로 바꾸는 방식으로 변경해야함.
-> set, change메서드를 이용하는건 객체를 바꿀 수 있는 여지를 주는 것이고, 이건 사이드 이펙트를 발생할 가능성이 크기때문에 최대한 객체를 불변하게 만들도록 하자~
위 사진처럼 구현하니까, service에서 코드 짤 때 문제가 생김.
나는 기존 kotlin의 copy처럼 동작하게 하고 싶었는데, 뭔가 다른가보다.
Entity에 구현한 copy를
?:
기본값을 설정해줬다면,