개발/Spring, Spring Data JPA, Querydsl

Spring - Data JPA

잇(IT) 2023. 6. 7. 21:22
728x90

- JPA를 이용할 때는 테이블과 SQL을 다루는 것이 아니라 데이터에 해당하는 개체를 엔티티 객체라는 것으로 다루고 JPA로 이를 데이터베이스와 연동해서 관리한다.

 

- 엔티티 객체는 쉽게 말해서 PK(기본키)를 가지는 자바의 객체이다. 엔티티 객체는 고유의 식별을 위해 @Id를 이용해서 객체를 구분하고 관리한다.

 

- Spring Data JPA는 자동으로 객체를 생성하고 이를 통해서 예외 처리 등을 자동으로 처리하는데 이를 위해서 제공되는 인터페이스가 JpaRepository이다.

 

- 엔티티 클래스는 반드시 @Entity가 존재하고, 해당 엔티티 객체의 구분을 위한 @Id가 필요하다.

 

@MappedSuperclass
@EntityListeners(value = { AuditingEntityListener.class})
@Getter
public class BaseEntity {

    @CreatedDate
    @Column(name = "regdate", updatable = false)
    private LocalDateTime regDate;

    @LastModifiedDate
    @Column(name = "moddate")
    private LocalDateTime modDate;
}
  1. @MappedSuperclass: 이 어노테이션은 JPA(Java Persistence API) 엔티티 클래스의 공통 속성을 정의하기 위해 사용됩니다. BaseEntity 클래스가 다른 엔티티 클래스에서 상속받을 때, @MappedSuperclass 어노테이션이 지정된 클래스의 필드도 상속됩니다.
  2. @EntityListeners(value = { AuditingEntityListener.class}): 이 어노테이션은 JPA 엔티티의 이벤트를 수신하는 엔티티 리스너를 지정합니다. AuditingEntityListener 클래스는 엔티티의 생성 및 수정 시점에 자동으로 날짜 필드를 업데이트하는 데 사용될 것입니다.
  3. @Getter: 이 어노테이션은 Lombok 라이브러리에서 제공되는 것으로, 자동으로 해당 클래스의 필드에 대한 Getter 메서드를 생성해줍니다. regDate와 modDate 필드에 대한 Getter 메서드가 자동으로 생성될 것입니다.
  4. @CreatedDate: 이 어노테이션은 Spring Data JPA의 Auditing 기능을 사용하여 엔티티가 생성될 때 자동으로 해당 필드를 현재 날짜와 시간으로 설정합니다. regDate 필드는 생성 시점의 날짜와 시간으로 자동으로 설정될 것입니다.
  5. @Column(name = "regdate", updatable = false): 이 어노테이션은 엔티티의 속성을 데이터베이스 테이블의 컬럼과 매핑할 때 사용됩니다. regDate 필드는 regdate라는 이름의 컬럼과 매핑될 것입니다. updatable = false로 설정되어 있으므로, 이 필드는 수정되지 않도록 설정됩니다.
  6. @LastModifiedDate: 이 어노테이션은 Spring Data JPA의 Auditing 기능을 사용하여 엔티티가 수정될 때 자동으로 해당 필드를 현재 날짜와 시간으로 설정합니다. modDate 필드는 수정 시점의 날짜와 시간으로 자동으로 설정될 것입니다.

위의 어노테이션들은 JPA와 Spring Data JPA의 기능을 사용하여 엔티티의 생성 및 수정 시점에 자동으로 날짜 필드를 업데이트하도록 지원합니다.

@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Board extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long bno;

    @Column(length = 500, nullable = false) //컬럼의 길이와 null 허용여부
    private String title;

    @Column(length = 2000, nullable = false)
    private String content;

    @Column(length = 50, nullable = false)
    private String writer;

    public void change(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

- Board 클래스는 BaseEntity 클래스를 상속 받고, @Column에 name이 없을 경우 필드 이름과 동일한 컬럼에 적용된다.


- 데이터베이스에 insert를 실행하는 기능은 JpaRepository의 save()를 통해서 이루어진다. save()는 현재의 영속 컨텍스트 내에 데이터가 존재하는지 찾아보고 해당 엔티티 객체가 없을 때는 insert를, 존재할 때는 update를 자동으로 실행한다.

728x90