JPA47 [쿠링] Spring JDBC를 사용한 Batch Insert 구현과 고민 예전부터 시간 나면 해결하고 싶었던 문제 중 하나인 Batch(Bulk) insert에 대한 구현을 하며 이번글을 남기게 되었다. 기존에 주로 사용해 왔던 JPA의 한계로 인하여 이러한 결정을 하게 되었는데, 어떤 문제점과 고민이 있었는지 이번 글을 통하여 공유해 볼까? 한다. 고민 1 : JPA가 무엇인가? 이것부터 생각해 보기 기존에 내가 사용하던 ORM 기술인 JPA는 ORM의 대표 기술이다. 그럼 ORM은 어떤 철학을 갖고 설계된 것일까? 이를 wiki에서 검색해 보았다! ORM (Object–relational mapping) Object–relational mapping (ORM, O/RM, and O/R mapping tool) in computer science is a programmin.. BackEnd/쿠링 2024. 1. 14. [JPA] QueryDsl에서 Groupy By적용 후 가장 큰 원소 가져오기 우선 이번 글은 제가 쿼리를 잘 못짠 부분도 있기 때문에, 다른 방식도 있을 수 있습니다. 다만 구글에 검색시 별다른 방법이 보이지 않아 글을 작성해 봅니다. 1. 문제가 된 상황 프로젝트를 진행하다 보니 다음과 같은 상황이 있었습니다. User와 Post는 중간테이블인 Scrap을 두고 N:M 관계를 형성하고 있습니다. Post와 PostPhoto는 1: N의 관계로, 하나의 Post당 여러 PostPhoto가 있는 상황이였습니다. 자 여기서 의문점! 1) 사용자가 다음과 같이 원하는 피드에서 저장하기(스크랩) 버튼을 누른다. 2) scrap 엔티티로 저장된다. 3) 이후 다음과 같이 프로필 페이지에서 "관심목록"을 누를경우, 스크랩된 하나의 피드당 하나의 대표 사진만 보여줘야 한다. 이를 어떻게 Qu.. BackEnd/JPA 2022. 11. 23. [JPA] Soft Delete 자동 처리하기 이번 프로젝트를 진행하면서 1급 컬랙션을 통한 Soft Delete를 처리하면서 기록을 남겨본다! 1. Soft Delete 란? 우선 데이터를 삭제하는 방식에는 hard delete, soft delete 2가지 있습니다. hard delete는 delete 쿼리를 날려서 데이터베이스에서 실제로 삭제하는 방식이고, soft delete는 실제로 데이터베이스에서 데이터를 삭제하는 것이 아니라, 테이블에 deleted와 같은 필드를 추가해주고, update 쿼리를 통해서 deleted 값을 변경해주는 방식입니다. soft delete를 한 경우, 조회시 sofe delete 처리된 값이 함께 반환되면 안되기 때문에 "where deleted = false"같은 조건을 추가하여 sofe delete되지 않은.. BackEnd/JPA 2022. 11. 9. [JPA] Open Session In View 더 깊게 사실 예전에 이미 OSIV에 대한 글을 작성한 적이 있다. https://blogshine.tistory.com/379 HTML 삽입 미리보기할 수 없" data-og-host="blogshine.tistory.com" data-og-source-url="https://blogshine.tistory.com/379" data-og-url="https://blogshine.tistory.com/379" data-og-image="https://scrap.kakaocdn.net/dn/lMCFs/hyPLg4W1Gs/Muf3gnc1ikTWyz5K0u0qDk/img.png?width=622&height=526&face=0_0_622_526,https://scrap.kakaocdn.net/dn/gux9D/hyPJW.. BackEnd/JPA 2022. 9. 11. [JPA] Lazy 로딩으로 인한 JSON 반환 오류 (No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer) 1. 문제의 상황 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 Issue 와 Comment 는 1:N의 관계이다. 따라서 Comment의 코드를 보면 다음과 같이 Lazy 로딩이 걸려있다. ▶ Comment @Getter @Entity @EqualsAndHashCode(of = "id") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Comment extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "comment_id") private Long id; @ManyToOne(fetch .. BackEnd/JPA 2022. 9. 7. [JPA] JPA metamodel must not be empty! 1. 문제 상황 테스트코드를 작성하던 도중, Controller계층에 @WebMvcTest Slice Test를 하나 추가했더니, JPA metamodel must not be empty! 에러가 발생했다. TestDouble에 필요한 부분들은 전부 Stub을 만들어 줬다고 생각되는데, 어디서 에러가 발생하는지 찾기 어려웠다. 알고보니 객체를 생성하고, 영속화 할때 자동으로 생성시각이 기록되도록 Auditing 기능을 사용하고 있었는데, 이게 문제였다. 2. 원인 우선 나의 메인 메서드라 할 수 있는 IssueTrackerApplicaion.java는 다음과 같다. @EnableJpaAuditing @SpringBootApplication public class IssueTrackerApplication.. BackEnd/JPA 2022. 7. 28. [JPA] 일급 컬렉션 1. 일급 컬렉션? 일급 컬렉션은 Collection객체를 감싸면서 다른 필드가 없는 클래스를 의미합니다. 특정 클래스에 List나 Set 같은 Collection 필드로 가지고 있을 때, 이들을 하나의 클래스로 만들어서 사용할 수 있습니다! 일급 컬렉션이라는 단어는 소트웍스 엔소롤지의 객체지향 생활체조 파트에서 언급이 되었습니다. 규칙 8: 일급 콜렉션 사용 이 규칙의 적용은 간단하다. 컬렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 한다. 각 콜렉션은 그 자체로 포장돼 있으므로 이제 컬렉션과 관련된 동작은 근거지가 마련된 셈이다. 필터가 이 새 클래스의 일부가 됨을 알 수 있다. 필터는 또한 스스로 함수 객체가 될 수 있다. 또한 새 클래스는 두 그룹을 같이 묶는다든가 그룹의 각 원소에 규칙.. BackEnd/JPA 2022. 7. 17. [JPA] SpringBoot 2.5 이후부터 data.sql 초기화 시점 이번 프로젝트를 진행하던 도중 data.sql 을 통한 초기화 데이터 삽입이 정상적으로 되지 않는 문제가 있었습니다. 이를 해결하기 위한 설정이 필요했는데, 왜 이런 문제가 발생했는지 알아보시죠! 소제목 입력 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 우선 SpringBoot 2.4 이하의 버전에서는 data.sql이 정상적으로 초기화 된다고 합니다. Spring Boot 버전 2.4 -> 2.5 업데이트 사항중에 일부분 때문에 우리는 따로 추가설정을 해줘야 합니다. 원래 설정은 다음과 같았습니다. spring: jpa: hibernate: ddl-auto: create properties: hibernate: format_sql: true database: mysq.. BackEnd/JPA 2022. 6. 6. [JPA] Spring Data JPA가 제공하는 QueryDsl 기능 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 1. 인터페이스 지원 - QuerydslPredicateExecutor " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 여기서 소개하는 기능은 제약이 커서 복잡한 실무 환경에서 사용하기에는 많이 부족하다. 그래도 Spring Data 에서 제공하는 기능이므로 간단히 소개하고, 왜 부족한지 설명하겠다. 1-1) Interface 지원 - QuerydslPredicateExecutor 기존의 repository에 다음과 같이 QuerydslPredicateExecutor를 추가로 상속하게 되었다. public interface MemberRepository.. BackEnd/JPA 2022. 5. 16. [JPA] 실무 활용 - Spring Data JPA와 Querydsl 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 이번 시간에는 이전에 순수 JPA로 만들었던 repository들을 Spring Data JPA를 통해 만들어 보자. 1. Spring Data JPA 리포지토리로 변경 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 ▶ Spring Data JPA - MemberRepository 코드 작성 public interface MemberRepository extends JpaRepository { List findByUsername(String username); } 기존의 순수 JPA를 활용한 MemberJpaRepository 와 비교해볼때, 상당히 .. BackEnd/JPA 2022. 5. 15. [JPA] 실무 활용 - 순수 JPA와 Querydsl 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 이번 글은 다음과 같은 순서로 이어질 것 이다. 순수 JPA 리포지토리와 Querydsl 동적쿼리 Builder 적용 동적쿼리 Where 적용 조회 API 컨트롤러 개발 1. 순수 JPA 리포지토리와 Querydsl " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 우선 순수 JPA를 기반으로 repository를 하나 만들자. Repository public class MemberJpaRepository { private final EntityManager em; private final JPAQueryFactory jpaQueryFactory; pub.. BackEnd/JPA 2022. 5. 15. [JPA] QueryDSL 중급문법 - 2 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 4. 동적 쿼리 - BooleanBuilder 사용 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 동적 쿼리를 해결하는 방식에는 2가지 방식이 존제한다. BooleanBuilder Where 다중 파라미터 사용 각각이 다 장단점이 있는 방식이다. 이에 대하여 알아보자. ▶ BooleanBuilder 를 사용하는 방법 @Test public void dynamic_query_boolean_builder_test() { String usernameParam = "member1"; Integer ageParam = 10; List result = searc.. BackEnd/JPA 2022. 5. 14. 이전 1 2 3 4 다음