매핑 기본
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 |
---|