월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 데이터 JPA
spring boot 2.7.13-SNAPSHOT trace 소문자 로그 안나옴
spring boot 2.7.13-SNAPSHOT 버전에서는 소문자 trace로 하면 적용이 안되네요~logging.level.org.hibernate.type.descriptor.sql=trace=>logging.level.org.hibernate.type.descriptor.sql=TRACE
- 미해결스프링 데이터 JPA
<스프링 데이터 Common: 기본 리포지토리 커스터마이징> 에 대한 질문
JpaRepository를 상속 받는 인터페이스 정의@NoRepositoryBean기본 구현체를 상속 받는 커스텀 구현체 만들기@EnableJpaRepositories에 설정repositoryBaseClass기본 리포지토리를 커스터마이징할 때 위와 같은 방법으로 하라고 알려주셨는데요, 인터페이스에서 JpaRepository를 상속받았는데 구현체에서 SimpleJpaRepository<T, ID>를 상속받는 이유를 모르겠습니다. 구현체가 (JpaRepository를 상속받은)인터페이스를 구현하니까 JpaRepository 기능을 사용할 수 있지 않나? 라고 생각했습니다.아마 제가 상속과 구현 개념이 제대로 잡혀있지 않아서 그런 것 같습니다. 설명해 주시면 저에게 많은 도움이 될 것 같습니다. 좋은 강의 만들어주셔서 감사합니다!
- 미해결스프링 데이터 JPA
comment table에서 저장될떄 왜 id값이 2부터저장이되는건가요?
다른 테이블을 추가로 만들어서 post table에 매핑을 해봤더니 id값이 3부터 시작하더라구요?id값은 각 테이블 pk라서 각 테이블 처음인 1부터시작해야하는것아닌가요? 이게 Generatevalue 어노테이션과 관계가있는건가요?
- 미해결스프링 데이터 JPA
@EnableJpaRepositories 설정을 스프링부트가 어디에서 자동설정하나요?
안녕하세요!@EnableJpaRepositories 설정을 스프링부트가 어디에서 자동설정하나요? 자동설정의 흐름 (예를 들면 스프링부트의 어떤 애노테이션에서 타고 들어가면 소스코드에서 @EnableJpaRepositories를 확인할 수 있는지) 가이드를 주시면 감사하겠습니다!
- 미해결스프링 데이터 JPA
PersistenceContext 관련 질문드립니다.
안녕하세요 너무 좋은 강의 잘 듣고 있습니다.두가지 질문이 있습니다. PersistenceContext의 상태비교 관련입니다.JPA2 JpaRepository.save() 메소드 강의를 시청하며, 따라하던 도중첫번쨰 assertThat 부터 False 로 떨어져 왜이런지 모르겠습니다.제가 이해한것과 강의내용에 따르면 당연히 True 가 놔와야 할텐데 이상하네요.테스트는 @SpringBootTest 를 사용한 별도의 테스트클래스를 만들어 진행중이며,PostRepository의 경우 아래와 같이 선언 하였습니다.어떤 부분을 잘못이해하고 있거나 틀렸을까요 ? public interface PostRepository extends JpaRepository<Post,Long>, QuerydslPredicateExecutor<Post> @SpringBootTest class DemoJpaApplicationTests { @Autowired private PostRepository postRepository; @Autowired private ApplicationContext applicationContext; @PersistenceContext private EntityManager entityManager; @Test void save(){ Post post = new Post(); post.setId(1L); post.setTitle("JPA"); Post savePost = postRepository.save(post); assertThat(entityManager.contains(post)).isTrue(); assertThat(entityManager.contains(savePost)).isTrue(); assertThat(savePost == post); } 업데이트 쿼리가 안나갈 경우 어떤걸 봐야할까요 ?updateTitle을 만들어 사용할땐 정상적으로 변경 됐지만아래와 같이 코드를 작성하여 테스트 해보니 title에 Spring이 그대로 남아있어 테스트가 실패하네요.private Post savePost(){ Post post = new Post(); post.setTitle("Srping"); return postRepository.save(post); } @Test void updateTitle(){ Post spring = savePost(); spring.setTitle("hibernate"); Optional<Post> post = postRepository.findById(spring.getId()); assertThat(post.get().getTitle()).isEqualTo("hibernate"); }
- 미해결스프링 데이터 JPA
지금(Eager), 나중에(Lazy)의 의미를 모르겠습니다
지금이냐 나중이냐 라는 말의 의미를 모르겠습니다 Fetch 를 Eager로 설정하면 연관관계에 있는 엔티티를 조회하고 Lazy로 설정하면 연관관계에 있는 엔티티까지는 조회하지 않는다는 것이 엔티티를 지금 가져오느냐 나중에 가져오느냐와 무슨 상관이 있는건가요?
- 미해결스프링 데이터 JPA
transaction 구간이 길어질 경우의 처리방법 문의드립니다.
spring batch의 tasklet에서 100만건을 조회하는 상황에서 OOM 발생합니다. jvm 옵션으로 메모리를 늘리면 되지만, OOM 발생할때마다 늘리는건 아닌거 같아서 다른 해결책을 찾고 있습니다. paging을 도입해봐도 OOM은 발생했고, 오히려 page가 뒤로 갈수록 느려지는 현상도 발생했었습니다. native query를 쓰면 OOM도 없어지고, 속도저하도 안생기는것을 확인했습니다. 질문1. tasklet의 transaction이 하나라서 JPA가 100만건을 영속성 컨텍스트에 캐시하면서 생긴 이슈가 맞나요? spring batch에서 chunk를 사용하지 않고 tasklet을 쓰면 transaction이 하나로 유지되는걸로 알고 있습니다. 그리고 하나의 transaction 내에서는 JPA의 영속성 컨텍스트가 유지되는걸로 알고 있습니다. native query의 경우에 영속성 컨텍스트를 사용하지 않기 때문에 문제가 없는게 아닐까 추정을 하고 있습니다. 10만건씩 10회 조회하도록 paging을 도입해봐도 문제가 계속 되는것 봐서는 페이징과 상관없이 영속성 컨텍스트 이슈로 보이는데요, 이 추정이 맞을까요? 질문2. paging 도입시 loop가 돌수록 점차 느려지던데 영속성 컨텍스트 때문이 맞을까요? 100만건을 한번에 올리는게 무리인거 같아서, 하나의 tasklet 내에서 10만건씩 paging을 도입했습니다. 당연히 이래도 OOM은 났습니다. 근데 페이지가 뒤로 갈수록 점차 느려졌습니다. 건건히 detach를 해주니까 속도저하가 사라졌는데요, 추정하는 원인으로는 "첫루프 = 영속성컨텍스트 0건과 새로운 10만건의 중복 체크 2번째 루프 = 영속성 컨텍스트 10만건과 새로운 10만건의 중복 체크 3번째 루프 = 영속석 컨텍스트 20만건과 새로운 10만건의 중복 체크 ..." 이런거 같던데 혹시 이러한 원인이 맞을까요? 질문3. paging을 도입하고, entity manager에서 detach를 하면 해결이 되던데 좀더 좋은 방법은 없을까요? 한번에 select 해오는 건수를 줄이고 (대략 10만씩 10번 조회), 매 loop에서 em.detach(obj)를 해주고 있습니다. 혹시나 @Transaction(readOnly = true)를 설정해봤는데도 OOM이나, 속도저하는 동일하게 발생하는것 같았습니다. 아무래도 snapshot을 추가로 보관하느냐의 차이일 뿐, 기본적으로 영속성 컨텍스트에 캐시를 해서 그런게 아닐까 추정하고 있습니다. detach는 list나 paging에서는 먹히지 않아서 건건히 detach 해주는게 효율이 좋아보이지도 않았고, 애초에 영속성 컨텍스트에 안올리고 처리를 하면 되지 않을까 했는데요, native query 쓰는법 외에 영속성 컨텍스트에 저장하지 않고 데이터를 가져오는 방법이 있을까요? 스프링 배치에서의 이슈라... 질문을 어디에 올릴까 하다가, 스프링을 활용한 프로젝트에서 트랜잭션 내에 대용량 처리라고 생각하여 여기에 글 남깁니다.
- 미해결스프링 데이터 JPA
docker postgres
안녕하세요!docker 에서 postgres_boot 이미지는 어디서 다운받을 수 있을까요? 찾아보다가 모르겠어서 질문남깁니다.
- 미해결스프링 데이터 JPA
Multiple DataSource 사용 시 transaction 관련 질문 드립니다.
아래 비슷한 질문이 있네요. 추가로 질문 드리겠습니다 :) 3개의 database에 access하는 application을 작성 중입니다. 1개는 조회만(A라고 하겠습니다) / 나머지 2개(B, C라고 하겠습니다)는 수정도 하기 때문에 transaction이 필요합니다. 각 DB의 Configuration을 만들어, LocalContainerEntityManagerFactoryBean 및 TransactionManager를 설정하여 각각의 DB 접속에 성공하였습니다. 서비스 로직 중에, 하나의 메소드에서 B,C에 insert / update 하는 로직이 있어서 둘 다 commit / rollback 이 되어야 합니다. ChainedTransactionManagerConfiguration를 사용하니 가능하였습니다.configuration 파일은 다음과 같습니다. @Configuration public class ChainedTransactionManagerConfiguration { @Qualifier("abTransactionManager") @Bean public ChainedTransactionManager chainedTransactionManager( @Qualifier("BTransactionManager") JpaTransactionManager aTransactionManager, @Qualifier("BTransactionManager") JpaTransactionManager bTransactionManager ) { return new ChainedTransactionManager(aTransactionManager, bTransactionManager); } } abTransactionManager를 @Transactional 어노테이션에 설정하니 둘 다 롤백이 잘 되었습니다. 그런데, springboot 2.5부터 ChainedTransactionManagerConfiguration 이 deprecated 된다고 하네요. 이유는 2개의 AbstractPlatformTransactionManager 를 사용할 때에 side effect가 발생해서라고 합니다(https://github.com/spring-projects/spring-data-commons/issues/2232 를 참고하시면 됩니다.) 이와 같은 상황에서 ChainedTransactionManagerConfiguration 를 대체하여 추천해 주실 만한 것이 혹 있을까요? 그 외에 TransactionManager를 사용하지 않고서라도 할 수 있는 방법이 혹 있을지요? 대부분의 경우에는 그냥 사용해도 될 것 같기도 한데 좀 찜찜해서요 질문이 너무 길었네요. 감사합니다. ^^;
- 미해결스프링 데이터 JPA
entity 중 null이 아닌 필드만 update 할 방법이 있을까요?
안녕하세요, 강의 덕분에 너무 큰 도움이 되었습니다. 감사합니다. :) Repository의 save() 메소드를 실행하던지, @Query를 사용하던지 해서 update 문을 실행할 경우, null이 아닌 필드만 업데이트하는 방법이 있을지요? 예를 들면 Post 라는 entity에 id, name, email, description 필드가 있을 경우, name 만 값이 있고 나머지는 null인 경우 name만 update 하고 싶다면 어떻게 하면 될까요? 추가 select 없이 하는 방법이 있을지 여쭤봅니다. 다시 한 번 감사 드립니다. :)
- 미해결스프링 데이터 JPA
Eager 모드일 경우, join을 inner join으로 바꾸는 법이 있을까요?
안녕하세요, 강의 덕분에 많은 도움을 받고 있습니다. 감사합니다. Eager 모드로 조회할 경우 join문에 대한 질문입니다. 강의 내용을 보니 쿼리가 left outer join으로 생성되는데요 혹 inner join으로 생성되도록 설정하는 방법이 있을까요? 감사합니다 :)
- 미해결스프링 데이터 JPA
엔티티를 상속받는 DTO가 일반적인가요?
안녕하세요. 기선님 강의 너무 재밌게 잘 보고 있습니다. 질문드릴것이 있는데요 그전에 상황을 설명하면 이렇습니다. (이해하기 쉬우시게 한글로 적겠습니다) '병원' , '환자' 라고 하는 두 엔티티가 있습니다. 환자는 병원을 참조하고 있습니다(FK) @Entity@Getter @Setter@Builder @EqualsAndHashCode(of = "id")@AllArgsConstructor @NoArgsConstructorpublic class 병원 { @Id @GeneratedValue private Long id; private String name; . . . . // 환자 수 @Transient private Integer 환자수; } @Entity@Getter @Setter@EqualsAndHashCode(of = "id")@AllArgsConstructor@NoArgsConstructorpublic class 환자 { // 환자 아이디 @Id @GeneratedValue @Column(name = "PAT_ID") private Long id; // 병원 @ManyToOne @JoinColumn(name = "HOSP_ID") private 병원 병원; . . . .} 위와 같이 두 엔티티가 존재하는데 병원 리스트를 검색하면서 각 병원에서 수용중인 환자 수를 같이 하고 불러오고 싶습니다. 이를테면 환자수가 1명이상인 병원목록을 불러온다했을때 이걸 SQL로 작성하면 SELECT h.*, ( SELECT COUNT(*) FROM patient WHERE hosp_id = h.hosp_id ) as '환자수'FROM hospital hWHERE ( SELECT COUNT(*) FROM patient WHERE hosp_id = h.hosp_id ) > 1; (사실 이게 효율적인 SQL인지도 모르겠습니다만, 전 이렇게 보통 씁니다..) 처럼 작성할 수 있을건데요 이럴때 세가지 질문이 있습니다. 1. 병원 엔티티 클래스에 '환자수' 라는게 있는게 일단 맞는지 부터가 문제입니다. 병원 리스트를 조회할때 환자수가 몇명인지 정보도 같이 필요한 페이지도 있고 필요가 없는 페이지도 있습니다. 단, 환자수 정보가 필요할때는 '몇명 이상의 환자가 있는 병원 목록'과 같이 (위 SQL과 같이) where 절에 조건도 같이 붙게 됩니다. 환자수는 DTO로 따로 빼는게 맞을까요? 2. (1번질문에서 따로 빼는게 좋겠다고 하였을때) 환자수를 포함하는 병원DTO를 만든다고 했을때 사실 그 DTO는 병원의 모든 필드가 필요 합니다. 그래서 하려면 아래처럼 병원을 상속받는 식이 되어야 할텐데 이렇게 DTO 클래스가 엔티티 클래스를 상속받아도 문제가 없고, 이렇게 사용하는게 일반적으로 현업에서도 많이 있는 일인가요? public class 병원출력DTO extends 병원 { private Integer 환자수;} 3. 제가 하고자하는 것 ( 엔티티에 있는 모든 정보 + 서브쿼리를 통한 추가정보를 같이 불러오고 서브쿼리를 이용한 WHERE절 ) 이 굉장히 일반적으로 많이 쓰이는 것이라 분명 JPA 프로그래밍으로 충분히 쉽게 하는 방법이 이미 있을것 같은데 지식의 끊이 짧다보니 어떤 방법을 써야하는지 감을 못잡겠습니다. SELECT h.*, ( SELECT COUNT(*) FROM patient WHERE hosp_id = h.hosp_id ) as '환자수'FROM hospital hWHERE ( SELECT COUNT(*) FROM patient WHERE hosp_id = h.hosp_id ) > 1; 이런 것을 하기위해 제가 뭘 찾아보고 공부하면 되는지 키워드나 팁를 알려주실수 있을까요 (QueryDsl을 활용하면 될것 같긴한데.. )
- 미해결스프링 데이터 JPA
커스텀 타입 클래스를 String 타입 처럼 이용해 쿼리하는 방법에 대해 질문하고 싶습니다.
안녕하세요 강사님. 강사님의 강의를 들으면서 처음으로 jpa와 querydsl을 이용하여 프로젝트를 진행하는 중 막히는 부분이 있어 질문드립니다. primitive type의 필드가 아닌, 커스텀 클래스를 타입으로 갖는 엔티티를 만들어 사용중에 있습니다. @Entity public class User{ private Email email; private String name; private String password; } 위와 같은 엔티티가 있을 때, 사용자로부터 넘겨받은 문자열을 가지고 select * from user where email like '%input%' or name like '%input%'; 과 같은 쿼리를 사용하려면 어떻게 해야할까요?? 검색을 통해, QueryDSL의 @QueryType(PropertyType.STRING) 등 또한 사용해봤지만 원하는 기능을 구현해내지 못했습니다.
- 미해결스프링 데이터 JPA
연관관계 매핑 어떤식으로 해야될지 감이 안잡힙니다.
기선님 안녕하십니까. ^^ 기존 mybatis만 사용했다가 기선님의 JPA강의를 보고 감명받아 신규프로젝트에 처음으로 jpa를 도입해보고자 하는데 엔티티 구현 중 막히는 부분이 있어 질문드립니다. 개발중인 시스템의 사용자 구분은 '소방'과 '의사'로 구분되고 추후 더 늘어날수 있는 상황입니다. 사용자(USERS)라는 테이블이 있고 여기엔 계정정보 및 공통적인 데이터들이 있습니다. 소방 사용자의 경우 소방과 관련된 추가 데이터, 의사 사용자의 경우 또 관련된 추가 데이터가 있어야 되는 상황입니다. 그래서 각각 USER_PROFILE_FIRE, USER_PROFILE_DOCTOR 라고 테이블을 만들어서 그곳에 관련 데이터를 담고싶습니다. 사용자(USERS) 테이블에 각각의 프로필에 필요한 모든 컬럼을 넣기에는 양이 너무 많고 확장성도 좋지 않다고 생각해서 입니다. USER_PROFILE_FIRE, USER_PROFILE_DOCTOR 테이블들은 추가 데이터를 담기위한 용도일뿐 각각의 테이블이 별도 조회될 일은 없고 모두 USERS 테이블을 조회하면서 상황에 맞게 같이 불러와지면 됩니다. 이를테면 user.profile로 접근하면 소방일때는 소방프로필, 의사일때는 의사프로필을 접근할수 있으면 좋을것 같은데 이게 JPA로 가능한지 모르겠습니다. public class User { @Id @GeneratedValue private Long id; private String userId; private String password; private String name; private UserType type; // 의사 or 소방 @OneOnOne private ??? profile; // 의사일때는 USER_PROFILE_DOCTOR, 소방일땐 USER_PROFILE_FIRE의 데이터 } 요약하면 위 코드 같은 구현이 가능한지 입니다. 안된다면 사용자 엔티티에 private ProfileHosp profileHosp; // 의사 프로필private ProfileFire profileFire; // 소방 프로필 이런식으로 놓고 모두 연관관계를 맺어야 하는건가요?이러면 사용자 불러올때 두 테이블 모두 조인해서 좋지 않은것같은데.. 상속관계매핑은 아닌것 같고 어떻게 해야될지 감이 안잡힙니다 ㅜㅜ
- 미해결스프링 데이터 JPA
EntityManager 주입시 Annotation관련 질문드립니다.
안녕하세요 강사님. 강의 잘 듣고있습니다! 강의를 보다가 문득 의문이 들어서 질문남깁니다. EntityManager를 @Aurowired로 주입받는 것과 @PersistenceContext로 받았을 때 차이점이 무엇인가요? 둘 다 의존성을 잘 받아오길래 차이점이 궁금합니다!
- 해결됨스프링 데이터 JPA
클래스 기반 프로젝션 사용 관련 질문
안녕하세요. 강의 내용대로 CommentSummary를 클래스 기반 프로젝션으로 그대로 넣어서 했는데 아래와 같은 오류가 나오네요. No converter found capable of converting from type [me.whiteship.demospringdatacommonweb.post.Comment] to type [me.whiteship.demospringdatacommonweb.post.CommentSummary] org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [me.whiteship.demospringdatacommonweb.post.Comment] to type [me.whiteship.demospringdatacommonweb.post.CommentSummary] at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:322) at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:195) (중략) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.base/java.lang.Thread.run(Thread.java:829) CommentRepositoryTest > getComment() FAILED org.springframework.core.convert.ConverterNotFoundException at CommentRepositoryTest.java:38 사실 인터페이스 기반 프로젝션을 사용하면 될 문제이지만, 클래스 기반 프로젝션으로도 정상적으로 동작할거라 봤는데 동작을 안하네요. Spring 버전이 바뀌면서 클래스 기반 프로젝션을 사용할 수 없게 된걸까요?? 바쁘시겠지만 확인해주시면 감사하겠습니다.
- 미해결스프링 데이터 JPA
save 메서드 질문드립니다.
만약에 id 값과 변경할 파라미터를 받아서 update를 하고 싶을 경우는 파라미터에서 넘어오는 id로 Optional<Post> post = repository.findById(id); Post postUpdate = repository.save(post.get()); postUpdate.setTitle(파라미터); 이런 방법을 사용해야하는건가요? //아래 두개의 파라미터는 객채로 받음. id랑 변경할 컬럼을 파라미터로 보내고 Post postUpdate = repository.save(post); 이런식으로 save를 하면 다른 컬럼들은 전부 null로 변경이 되는데 이럴 경우는 제가 첫번째에 코드처럼 작성하여 update를 진행하는게 맞는 방법인지 궁금하여 문의 드립니다.
- 미해결스프링 데이터 JPA
복잡한 통계쿼리도 JPA로 가능한가요?
기선님 쉽게 설명해주시는 강의를 보며 참 많은 도움이 되고있습니다. 실제 제가 만들고 있는 모델관 다르지만 질문하기 위해 예시를든다면 , 쇼핑몰을 예로 어떤 상품들이 있고 그것에 대한 판매가 이뤄진다고 가정할때 엔티티는 상품, 주문, 결제등이 있을수 있겠죠. 이때 '상품들의 월별 판매량'을 통계 내야 한다고 치고 --------------------------------------- 상품명 1월 2월 3월 4월 5월 ... 합 -------------------------------------- 상품A 20 15 4 7 8 104 상품B 1 1 10 2 1 25 ---------------------------------------- 이런식의 통계 쿼리를 짜야 할경우 JPA로 가능한지? QueryDSL 등을 써서라도 가능한지? 감이 안잡힙니다.
- 미해결스프링 데이터 JPA
find 와 get의 차이가 무엇인가요?
안녕하세요. 접두어에 find 와 get이 있는데 차이가 무엇인가요? 둘의 차이구분이 헷깔립니다.
- 미해결스프링 데이터 JPA
실무에서 JPA 할 때 FK로 개발할때 연관관계를 꼭 맺어주어야 하나요?
실무에서 JPA로 개발 할 때 FK로 연관관계를 꼭 맺어주어야 하나요? FK로 연관관계를 맺어주면 추후 DML등에 따라서 수정등이 용이하지 않아서요. JPA 개발하지 않았을 때는 FK로 연관관계를 맺지 않고 개발하였는데 JPA는 FK로 설정하라고 해서 헷갈리네요.