사용자 도구

사이트 도구


springframework:spring_data_jdbc

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
springframework:spring_data_jdbc [2022/01/21 21:57]
kwon37xi [EntityCallback]
springframework:spring_data_jdbc [2023/09/15 19:50] (현재)
kwon37xi
줄 1: 줄 1:
 ====== Spring Data JDBC ====== ====== Spring Data JDBC ======
   * [[https://projects.spring.io/spring-data-jdbc/|Spring Data JDBC]]   * [[https://projects.spring.io/spring-data-jdbc/|Spring Data JDBC]]
 +  * https://github.com/spring-projects/spring-data-jdbc
   * [[https://spring.io/blog/2018/09/17/introducing-spring-data-jdbc|Introducing Spring Data JDBC]]   * [[https://spring.io/blog/2018/09/17/introducing-spring-data-jdbc|Introducing Spring Data JDBC]]
 +  * [[springframework:spring_data_jdbc:querydsl|Spring Data JDBC & QueryDSL]]
  
 +===== 가장 큰 특징 =====
 +  * Entity 가 proxy 객체가 아닌 POJO 이기 때문에, proxy 일 때 발생하는 숨은 동작들이 발생하지 않는다.
 +  * 이 특징을 잘 활용하면 side effect 없이 다양한 시도를 할 수 있다.
  
 ===== JdbcAggregateTemplate ===== ===== JdbcAggregateTemplate =====
-  * [[https://docs.spring.io/spring-data/jdbc/docs/current/api/org/springframework/data/jdbc/core/JdbcAggregateTemplate.html|JdbcAggregateTemplate (Spring Data Relational Parent 2.3.1 API)]]+  * [[https://docs.spring.io/spring-data/jdbc/docs/current/api/org/springframework/data/jdbc/core/JdbcAggregateTemplate.html|JdbcAggregateTemplate]]
   * SpringDataJdbc 가 내부적으로 사용하는 DB 제어 template   * SpringDataJdbc 가 내부적으로 사용하는 DB 제어 template
   * 직접 주입 받아서 사용가능하다.   * 직접 주입 받아서 사용가능하다.
줄 17: 줄 22:
   * [[https://docs.spring.io/spring-data/jdbc/docs/current/api/org/springframework/data/jdbc/repository/config/AbstractJdbcConfiguration.html|AbstractJdbcConfiguration]] 설정 확장.   * [[https://docs.spring.io/spring-data/jdbc/docs/current/api/org/springframework/data/jdbc/repository/config/AbstractJdbcConfiguration.html|AbstractJdbcConfiguration]] 설정 확장.
   * [[https://docs.spring.io/spring-data/jdbc/docs/current/api/org/springframework/data/jdbc/core/convert/JdbcCustomConversions.html|JdbcCustomConversions]] : Custom 객체 -> DB 저장데이터 변환   * [[https://docs.spring.io/spring-data/jdbc/docs/current/api/org/springframework/data/jdbc/core/convert/JdbcCustomConversions.html|JdbcCustomConversions]] : Custom 객체 -> DB 저장데이터 변환
-  * [[https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/convert/WritingConverter.html|WritingConverter]] : 데이터를 컬럼으로 쓰기할 때 변환 +  * [[https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/convert/WritingConverter.html|@WritingConverter]] : 데이터를 컬럼으로 쓰기할 때 변환 
-  * [[https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/convert/ReadingConverter.html|ReadingConverter]] : 데이터를 컬럼에서 객체로 읽을 때 변환+  * [[https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/convert/ReadingConverter.html|@ReadingConverter]] : 데이터를 컬럼에서 객체로 읽을 때 변환 
 + 
 +===== Bidirectional Relationship ===== 
 +==== internal ==== 
 +  * [[https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/annotation/Transient.html|@Transient]] : 해당 피드를 Repository에서 다루지 않는다는 표시. 
 +  * [[https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/annotation/PersistenceConstructor.html|@PersistenceConstructor]] 로 지정된 생성자는 DB에서 데이터 읽어서 객체화 할 때 호출된다. 
 +  * DB 데이터를 읽을 때 생성자에서 ''@Transient'' 필드에 값 주입해서 양방향 관계 흉내가 가능함. 
 + 
 +==== external ==== 
 +  * 이런 방법 보다는 그냥 [[https://docs.spring.io/spring-data/jdbc/docs/2.2.3/api/org/springframework/data/jdbc/core/mapping/AggregateReference.html|AggregateReference]] 를 사용해 ID 값만 저장하고 ID로 일괄 조회하는 것이 나을 듯. 이것이 SpringDataJDBC의 기본 방침. 
 + 
 + 
 +===== Caching ===== 
 +  * Spring Data JDBC는 Cache를 지원하지 않는다. 
 +  * 필요하다면 [[springframework:cacheabstraction|Spring Cacheh Abstraction]]을 사용한다. 
 + 
 +===== Eager Loading ===== 
 +  * [[https://docs.spring.io/spring-data/jdbc/docs/2.2.3/api/org/springframework/data/jdbc/core/mapping/AggregateReference.html|AggregateReference]] 로 매핑된 필드를 [[https://docs.spring.io/spring-data/jdbc/docs/2.2.3/api/org/springframework/data/relational/core/mapping/Embedded.html|@Embedded]]로 매핑한 View 객체를 생성하고 일반 SQL 쿼리로 join 을 통해 값을 채우면 된다. 
 +  * [[https://github.com/schauder/talk-beyond/blob/master/src/main/java/de/schauderhaft/beyond/join/MinionView.java|MinionView]] ''Minion''이라는 Entity에 대해 join 데이터를 ''Embed''한 view 클래스. 
 +  * 어차피 조회한 엔티티가 proxy가 아니라서 별다른 side effect 없이 View 객체 사용가능. 
 + 
 +<code java> 
 +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(); 
 +</code> 
 + 
 ===== 참조 ===== ===== 참조 =====
   * [[https://springone.io/2021/sessions/spring-data-jdbc-beyond-the-obvious|Spring Data JDBC: Beyond the Obvious | SpringOne | Sep 1–2, 2021]]   * [[https://springone.io/2021/sessions/spring-data-jdbc-beyond-the-obvious|Spring Data JDBC: Beyond the Obvious | SpringOne | Sep 1–2, 2021]]
줄 32: 줄 75:
     * https://github.com/schauder/talk-beyond : 관련 소스     * https://github.com/schauder/talk-beyond : 관련 소스
   * [[https://www.youtube.com/watch?v=SJlKBkZ2yAU|Spring Data JDBC: Beyond the Obvious - YouTube]]   * [[https://www.youtube.com/watch?v=SJlKBkZ2yAU|Spring Data JDBC: Beyond the Obvious - YouTube]]
 +  * [[https://luvstudy.tistory.com/174|Spring Data JDBC는 현재 쓸 만할까?]]
 +    * 2022현재 multiple datasource 지정 안됨
 +    * [[https://github.com/spring-projects/spring-data-relational/issues/544|Multiple datasources support [DATAJDBC-321] · Issue #544 · spring-projects/spring-data-relational]]
 +    * [[https://github.com/spring-projects/spring-data-relational/pull/1005|Add jdbcConverterRef to @EnableJdbcRepositories by kota65535 · Pull Request #1005 · spring-projects/spring-data-relational]]
 +    * [[https://youtube.com/playlist?list=PLbuI9mmWSoUFGL6B_NxB9IoGqyDq-vEen&si=aaNTrHZx_9fswpn6|Spring Dataa JDBC - SpringBoot 3]]
springframework/spring_data_jdbc.1642769856.txt.gz · 마지막으로 수정됨: 2022/01/21 21:57 저자 kwon37xi