Spring

Spring (리스너, 연관 관계 메핑, 어노테이션)

code2772 2022. 12. 13. 09:07
728x90
반응형

✔ 리스너 특징

리스너(특정 이벤트를 받기 위해 대기)

이벤트 종류

//Post - `직 후` Pre = '직 전'

1. PostLoad : 엔티티가 영속성 컨텍스트에 조회된 직후

2. PrePerList : 새로운 인스턴스를 merge할 때 수행. persist() 메소드를 호출해서 엔티티를
영속성 컨텍스트에 관리하기 직전에 호출

3. PreUpdate :  flush, commit를 호출해서 엔티티를 데이터베이스에 수정하기 직전에 호출

4. PreRemove : remove 메소드를 호출해서 엔티티를 영속성 컨텍스트에서 삭제하기 직전에 호출

5. PostPersist : flush, commit를 호출해서 엔티티를 데이터베이스에 저장한 직후에 호출

6. PostUpdate : flush, commit를 호출해서 엔티티를 데이터베이스에 수정하기 직후에 호출

7. PostRemove : remove 메소드를 호출해서 엔티티를 영속성 컨텍스트에서 삭제하기 직후에 호출

 

 

✔ 연관 관계 메핑

연관 관계 메핑
- 테이블간의 연관 관계가 있을 때 객체지향스럽게 사용하는 방법을 제공
- 데이터베이스에서는 외래키를 사용하지만, JPA에서는 객체를 참조하는 방식으로 연관 관계를 메핑함

@OneToOne : 하나의 엔티티가 하나의 엔티티와 연관 관계를 맺을 때 사용
@OneToMany : 하나의 엔티티가 여러개의 엔티티와 연관 관계를 맺을 때 사용
@ManyToOne : 여러개의 엔티티가 하나의 엔티티와 관계를 맺을 때 사용
@ManyToMany : 여러개의 엔티티가 여러개의 엔티티와 관계를 맺을 때 사용

FetchType
- LAZY(지연로딩)
    - 참조 객체들의 데이터들을 무시하고 해당 엔티티의 데이터만을 가져오는 방법
    - 참조 객체의 데이터를 사용하기 위해 여러번의 쿼리를 사용
- EAGER(즉시로딩)
    - 하나의 객체를 DB로 부터 읽어올 때 참조 객체들의 데이터까지 전부 읽어오는 방식
    - 한번의 쿼리로 모든 정보를 가져옴
package com.koreait.day5.model.entity;


import com.koreait.day5.model.config.Auditable;
import com.koreait.day5.model.config.BaseEntity;
import com.koreait.day5.model.enumclass.OrderType;
import lombok.*;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder // 연속적으로 실행하게 해주는 기능 ex) method.method ......
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@EntityListeners(AuditingEntityListener.class)
public class OrderGroup  extends BaseEntity implements Auditable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Enumerated(EnumType.STRING)
    private OrderType orderType;
    private LocalDateTime arrivalDate;
    private String status;
    private String revAddress;
    private String revName;
    private String paymentType;
    private BigDecimal totalPrice;
    private Integer totalQuantity;
    private Long userId;
}
//    @CreatedDate // 인서트시 자동으로 데이터를 넣어준다.
//    private LocalDateTime regDate;


//    @LastModifiedDate // 수정 시 날자를 넣어준다
//    private LocalDateTime updateDate;

@ CreateDate : 인서트 시 자동으로 LocalDateTime.now()를 넣어준다

 @ LastModifiedDate: 인서트 시 자동으로 LocalDateTime.now()를 넣어준다

 

 

✔ regDate, updateDate 선언 부

package com.koreait.day5.model.config;

import java.time.LocalDateTime;

public interface Auditable {
    LocalDateTime getRegDate();
    LocalDateTime getUpdateDate();

    void setRegDate(LocalDateTime regDate);// 인터페이스 역할 수행
    void setUpdateDate(LocalDateTime updateDate);
}
 

 

❗ @Entity : JPA를 사용해서 DB 테이블과 매핑할 클래스는 @Entity를 꼭 붙여야만 매핑이 가능합니다.

 @NoArgsConstructor : 파라미터가 없는 기본 생성자를 생성

@AllArgsConstructor : 모든 필드 값을 파라미터로 받는 생성자를 만듬

 @Data : 모든 필드를 대상으로 접근자와 설정자가 자동으로 생성하고, @Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode을 한꺼번에 설정

 

 @ToString : toString() 메소드를 생성해준다, 사람이 읽기 쉬운 형으로 자동 변환해주는 메소드이다.

 @EqualsAndHashCode : 자바 bean에서 동등성 비교를 위해 equals와 hashcode 메소드를 오버라이딩해서 사용

 @EntityListners :  JPA Entity에 Persist, Remove, Update, Load에 대한 event 전과 후에 대한 콜백 메서드를 제공한다.

 

// Auditi  : Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능

반응형