jpa 활용

정리공간·2022년 6월 13일
0

validation

pom.xml

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

controller.java에서 파라미터에 @valid 추가

public xxx xxxSave(@RequestBody @Valid xxxSaveDto request) {
...
}

Dto.java에서 annotation 추가

DTO마다 validation이 다를 수 있기 때문에 Entity에서는 잘 사용 안함

@NotNull : null을 허용하지 않음
@NotEmpty : null과 ""을 허용하지않음
@NotBlank : null과 ""과 " "을 허용하지 않음
@Size(min=,max=) : 문자열, 배열등의 크기가 만족하는가?
@Pattern(regex=) : 정규식을 만족하는가?
@Max(숫자) : 지정 값 이하인가?
@Min(숫자) : 지정 값 이상인가
@Future : 현재 보다 미래인가?
@Past : 현재 보다 과거인가?
@Positive : 양수만 가능
@PositiveOrZero :양수와 0만 가능
@Negative : 음수만 가능
@NegativeOrZero : 음수와 0만 가능
@Email : 이메일 형식만 가능
@Digits(integer=, fraction = ) : 대상 수가 지정된 정수와 소수 자리 수 보다 작은가?
@DecimalMax(value=) : 지정된 값(실수) 이하인가?
@DecimalMin(value=) : 지정된 값(실수) 이상인가?
@AssertFalse : false 인가?
@AssertTrue : true 인가?
https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-builtin-constraints

@Embedd관련

entity에 서로 관련된 필드들을 객체로 만들어주어 가독성을 높여준다

public Class User {
	@Id
	private Long Id;
    private String name;
    
    private zipCode;
    private address1;
    private address2;
}
public Class User {
	private Long Id;
    private String name;
    
    @Embedded
    private Address address;
}

@Embeddable
public Class Address {
    private zipCode;
    private address1;
    private address2;
}

이렇게 embedd한 경우 서로 동일한 필드가 있을 수 있는데 @AttributeOverried를 활용한다

public Class User {
	private Long Id;
    private String name;
    
    @Embedded
    @AttributeOverride(name="zipCode", column=@Column(name="user_zipCode")
    @AttributeOverride(name="address1", column=@Column(name="user_address1")
    @AttributeOverride(name="address2", column=@Column(name="user_address2")
    private Address userAddress;
    
    @Embedded
    @AttributeOverride(name="zipCode", column=@Column(name="vendor_zipCode")
    @AttributeOverride(name="address1", column=@Column(name="vendor_address1")
    @AttributeOverride(name="address2", column=@Column(name="vendor_address2")
    private Address venderAddress;
}

CASCADE

게시글과 게시글의 첨부파일처럼 완전히 종속적인 경우에만 사용.

@JosnIgnore

양방향 연관관계인 경우 한쪽을 @JosnIgnore로 끊어줌

Lazy

member(1), order(n) entity가 있을때
order정보 조회 시 LAZY 걸려 있는 member정보를 바로 가져와야 할 경우

List<Order> all = orderRepository.findAll();
for(Order order : all){
	order.getMember().getName();
}

컬렉션 페이징조회

xToMany는 Lazy를 걸어두고 xToOne 관계만 우선 조회.
이후 반복문으로 Lazy 초기화하여 가져옴.
spring.jpa.properties.hibernate.default_batch_fetch_size, @BatchSize 활용

n+1 문제

member(1), order(5)있을때
멤버정보 조회 시 order와 조인되어 5row가 생기고 order정보 쿼리가 5번 실행
1. queryDSL에서 fetch 조인 + distinct

조회는 웬만하면 QueryDSL 사용

0개의 댓글