JPA

· Spring batch
jdbc로 다중 데이터베이스를 설정하여 JPA에서 사용하는 방법을 소개합니다.spring boot 3.0부터는 @EnableBatchProcessing을 권장하지 않습니다. 이걸 쓰면 자동으로 등록해주던 빈들을 수동으로 설정해야합니다.이 글에서는 @EnableBatchProcessing를 사용하지 않습니다.이말고도 다른 방법이 얼마든지 있으니 참고만 해주시기 바랍니다.IDEA: intellij사용한 데이터베이스: postgreSQLspring batch 5.0.5 1. spring batch 메타데이터 데이터베이스 만들기데이터베이스 종류별로 spring batch schema를 만드는 sql이 있습니다.org.springframework.boot:spring-boot-starter-batch 의존성을 추..
· Springboot
모든 GrammarBook에서 각 book마다 연관된 Grammar 개수를 조회하는 기능이 있습니다. 해당 코드는 다음과 같습니다.@Transactional(readOnly = true)public List getGrammarNumOfAllGrammarBooks() { List responseDtos = new ArrayList(); for (GrammarBook grammarBook : this.grammarBookRepository.findAll()) { responseDtos.add( GrammarNumOfGrammarBookDto.builder() .id(grammarBook.getId()) .name(grammarBook.getN..
· Springboot
“자바 ORM 표준 JPA 프로그래밍” 책으로 N+1에 대해 공부했습니다. 이후 기존 조회 로직들을 다시 테스트해보니 N+1 문제가 발생하는게 생각보다 많았습니다. 그래서 이것들을 모두 해결했고, 시리즈로 엮었습니다. 다음 코드는 Grammar 1개를 조회할때 연관된 GrammarBook과 GrammarExample까지 조회하는 service 메서드입니다. public GrammarDto getGrammar(Long id) { Grammar grammar = getGrammarById(id); return GrammarDto.builder() .id(id) .sentence(grammar.getSentence()) .grammarBookName(grammar.getGrammarBook().getName(..
· Springboot
오류 발견 아래 코드를 테스트하던 중 LazyInitializationException이 발생했습니다. public GrammarBookResponseDto getUserWrongGrammarBook(String userName, String grammarBookName) { Long userId = getUserIdByUserName(userName); List userGrammarStatuses = this.userGrammarStatusRepository.findByUserId(userId); Long grammarBookId = this.grammarBookService.getGrammarBookIdByGrammarBookName(grammarBookName); List grammarDtos = ..
· Springboot
문제 상황현재 Grammar와 GrammarBook를 N:1 양방향 연관관계로 설정한 상태입니다. 그래서 GrammarBook에 다음과 같이 mappedBy 설정으로 GrammarBook은 연관관계의 주인이 아님을 명시해뒀습니다.@OneToMany(mappedBy = "grammarBook", cascade = CascadeType.ALL) @OrderColumn(name = "id") private List grammars = new ArrayList();그리고 GrammarBook엔티티 객체에서 grammars로 size()를 호출하니 수많은 Grammar엔티티 값과 함께 수많은 null값이 채워져 반환되었습니다. [null, null, null, null, null, null, null, null,..
· Springboot
UserGrammarStatus와 SiteUser는 N : 1 단방향 연관 관계를 맺고 있습니다.UserGrammarStatus 엔티티에서 referencedColumnName = "user_name"를 지정해주어 SiteUser 테이블의 userName 컬럼을 참조하게 했습니다.//UserGrammarStatus ... @ManyToOne @JoinColumn(name = "user_name", referencedColumnName = "user_name") private SiteUser user; ...그리고 userName값으로 UserGrammarStatus를 조회하는 JPQL을 직접 작성했습니다.//UserGrammarStatusRepository ... @Query("select ugs fro..
· Springboot
문제 상황 GrammarBook 엔티티 한 개를 조회할때 Grammar를 fetch join하고 Grammar안에서 GrammarExample도 fetch join하는 한 방 쿼리를 JPQL로 작성했습니다. //GrammarBookRepository.java @Query("select gb from GrammarBook gb join fetch gb.grammars g join fetch g.examples where gb.id = :id") Optional findGrammarBookById(@Param("id") Long id); 위 JPQL을 사용한 서비스 메서드를 테스트했더니 org.hibernate.loader.MultipleBagFetchException: cannot simultaneousl..
siwoli
'JPA' 태그의 글 목록