작성
·
2.9K
·
수정됨
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
안녕하세요
JPA, QueryDsl 조합으로 upsert를 대신 할 수 있을지가 궁금하여 질문드립니다
[우아콘2020] QueryDSL 편에서 bulk insert는 자제하라는 말씀이 있었습니다
하여, 실무에서는 upsert를 대신해서 batch에서 대용량 데이터를 insert, update 할 때 어떤 방식을 사용하시는지도 궁금합니다!
답변 2
1
안녕하세요.냠냠님
upsert가 모든 DB가 지원하는 기능이 아니기 때문에 JPA에서는 지원하지 않는데요.
upsert가 꼭 필요한 상황이라면 네이티브 쿼리를 작성하거나 JdbcTemplate등을 사용하시는 것을 권장드립니다.
추가로 하이버네이트 6.2에서 SQL MERGE를 지원한다는 이야기가 있는데요.
https://in.relation.to/2023/03/30/orm-62-final/
이 부분은 저도 시도해보지는 않아서 한번 참고해보시면 좋을 것 같아요.
감사합니다.
0
안녕하세요, 인프런 AI 인턴이에요.
JPA와 QueryDsl을 사용하여 upsert 기능을 구현하는 방법이 있어요. upsert는 데이터를 추가하거나 업데이트할 때, 기존 데이터가 존재하는 경우는 업데이트하고, 존재하지 않는 경우는 추가하는 작업을 말해요.
JPA에서는 EntityManager
의 merge()
메소드를 사용하여 upsert를 구현할 수 있어요. merge()
메소드는 Entity를 저장하거나 업데이트할 때 사용하는 메소드인데요. 저장하고자 하는 데이터가 이미 DB에 존재하는 경우, 해당 데이터를 업데이트하고 그렇지 않으면 새로운 데이터를 추가해주는 역할을 해요.
QueryDsl에서는 merge()
메소드 대신 saveOrUpdate()
라는 메소드를 사용해서 upsert 기능을 구현할 수 있어요. saveOrUpdate()
메소드는 데이터베이스에 존재하는지 여부를 확인하고, 존재하는 경우는 업데이트하고 존재하지 않는 경우는 추가하는 역할을 수행해요.
실무에서는 대용량의 데이터를 처리할 때 batch 작업을 사용하기도 해요. batch 작업에서 upsert 기능을 사용할 때는 일반적으로 JPA의 EntityManager
나 QueryDsl의 BatchExecutor
를 사용하여 동작하는 방식을 많이 사용하고 있어요. 하지만 성능과 데이터베이스의 특성에 따라 다른 방식을 사용할 수도 있기 때문에, 상황에 맞게 적절한 방식을 선택해야 합니다.
이렇게 JPA와 QueryDsl을 조합하여 upsert 기능을 구현할 수 있고, 실무에서는 대용량 데이터를 처리할 때 batch 작업과 함께 사용되는 경우도 많아요. 특정 프로젝트나 데이터베이스 환경에 따라 다르기 때문에, 상세한 내용은 해당 프로젝트에 맞는 방식을 고려해야 합니다.
더 자세한 내용을 알고 싶다면 관련 문서나 자료를 참고하시면 도움이 될 것 같아요. 추가로 궁금한 점이 있다면 언제든지 물어보세요!