스터디/JPA

AttributeConverter를 이용하여 비정형 데이터 저장하기

들어가며 이번 포스트에서는 Spring Data JPA를 사용하고 관계형 데이터베이스를 사용하는 환경에서 AttributeConverter를 이용하여 비정형 데이터를 저장하는 방법과 주의점에 대해 살펴보고자 한다. 관계형 데이터베이스에서 비정형 데이터를 저장할 일이 있는가? 할 수 있지만 화면에 뿌려줘야하는 view 성격의 데이터 혹은 구조의 변경이 잦은 데이터라면 사용하게되는 경우가 생긴다. MySQL과 같은 관계형 데이터 베이스는 각각의 column에 개별 데이터를 저장하는 방식으로 사용된다. 그러다 보니 비정형의 데이터를 저장할 때 하나의 column에 VARCHAR 형식으로 하나의 String 처럼 저장하여 사용해야한다. 사용법 이 예제에서는 편지를 나타내는 Letter 와 @Entity @Tab..

2022.02.23 게시됨

스터디/JPA

Spring Data Jpa Bulk Insert 하기

나는 내가 모르는 기술을 만나면 반갑기도 하지만 엄청 겁을 먹어버리는데 처음 맡은 업무에서 파트장님이 '이 부분을 JPA 를 이용해서 bulk insert 하도록 변경해주시면 됩니다!' 하셨을 때 살짝 식은땀이 났다. '헉 나 할줄 모르는데..' 다행히 업무를 주시기 전에 어떻게 풀어나가야 하는지 팀 기술 세미나를 통해서 가이드를 해주셨고 무사히 마칠 수 있었다! application.yml 설정 application.yml 에 필요한 설정은 다음과 같다. spring: jpa: properties: hibernate: jdbc.batch_size: 100 order_inserts: true order_updates: true datasource: hikari: data-source-properties:..

2021.01.28 게시됨

스터디/JPA

단방향 @OneToMany 관계에서 발생 할 수 있는 문제점

모든 예제코드는 Github에서 확인 할 수 있다. 김영한님의 JPA 책을 공부하면 단방향 @OneToMany를 사용하는 것을 지양하라고 한다. 외래키 관리의 주체가 아닌 쪽에서 연관 관계를 관리 하게 됨으로써 발생하는 문제들이 있기 때문인데 이 부분에 대해 살펴보고자 한다. 준비 설정 실습에는 flyway로 DB 스키마를 정의하고 생성하였고 application.yml에 hibernate의 ddl-auto 설정을 validate로 설정해 두었다. implementation 'org.flywaydb:flyway-core' spring: jpa: hibernate: ddl-auto: validate 모델 모델은 Menu - MenuProduct 관계로 One to Many로 이어져 있다. CREATE TA..

2020.12.06 게시됨

스터디/JPA

fetch join 과 limit 을 같이 쓸 때 주의하자. (firstResult/maxResults specified with collection fetch)

결론부터 말하면 One에서 Many를 fetch 해야하는 경우 limit과 같은 절(Pagination을 위한)을 포함하면 원하는 대로 결과나 나오지 않는다. 예제코드(+ 테스트코드)는 Github에서 확인할 수 있다. LIMIT 그리고 SET_MAX_RESULT JPQL Pagination을 위해서는 MySQL 기준 limit (그리고 offset) 을 사용해야 한다. 그런데 JPA은 DB에 따라서 방언을 바꾸어 Query를 생성하기 때문에 MySQL 방언에 속하는 LIMIT 절을 JPQL에서 직접 사용할 수 없다. 따라서 아래와 같이 쿼리를 작성하면 QuerySyntaxException, IllegalArgumentException 이 발생한다. @Query("SELECT a FROM Article ..

2020.10.08 게시됨

스터디/JPA

오늘의 에러 [ detached entity passed to persist]

발생한 에러 (2019.11.13) org.hibernate.PersistentObjectException: detached entity passed to persist 문제 발생시 도메인 상황 @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Champion { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String riotId; private String key; @Column(unique = true) private String name; @OneToMany(mappedBy = "champion", fetc..

2019.11.14 게시됨

스터디/JPA

[JPA] nullable = false와 @NotNull의 차이점

지금 보시는 이글은 정확하지 않습니다. 곧 수정예정입니다. nullable = false vs. @NotNull 친구들과 스프링 부트를 공부하던 도중 한 친구가 내 코드를 보고 저번에는 @NotNull을 쓰던데 이번에는 nullable = false를 쓴 이유가 무엇이냐고 물어봤다. 둘다 내가 원하는 대로 동작한다고 생각만했다. 와,, 깊이 생각해 본적이 없었다! 그래서 바로 찾아봤다! nullable = false 관련 레퍼런스에서 설명을 보려했는데 JPA레퍼런스가 다 영어라서 어디로 가야할지 모르겠다.. 그래서 코드에서 정의되어있는 부분을 확인해 보았다. /** * (Optional) Whether the database column is nullable. */ boolean nullable() de..

2019.05.06 게시됨

스터디/JPA

[이론] 영속성 컨텍스트

영속성 컨텍스트? JPA를 다루기전에 영속성 컨텍스트에 대한 이해가 필요하다! 그리고 영속성 컨텍스트를 이해하기 위해 엔티티 매니저에 대한 이해가 필요하다! 엔티티 매니저 엔티티 매니저는 엔티티 매니저 팩토리에서 생성된다. 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한 번만 생성되고 공유되는데 그 이유는 팩토리의 생성비용이 크기 때문이다. 이러한 팩토리는 여러 명이 동시에 접근을 해도 무방하다! 엔티티 매니저는 당연히 위에서 언급한 팩토리에서 생성된다. JPA의 기능 대부분을 엔티티 매니저가 제공해준다. 즉, 엔티티 매니저가 데이터베이스의 CRUD작업을 제공한다. 이러한 엔티티 매니저는 팩토리와 달리 여러 명이 하나의 엔티티 매니저에 동시접근을 해선 안된다. 여러 명이 접근하면 동시성 문제가 발생한..

2019.03.29 게시됨