본문 바로가기
Spring

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

by code2772 2022. 12. 13.

[ 목차 ]

    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에서 시간에 대해서 자동으로 값을 넣어주는 기능

    반응형