TIL/Spring

TIL 2024-12-17 ( 5주차 - 데이터베이스 다루기 )

myoma 2024. 12. 17. 19:59

1) 오늘 학습한 내용

  • QueryDLS
  • Auditing
  • @Dynamicinsert
  • @DynamicUpdate

 


  • QueryDSL
    • Entity의 매핑 정보를 활용하여 쿼리에 적합하도록 쿼리 전용 클래스(Q클래스)로 재구성해주는 기술.
    • JPAQueryFactory을 통한 Q클래스를 활용할 수 있는 기능들을 제공.
      • JPAQueryFactory?
        • 재구성한 Q클래스를 통해 문자열이 아닌 객체 또는 함수로 쿼리를 작성하고 실행하게 해주는 기술.
    • JPAQueryFactory 사용을 위해서는 entityManager를 주입해서 Bean으로 등록해줘야 한다.
// config 패키지안에 추가

@Configuration
public class JPAConfiguration {

  @PersistenceContext
  private EntityManager entityManager;

  @Bean
  public JPAQueryFactory jpaQueryFactory() {
    return new JPAQueryFactory(entityManager);
  }
}

 

 

  • Auditing
    • 엔티티를 누가 언제 생성/마지막 수정 했는지 자동으로 기록해 주는 기술
    • 적용방법
      • 메인 에플리케이션 위에 @EnableJpaAuditing 추가.
      • 날짜 시간 엔티티 따로 작성.
      • 엔티티 클래스에 @EntityListeners(AuditingEntityListener.class) 추가
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedAt;
}


@Getter
@Entity(name = "user")
public class User extends BaseEntity {

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

   ...

   
}
  • createdAt, modifiedAt은 구현체 없이 동작하지만 createdBy, modifiedBy는 구현제가 필요하다.

 

 

  • @Dynamicinsert
    • entity에 적용하게 되면 Insert 쿼리를 날릴 때 null 인 값은 제외하고 쿼리문이 만들어진다.
    • 적용 방법은 필요한 엔티티에 @Dynamicinsert 어노테이션만 붙이면 된다.
    • 이러면 null 값은 제외하고 쿼리가 만들어지고 필드차이가 적으면 큰 차이는 없지만 필드가 많아질수록 차이가 많이 난다.
@DynamicInsert
	public class User {
  ...
}

 

 

  • @DynamicUpdate
    • @Dynamicinsert 어노테이션과 똑같은데 이건 Update 쿼리를 날 때 null 값을 제외하고 쿼리문을 만든다.
    • 적용 방법도 동일하다.