스프링-JPA 강의 2회차-ch 6,7

이진우·2023년 9월 26일
0

스프링 강의 요약

목록 보기
10/13

다중성

주의점

1)애매할때는 반대쪽으로 생각해 보자
2)@ManyToMany 쓰지 말자

다대일

다가 연관관계의 주인인 상황

1대다

일단 권장하지 않음
DB에는 무조건 다 쪽에 외래키가 있어서 Team,memmber 의 관계에서 member 값을 바꾸면 다른 테이블의 키를 업데이트 해야 함
team.getMembers.add(member)하면 업데이트 쿼리 하나 더 증가해서
1)성능 손해
2)운영 힘들어짐
3)엔티티가 관리하는 외래키가 다른 테이블에 있음
따라서 멤버입장(다 쪽)에서 팀(1쪽)으로 갈 일이 없어도 강제로 다대일 매핑 하는 것을 권장한다

1대1

  • 주테이블에 외래키가 있는 상황
  • 다대일처럼 외래키가 있는 곳이 연관관계의 주인이다
    양방향 관계일때 반대편은 mappedBy를 적용한다
  • 대상테이블에 외래키가 있는 상황
  • 단방향은 JPA가 지원을 안한다
    대상테이블에 외래키 양방향인 경우는 지원한다
  • 둘중에 무엇이 맞을까?
  • 테이블에 바뀔수도 있다. 예를 들면 하나의 회원이 여러 개의 locker를 가진다면 locker에 외래키를 넣는 것이 db관점에서 편리할 것이다
    그러나 개발자 입장에서는 MEMBER에 LOCKER 있는 것 유리(쿼리 한방으로 MEMBER 의 LOCKER 에 접근이 쉬워서 그렇다)

    다대다

    다대다는 편리해보이지만 실무에서 사용하면 안된다. 중간 테이블을 만들어도 단순히 연결만 하고 끝나는 것이 아니라 추가적인 데이터가 들어가야 할 필요가 있기 떄문이다

    실무 관점에서...

    모든 테이블에 PK를 의미 없는 값으로 해야 한다.즉 1대 다 , 다대 1의 중간테이블의 PK도 역시 의미없는 값으로 해야 한다. 유연성이 필요하기 때문이다
    모든 테이블에 generatedValue로 깔아라

    상속관계

    객체의 상속과 DB의 슈퍼타입,서브타입 관계를 매핑한다

      Movie movie=new Movie();
                movie.setDirector("aaa");
                movie.setActor("BBB");
                movie.setName("바람과 함께 사라지다");
                movie.setPrice(10000);
                em.persist(movie);
    
                em.flush();
                em.clear();
    
                Movie findMovie=em.find(Movie.class,movie.getId());
                System.out.println("findMovie="+ findMovie);
               tx.commit();

    전략 1)조인전략: Insert 쿼리가 2번 나간다. PK,FK로 조인전략->이걸 정석으로 생각한다.

    또한 em.find로 찾아올 때는

    join을 사용해서 가지고 온다.

    전략 2)단일 테이블 전략: 성능이 좋다. 칼럼을 다 떄려박는다


    위처럼 insert 쿼리가 Item 하나에만 나가고 ,
    em.find 할때는

    Dtype으로 찾기 때문에 DiscriminatorColumn을 쓰지 않고 싶어도 쓸수 밖에 없다.

    전략 3) 구현 클래스마다 테이블 전략: 쓰지말자. 부모 클래스를 em.find (em.find(Item.class,Item.getId()))로 찾을떄 다 뒤지기 때문에 비효율적이다
    <item으로 찾아올때 나오는 쿼리>

    select
            item0_.id as id1_2_0_,
            item0_.name as name2_2_0_,
            item0_.price as price3_2_0_,
            item0_.artist as artist1_0_0_,
            item0_.actor as actor1_7_0_,
            item0_.director as director2_7_0_,
            item0_.author as author1_1_0_,
            item0_.isbn as isbn2_1_0_,
            item0_.clazz_ as clazz_0_ 
        from
            ( select
                id,
                name,
                price,
                artist,
                null as actor,
                null as director,
                null as author,
                null as isbn,
                1 as clazz_ 
            from
                Album 
            union
            all select
                id,
                name,
                price,
                null as artist,
                actor,
                director,
                null as author,
                null as isbn,
                2 as clazz_ 
            from
                Movie 
            union
            all select
                id,
                name,
                price,
                null as artist,
                null as actor,
                null as director,
                author,
                isbn,
                3 as clazz_ 
            from
                Book 
        ) item0_ 
    where
        item0_.id=?

    @DiscriminatorColumn(name="DTYPE")으로 타입 구분 가능하다

    @MappedSuperclass

    공통 매핑 정보가 필요할 때 사용한다
    공통 속성을 적고 클래스 위에다 @MappedSuperClass 붙여준다. @Entity는 안붙여도 된다
    직접 생성하지 않으므로 추상 클래스를 사용한다
    @Entity 클래스는 엔티티나 @MappedSuperClass로 지정한 클래스만 상속 가능

    주의

    실전에서 상속관계가 더 복잡해 진다면, 억단위가 넘어가면 단순한 테이블이 좋다
    profile
    기록을 통해 실력을 쌓아가자

    0개의 댓글