private로 repository field injection 할 때,
private MemberRepository memberRepository;
이렇게 해주면, repository 객체 바꾸기 까다롭다.
1-1. 그래서 setter를 써서 바꿀수 있다.
그렇게 될 겨우, test코드 작성할 때, Mock객체 생성하기도 쉽다.
1-2. 그러나 이 경우에 문제가 있다.
이미, 애플리케이션이 실행단계에 돌입하면, repository setter injection를 쓸 필요가 별로 없음 (이미 service랑 repository랑 연결된 다음이기 때문에)
1-3. 그래서 요즘은 생성자 injection을 사용한다. 그리고 나서,
final을 붙여준다.
private final MemberRepository memberRepository;
1-4. 근데, 생성자 injection안하고, lombok에 있는 @AllArgsConstructor이나, @RequiredArgsConstructor을 넣어주면 된다.
@Transactional(readOnly=True)를 해주면, 안해주거나, readOnly를 뺐을 때보다 실행속도가 빠르다.
cascade해서 묶을때, 범위에 대해서 고민하게 되는데..
주인이 private owner 일때만 써야한다.
이게 무슨 말이냐면, 다른 데서 해당 domain을 참조해서 쓰지 않는 경우 해당 객체를 생성해서, life cycle을 같이 관리할 수 있다.
Order order = new Order();
order.setPrice(100);
과 같은 코드들은 막아야하는데, 이를 막기 위해선,기본생성자를 protected로 해주면된다.
하지만, 쉬운 방법은 @NoArgsConstructor(access=Protected)로 제한 해두면 된다~