⚡ 생각대로 살지 않으면 사는대로 생각한다.
⚡ 나는 어차피 잘 될 놈이다. 이미 잘 되고 있고, 계속해서 잘 되고 있다.
위 그림처럼 MEMBER 테이블에 LOCKER_ID(FK, UNI)
제약조건을 넣어도 되지만, 반대로 LOCKER 테이블에 MEMBER_ID(FK, UNI)
로 넣어도 된다.
Member(객체)를 연관관계의 주인
으로 하고싶은데, 외래 키
가 LOCKER(테이블)에 있다.
Member(객체)의 Locker(필드)로 LOCKER(테이블)의 MEMBER_ID(외래 키)를 관리할 수 있는가 생각해보면, 할 수 없다. 이는 아예 지원하지도 않고, 방법이 없다.
연관관계의 주인
으로 하려고 할 때, 대상 테이블인 LOCKER(테이블)에 외래 키
가 있다해도, 상관이 없다. 그냥 Locker(객체)의 Member(객체)를 연관관계의 주인
으로 하고, LOCKER(테이블)의 **MEMBER_ID(외래 키)와 매핑
해주면 된다.ALTER
를 써서 유니크 제약조건을 빼면 된다. 이 그림에선 보다 자연스러워진다.그런데 MEMBER에 외래 키가 있을 때, 하나의 회원이 여러 개의 LOCKER를 사용할 수 있게 될 때, 아래의 그림처럼 관계 설정이 되어있으면, LOCKER에 컬럼을 추가하고, 기능을 변경해야한다. 변경 포인트가 많다.
그런데 비즈니스가 바껴서 하나의 LOCKER를 여러 MEMBER가 사용할 수 있다면, 위에 그림이 더 적합하다.
장점
웬만한 비즈니스로직에서는 MEMBER를 조회해와야 한다.
만약에 SELECT
문으로 LOCKER가 있는지 없는지 DB 쿼리 한 번으로 LOCKER의 값이 있는지 없는지에 대한 판단을 아주 쉽게 할 수 있다.
실무에서 객체 매핑을 하려면 아래와 같은 그림이 좀 더 유리하다.
영한좌는 너무 먼일을 생각하지않고, 일대일 관계다!하면 이 그림을 선호한다고 한다.
지연 로딩으로 설정해도 항상 즉시 로딩됨
에 대한 부가설명
![]()
- 테이블과 객체가 이렇게 연관관계가 이 그림처럼 되어있다면, LOCKER에 값이 있는지 없는지, MEMBER 테이블만 조회를 해서 확인 할 수 있을까...?
어차피 LOCKER를 조회해서 MEMBER_ID가 있는지 없는지,WHERE
문에 조건을 넣어서 값이 있는지 없는지 확인을 해야한다.- 값이 있어야 Member에 프록시를 넣든 다른 것을 넣거나 혹은, 값이 없을 때 Null을 넣든가 하기 위해선 일단 값이 있는지 없는지를 확인해야하는데, 그 확인하는 과정에서 쿼리를 어차피 날리게 되어있다. 어차피 쿼리가 나가기 때문에, 굳이 프록시를 만들 필요가 없다.
그래서 지연로딩으로 값을 세팅한다 해도, 일대일 관계에서 대상테이블에 외래 키가 있으면 무조건 즉시 로딩을 하게 되어있다. 그래서 지연로딩으로 세팅하는 것이 의미가 없는 것이다.- 치명적인 단점이다.