JPA, 느림에 대하여

## 프로젝트에서 철수했습니다
- 7개월간의 긴 여정을 마치고 프로젝트에서 철수했습니다. 
- springboot와 vuejs
- 프로젝트 내내 JPA 속도 이슈가 발목을 잡더군요. (대용량 데이터 처리)
### JDBC를 사용해도 서버는 뻗는다
- Mybatis도 없고 Jpa도 없던 시절에도 서버는 뻗었다.
- conn.close() <- 기억나시는 분들 ✋
- 끝없는 반복코드 : try~catch
## JPA는 정말 느릴까
- 내가 만들 애플리케이션이 어느 환경에서 실행되는지 신경쓰지 않는 개발자들
- 클라우드로 오면서 서버사양(cpu, memory)은 낮아지고.
- ORM(Hibernate)은 원래 느렸어. 가 아니라 메모리를 많이 사용한다
- (제 생각에는)데이터베이스가 해야할 일을 Java에서 하려니까 문제가 발생한다. 
- JPA를 쓸 때,
	- Entity class에서 관계를 맺지 말자.
	- parallelStrem()을 (조심해서 잘)사용하면 save()를 써도 saveAll()만큼 속도는 나온다.
```java
List<Posts> posts = repository.findAll();
posts.parallelStream().forEach(post -> repository.save(post));
```
## QueryDSL
- 설정형 ORM : MyBatis의 xml설정은 정말 싫다(개인의견)
- queryDsl-jpa을 사용하면서 한계에 부딪혔던 사례들
	- groupby 를 사용하면 fetchCount를 사용하지 못한다.(일부 구문에서 subquery 미지원. jpa)
	- 쿼리 디버깅을 위해 jpa query를 다시 sql로 변환하는 매우 불편한 상황 발생
	- 단순 쿼리는 queryDsl로 어느 정도 해결되지만 sql에 비해 많이 부족함
- jdbc와 jpa간의 적절한 조합 필요?
	- query : jdbc
	- command : jpa
## 결국 어떻게 해결했나
- 테스트 서버에서 콘솔 로그 안찍히게 처리 <- 이거 기본인데...
- 코드리뷰 후 일부 문제될만한 부분(save)은 jdbc template로 변경 <- 이건 좀...
- 메모리 증설. 끝 <- 당연한거 아냐?
- (이건 그냥 최신 동향) springboot 3.2부터는 jdbcClient라는 것이 생겼네?

댓글

이 블로그의 인기 게시물

Session 대신 JWT를 사용하는 이유

VSCode에서의 VIM 단축키와 키보드 구매 가이드

우분투에서 테스트링크(testlink)와 맨티스(mantis)로 테스팅 서버 구성하기