사용자 도구

사이트 도구


springframework:spring_data_jdbc

Spring Data JDBC

가장 큰 특징

  • Entity 가 proxy 객체가 아닌 POJO 이기 때문에, proxy 일 때 발생하는 숨은 동작들이 발생하지 않는다.
  • 이 특징을 잘 활용하면 side effect 없이 다양한 시도를 할 수 있다.

JdbcAggregateTemplate

  • SpringDataJdbc 가 내부적으로 사용하는 DB 제어 template
  • 직접 주입 받아서 사용가능하다.

EntityCallback

AbstractJdbcConfiguration

Bidirectional Relationship

internal

  • @Transient : 해당 피드를 Repository에서 다루지 않는다는 표시.
  • @PersistenceConstructor 로 지정된 생성자는 DB에서 데이터 읽어서 객체화 할 때 호출된다.
  • DB 데이터를 읽을 때 생성자에서 @Transient 필드에 값 주입해서 양방향 관계 흉내가 가능함.

external

  • 이런 방법 보다는 그냥 AggregateReference 를 사용해 ID 값만 저장하고 ID로 일괄 조회하는 것이 나을 듯. 이것이 SpringDataJDBC의 기본 방침.

Caching

Eager Loading

  • AggregateReference 로 매핑된 필드를 @Embedded로 매핑한 View 객체를 생성하고 일반 SQL 쿼리로 join 을 통해 값을 채우면 된다.
  • MinionView Minion이라는 Entity에 대해 join 데이터를 Embed한 view 클래스.
  • 어차피 조회한 엔티티가 proxy가 아니라서 별다른 side effect 없이 View 객체 사용가능.
class MinionView extends Minion {
    MinionView(String name, AggregateReference<Person, Long> evilMaster) {
        super(name, evilMaster);
    }
 
    @Embedded(onEmpty = Embedded.OnEmpty.USE_EMPTY, prefix = "master_")
    Person master;
}
 
// join 해서 MinionView에 값을 넣는 Repository 쿼리
@Query("select m.id as id, m.name name, m.number_of_eyes as number_of_eyes, " +
        "p.name as master_name, p.id as master_evil_master " +
        "from minion m join person p on p.id = m.evil_master")
List<MinionView> allMinionViews();

참조

springframework/spring_data_jdbc.txt · 마지막으로 수정됨: 2023/09/15 19:50 저자 kwon37xi