본문 바로가기

JPA

기본매핑 테스트

매핑 기본

package site.metacoding.white.util;

import org.junit.jupiter.api.Test;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
class Product {
    private Integer id;
    private String name;
    private Integer price;
    private Integer qty;
    private String mcp; // 제조사
}

@Getter
@Setter
class ProductDto {
    private String name;
    private Integer price;
    private Integer qty;
}

public class MapperTest {
    @Test
    public void 고급매핑하기() {

    }

    @Test
    public void 매핑하기1() {
        // 1. Product 객체 생성(디폴트)
        Product product = new Product();

        // 2. 값 넣기
        product.setId(1);
        product.setName("kaka");
        product.setPrice(1000);
        product.setMcp("samsung");
        product.setQty(100);

        // 3. ProductDto 객체생성(디폴트)
        ProductDto productDto = new ProductDto();

        // 4. Product -> ProductDto로 옮기기
        productDto.setName(product.getName());
        productDto.setPrice(product.getPrice());
        productDto.setQty(product.getQty());

        // 5. ProductDto -> product 변경
        Product product2 = new Product();
        product2.setPrice(productDto.getPrice());
        product2.setName(product.getName());
        product2.setQty(product.getQty());
    }
}

 

가독성을 위해서 리팩토링

 

먼저 이부분을 한번에 넣기 위해서 생성자@AllArgsConstructor 를 만든다.

 

@AllArgsConstructor 생성자 생성

 

생성자를 만들면 default생성자들은 오류가 발생할 것이다.

 

일단 오류해결겸 사용할지도 모를 디폴트생성자도 생성해준다.

 

스프링에서 데이터베이스에서 select한 것을 누가 product entity로 만들어주냐? - 스프링에서 자동으로 해준다

// 스프링에서 DB -> rs -> Entity(전략: 디폴트 생성자를 호출한 뒤 setter)

 

왼쪽 코드를 오른쪽 코드로 리팩토링 시켜준다.

 

 

@builder

DTO -> Entity 변경된 값을 Option화 시켜주기 위해서 사용되는 어노테이션이다.(필요한 값, 필요없는 값을 나눌 수 있다.)

 

 

 

 

 

builder를 사용하여 리팩토링

 

Product,ProductDto둘다 @AllArgsConstructor을 지우고 

직접 contructors를 걸고 @Builder를 걸어준다.

 

 

1.Product 객체 생성

 

2. ProductDto 객체생성

 

3. ProductDto -> Product 변경

 

여기까지 리팩토링한 전체코드

package site.metacoding.white.util;

import org.junit.jupiter.api.Test;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;


@Setter
@Getter
class Product {
    private Integer id;
    private String name;
    private Integer price;
    private Integer qty;
    private String mcp; // 제조사

    @Builder
    public Product(Integer id, String name, Integer price, Integer qty, String mcp) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.qty = qty;
        this.mcp = mcp;
    }

    
}


@Getter
@Setter
class ProductDto {
    private String name;
    private Integer price;
    private Integer qty;

    @Builder
    public ProductDto(String name, Integer price, Integer qty) {
        this.name = name;
        this.price = price;
        this.qty = qty;
    }


    
}

public class MapperTest {

    @Test
    public void 고급매핑하기() {

    }

    @Test
    public void 매핑하기1() {
        // 1. Product 객체 생성(디폴트)
        Product product = Product.builder()
        .id(null)
        .mcp(null)
        .name(null)
        .price(null)
        .qty(null)
        .build();

        // 기존코드 Product product = new Product(1, "nono", 1000, 50, "samsung");

        // 3. ProductDto 객체생성(디폴트)
        ProductDto productDto = ProductDto.builder()
        .name(product.getName())
        .price(product.getPrice())
        .qty(product.getQty())
        .build();

       // 기존코드  ProductDto productDto2 = new ProductDto(product.getName(),product.getPrice(),product.getQty()); 

        // 5. ProductDto -> product 변경
        Product product2 = Product.builder()
        .name(productDto.getName())
        .price(productDto.getPrice())
        .qty(productDto.getQty())
        .build();

        // 기존코드 roduct product2 = new Product(null,productDto.getName(),productDto.getPrice(),productDto.getQty(),null);
        //순서대로 넣어준다 . id,name,price,qty,mcp
    }
}

 

'JPA' 카테고리의 다른 글

vs로 db연결 및 세팅  (0) 2022.10.21