Spring Boot (14) 연관관계 매핑 실습 (2)

넙데데맨·2022년 8월 29일
0
post-custom-banner

일대일 양방향 매핑

Product 파일에도 똑같이 @OneToOne 어노테이션 설정

left outer join이 2번씩 실행되는 것을 볼 수 있다.
이런 실행은 비효율적인데 이를 해결하기 위해 주인 개념을 이용한다.
주인 개념을 설정할 시 양방향 관계지만 주인 역할 DB에만 외래키가 생기게 되며 JPA에서는 mappedBy 속성을 사용한다.
mapeedBy 속성을 사용하면 매핑된 해당 테이블의 관계 중 주인이 아니라고 선선언하며 이 때 값은 주인 엔티티에 연관관계 필드 이름을 써준다.

	@OneToOne(mappedBy = "product")
    @ToString.Exclude
    //양방향 설정 후 ToString 순환참조 방지
    private ProductDetail productDetail;

단방향 매핑 시 @OneToOne을 설정해서 외래키를 갖는 쪽이 주인
양방향 매핑 시 mappedBy 속성을 사용하지 않는 쪽(외래키 가짐)이 주인

다대일 단방향 매핑

Product.java

    @ManyToOne
    @JoinColumn(name="provider_id")
    @ToString.Exclude
    private Provider provider;

@ManyToOne 어노테이션을 이용해 매핑
외래키를 갖기 때문에 Product 클래스가 관계의 주인이다.
Test

    @Test
    void relationshipTest1(){
        Provider provider = new Provider();
        provider.setName("ㅇㅇ 물산");

        providerRepository.save(provider);

        Product product = new Product();
        product.setName("펜");
        product.setPrice(1000);
        product.setStock(100);
        product.setProvider(provider);

        productRepository.save(product);

        System.out.println(
                "product : " + productRepository.findById(1L)
                        .orElseThrow(RuntimeException::new));

        System.out.println(
                "provider : " + productRepository.findById(1L)
                        .orElseThrow(RuntimeException::new).getProvider()
        );

    }


product 저장 시 @JoinColumn으로 지정한provider_id 값을 삽입하는 것을 알 수 있다.
product가 주인인 단방향 관계이기 때문에
ProductRepository로도 Provider 객체를 조회할 수 있다.

다대일 양방향 매핑

단방향 매핑에선 상품 엔티티로 공급업체의 정보를 불러왔었다.
JPA에서의 양방향 매핑은 단방향 매핑을 양쪽으로 이어주는 것으로 표현한다.
Provider에서 @OneToMany를 사용해 필드를 생성한다.
Provider.java

    @OneToMany(mappedBy = "provider", fetch = FetchType.EAGER)
    @ToString.Exclude
    private List<Product> productList = new ArrayList<>();

relationshipTest2()

    @Test
    void relationshipTest2(){
        //객체 생성
        Provider provider = new Provider();
        provider.setName("ㅇㅇ 물산");

        providerRepository.save(provider);

        Product product1 = new Product();
        product1.setName("펜");
        product1.setPrice(1000);
        product1.setStock(100);
        product1.setProvider(provider);

        Product product2 = new Product();
        product2.setName("가방");
        product2.setPrice(2000);
        product2.setStock(200);
        product2.setProvider(provider);
        
        Product product3 = new Product();
        product3.setName("노트");
        product3.setPrice(3000);
        product3.setStock(1000);
        product3.setProvider(provider);

        productRepository.save(product1);
        productRepository.save(product2);
        productRepository.save(product3);

        List<Product> products = providerRepository.findById(provider.getId()).get().getProductList();

        for(Product product : products){
            System.out.println(product);
        }

    }
provider.getProductList().add(product1);

주인이 아닌 엔티티에서 연관관계를 설정할 시 해당 데이터는 데이터베이스에 반영되지 않는다.

profile
차근차근
post-custom-banner

0개의 댓글