문제 : Action 테이블을 불러올 때 다른 참조 테이블(client, service 등)을 불러오면 안된다. - ManyToOne 에서 어떤 옵션을 줘야 할까
optional
true
참조 값이 null 이 될 수 있다. → 외부 조인 - null 의 가능성이 있으므로 연결되지 않은 값까지 모두 조인한다.
false
참조 값이 null 이 될 수 없다. → 내부 조인 - null 이 될 수 없으므로 연결된 값들만 가져온다 (성능 최적화)

Lazy Loading optional 을 치니 OneToOne 에 대한 글만 한없이 나왔다. (ManyToOne은?!)
OneToOne 에서 Lazy 로딩은 잘 작동하지 않는다고 한다!
null 이 될 수 있는 OneToOne 의 경우, Lazy 로딩을 위해 프록시로 감싸야 하는데, null 은 프록시로 감쌀 수 없다. → 따라서 null 여부를 확인하기 위해 즉시 쿼리로 확인을 해야 함

이 경우 optional = false (Null 불가) 를 주면, CART 는 유저가 항상 존재함이 보장되기 때문에 지연 로딩이 가능하다.

OneToOne 의 경우를 볼 때, optional = true 이면 주인인 객체를 알기 위해 즉시 로딩이 수행되는 듯 했다.
ManyToOne 의 경우도 주인인 One(client, service, actionGroup) 을 알 수 없기에 즉시 로딩이 수행되지 않을까??
?? 연관관계의 주인은 외래키를 갖고 있는 action 이었다?
ManyToOne 에서 주인은 항상 Many 쪽이다. 따라서 One 이 null 이든 말든 지연로딩이 가능하다. (본인 테이블에서 알 수 있음)
→ ManyToOne 의 optional 값은 Many 측을 조회할 땐 아무 상관이 없음
OneToMany 에서 조회를 한다면?
find client , client.actions 를 해보면 optional 에 상관없이 지연 로딩을 한다. (테스트해봄!)
why?
OneToOne 에서 optional = true 일 때 지연 로딩이 안된 건 null 을 프록시로 감싸지 못해서다. OneToMany 에서 Many 는 List 이므로 프록시로 감쌀 수 있다!
optional 은 EAGER 에서 중요하게 작동하고, LAZY 인 경우엔 OneToOne 일 때만 크리티컬하다.
EAGER 에선 아래처럼 optional 에 따라 조인 여부가 다른데, LAZY 는 조인을 안하니 상관 없을 듯 하다.