inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

k-dev님의 게시글

k-dev k-dev

@dev8945

수강평 작성수
-
평균평점
-

게시글 13

질문&답변

batchInsert 가 가능한지 문의드립니다.

실전 스프링 부트와 JPA 활용1,2 JPA : 자바 ORM 표준 JPA 프로그래밍 -기본편 QueryDSL Spring Data JPA 안녕하세요 강의 잘 듣고 있습니다. 제가 구매한 강의 목록 인데요 이중에 batchinsert (JPA 책 15.4.5) 가 어느 강의에 있는지 한번 더 확인해 주시면 고맙겠습니다. batch update 등은 강의에서 봤는데요. batch insert 로 대량의 데이타(List ) 를 넣는 경우도 필요해서 질문드렸습니다

좋아요수
0
댓글수
4
조회수
526

질문&답변

fetch join 시 child table 조건이 실제 쿼리에 반영이 안되네요..

• 자바진영의ORM기술표준 • JPA를 왜 사용해야 하는가? • JPA동작-저장, 조회 • JPA와상속-저장,조회 • 성능최적화 - 1치 캐쉬 • 성능최적화 - Lazy 로딩 • OSIV 최적화 • 양방향 연관관계 Owner • QueryDsl 장점 • QueryDsl 쿼리 사용을 위한 Repository 구조 (Custom Repository, Impl, Querydsl4RepositorySupport) • N+1 문제 해결 . 페이징 & 소팅 • Projections JPA 관련 강의 5개를 들으면서 정리해 본 주제 인데요. 실무에서 중요한 팁(@OneToMany 에서 batch_size 설정을 통한 N+1 문제 해결, osiv on/off 이슈등) 또는 실무에서 발생할 수 있는 중요 포인트 중에 놓친게 없는지 한번 확인 부탁드려도 될런지요?

좋아요수
0
댓글수
6
조회수
795

질문&답변

어플리케이션 실행시 인텔리제이 콘솔에 찍히는 sql statement가 1줄로 나오는 문제!

datasource 가 1개인 경우 yml 파일에만 지정하면 format_sql 도 잘되고 default_batch_fetch_size 도 잘 되는데요. 멀티 datasource 를 사용중이라 JPAConfig 클래스를 만들어서 사용하면 default_batch_fetch_size 프로퍼티는 아래 properties 에 값을 넣으면 되는데요. format_sql 은 안먹네요 ???? -> yml 파일에 등록해도 안되서 default_batch_size 는 아래 속성값에 추가하니까 되었는데요. format_sql 은 안되네요.. package kr.co.korbit.demo ; ::: @Configuration @EnableTransactionManagement @EnableJpaRepositories ( entityManagerFactoryRef = "jpaEntityManagerFactory" , transactionManagerRef = "jpaTransactionManager" , basePackages = { "kr.co.korbit.demo.jpa.repository" , "kr.co.korbit.demo.jpa.repository.custom" , "kr.co.korbit.demo.jpa.repository.impl" , "kr.co.korbit.demo.jpa.repository.querydsl" }) public class JpaConfig { final String dialect = "org.hibernate.dialect.H2Dialect" ; String ddlAuto = "create" ; String showSql = "false" ; String formatSql = "true" ; String useNewIdGeneratorMappings = "false" ; String implicitStrategy = "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy" ; String physicalStrategy = "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy" ; @Autowired ( required = false ) private PersistenceUnitManager persistenceUnitManager ; @Bean ( name = "jpaDataSource" ) @ConfigurationProperties ( prefix = "spring.datasource.demo" ) @Primary public DataSource jpaDataSource () { HikariDataSource dataSource = DataSourceBuilder. create ().type(HikariDataSource. class ).build() ; return dataSource ; } @Bean ( name = "jpaEntityManagerFactoryBuilder" ) @Primary public EntityManagerFactoryBuilder jpaEntityManagerFactoryBuilder (){ HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter() ; adapter.setShowSql( true ) ; adapter.setPrepareConnection( true ) ; adapter.setDatabase(Database. H2 ) ; adapter.setDatabasePlatform( dialect ) ; adapter.setGenerateDdl( false ) ; HashMap , String> properties = new HashMap , String>() ; properties.put( "hibernate.ddl-auto" , ddlAuto ) ; properties.put( "format_sql" , "true" ) ; properties.put( "default_batch_size" , "300" ) ; properties.put( "hibernate.naming.implicit-strategy" , implicitStrategy ) ; properties.put( "hibernate.naming.physical-strategy" , physicalStrategy ) ; properties.put( "hibernate.use-new-id-generator-mappings" , useNewIdGeneratorMappings ) ; EntityManagerFactoryBuilder builder = new EntityManagerFactoryBuilder( adapter , properties , this . persistenceUnitManager ) ; return builder ; } @Primary @Bean ( name = "jpaEntityManagerFactory" ) public LocalContainerEntityManagerFactoryBean jpaEntityManagerFactory ( @Qualifier ( "jpaEntityManagerFactoryBuilder" ) EntityManagerFactoryBuilder builder , @Qualifier ( "jpaDataSource" ) DataSource jpaDataSource) { LocalContainerEntityManagerFactoryBean factory = builder .dataSource(jpaDataSource) .packages( "kr.co.korbit.demo.jpa.model" ) .persistenceUnit( "demo" ) .build() ; factory.setPackagesToScan( "kr.co.korbit.demo.jpa.model" ) ; return factory ; } @Bean ( name = "jpaTransactionManager" ) @Primary public PlatformTransactionManager jpaTransactionManager ( @Qualifier ( "jpaEntityManagerFactory" ) EntityManagerFactory jpaEntityManagerFactory) { return new JpaTransactionManager(jpaEntityManagerFactory) ; } @Bean ( name = "jpaQueryFactory" ) @Primary public JPAQueryFactory jpaQueryFactory ( @Qualifier ( "jpaEntityManagerFactory" ) EntityManagerFactory jpaEntityManagerFactory) { return new JPAQueryFactory(jpaEntityManagerFactory.createEntityManager()) ; } }

좋아요수
0
댓글수
3
조회수
1319

질문&답변

@OneToMany 시에 N+1 무제와 페이징 문제

@OneToMany 인 Collection join 인경우 N+1 이 아니라 1 + 1 in (...) 쿼리로 되서 최적화가 가능하다는거죠? default_batch_fetch_size = 100 으로 지정할 경우 페이징도 가능하고 1+n -> 1+1 로 변경...

좋아요수
0
댓글수
3
조회수
387

질문&답변

fetch join 시 child table 조건이 실제 쿼리에 반영이 안되네요..

@EntityGraph ( attributePaths = [ "quizList" ]) @Query ( value = "select q " + " from LneQuest q INNER JOIN q. quizList qz where 1=1 " + " and (:type is null or q.type = :type) " + " and (:from is null or :from + " and (:to is null or q.createdAt , countQuery = "select count(q)" + " from LneQuest q where 1=1 " + " and (:type is null or q.type = :type) " + " and (:from is null or :from + " and (:to is null or q.createdAt , nativeQuery = false ) fun findAllByJpql ( @Param ( "type" )type: String? , @Param ( "from" )from: LocalDateTime? , @Param ( "to" )to: LocalDateTime? , pageable: Pageable): Page val jpql = selectFrom( lneQuest ) .innerJoin( lneQuest . quizList , lneQuiz ) .fetchJoin() .where( WhereBuilder() .optionalAnd(from , { lneQuest . createdAt .after(from) } ) .optionalAnd(to , { lneQuest . createdAt .before(to) } ) .optionalAnd(type , { lneQuest . type .eq(type) } ) ) .orderBy(*ordable(pageable. sort ). toTypedArray ()) val countJpql = selectFrom( lneQuest ) .where( WhereBuilder() .optionalAnd(from , { lneQuest . createdAt .after(from) } ) .optionalAnd(to , { lneQuest . createdAt .before(to) } ) .optionalAnd(type , { lneQuest . type .eq(type) } ) ) return applyPagination(pageable , jpql , countJpql) 안녕하세요 답변 주셔서 감사합니다. 문의 드리고 싶은 부분들을 정리해서 github 에 데모로 만들어서 이슈를 확인받고 싶은데, 잘 안되네요.... ;;; qz.type = :type 으로 조건을 걸 수 있는 방법이 있다면 추가로 알려주시면 감사하겠습니다. (Querydsl 또는 JPQL 어노테이션 쿼리 모두 상관없습니다) -> 가능하면 저도 H2 db 로 테스트 코드 한번 만들어서 공유드리도록 하겠습니다. 더불어 일반적인 @OneToMany 를 QueryDsl FetchJoin 으로 작성해 봤는데요 N+1 문제는 잘 해결되는데 페이징 처리는 안되서 혹시 방법이 있는지요? -> 아니면 FetchJoin 시에는 구조적으로 페이징 처리가 안되는지요? .fetchJoin() 을 제거하면 N+1 문제가 발생하지만 페이징 처리와 Sort 는 모두 잘 됩니다. JPQL @Query 어노테이션도 Runtime 에 Syntax 체크를 해주긴 해주더라구요... QueryDsl 의 경우에는 Syntax 체크가 언어 레벨에서 되는 점이 더 편할 것 같긴 합니다만, 복잡한 쿼리의 경우 QueryDsl 로 작성하는게 더 검증이나 유지보수가 더 편리할까요? (엔터프라이즈 상황에서요)

좋아요수
0
댓글수
6
조회수
795