Programming/JPA
-
[JPA] JPA 양방향 연관관계 세팅 및 주의사항Programming/JPA 2021. 8. 28. 19:28
JPA 양방향 연관관계 세팅 및 주의사항 Spring Data JPA와 JPA 양방향 연관관계를 세팅하고 사용 시 주의할 점에 대해서 정리하였다. 밑은 간단한 예제 코드를 준비하였다. User는 다양한 Knowledge을 등록할 수 있다. 정리하면 User는 N개의 Knowledge를 등록할 수 있다고 가정한다. 두 엔티티 간의 관계는 1:N이다. 소스 코드 User.java @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "user_id") private Long id; ..
-
[JPA] 긴 길이의 문자열 저장하기Programming/JPA 2021. 6. 20. 22:59
개요 프로젝트를 진행하던 중 프론트에서 특정한 블로그의 게시글 내용을 markdown 문법을 기반으로 긴 길이의 문자열을 전송하여 백엔드와 연동된 DB인 MySQL에 저장하도록 정하게 되었다. JPA에서 긴 길이의 가변 문자열을 처리하는 방법에 대해 알아 보았고 다양한 테스트를 거쳐 각각의 차이를 확인해보았다. SQL 데이터형 CHAR 고정 사이즈이고 남은 공간은 공백으로 채운다. 삽입되는 데이터가 선언된 길이보다 작다면 공간의 낭비가 우려된다. 주민등록번호와 같이 고정된 길이의 데이터는 CHAR를 사용하는 것이 더욱 좋을 것이라고 생각된다. VARCHAR 가변 길이이다. 데이터를 삽입하면 데이터 값 외에 삽입된 문자열의 길이를 저장한다. 255글자 이하에는 1바이트를 필요로 하고, 그 이상은 2바이트의..
-
[JPA] n + 1 문제와 inner join, outer joinProgramming/JPA 2021. 5. 10. 21:56
개요 프로젝트를 진행하던 도중 말로만 듣던 n + 1 문제와 마주하게 되었다. 이에 대한 해결방안으로 공부한 것은 fetch join과 Spring Data JPA 사용 시 @EntityGraph 애노테이션을 활용하는 방법이다. 하지만 두 가지 방법에는 아주 큰 차이가 있었다. 그 둘의 차이점을 알아보기 위해 예시를 작성하였다. 프로젝트 구조 Person.java package me.hyeonic.join.domain; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; import javax.persistence.Entity;..
-
[JPA] H2의 @GeneratedValue 문제Programming/JPA 2021. 4. 9. 15:47
개요 프로젝트를 진행하던 도중 아직 User 관련된 기능들이 완성되지 않아서 DB에 초기값을 insert하기 위해 웹 서버를 실행하는 시점에 값을 insert 하기로 결정하였다. 필요한 파일과 설정 준비 우선 resources 밑에 값 세팅을 위한 insert를 적어둘 data.sql을 생성하였다. data.sql insert into user (created_date,last_modified_date, email, password, name, provider, user_image_url, entrance_year, graduation_year) values (NOW(), NOW(), 'admin@email.com', '1234', '홍길동', 'KAKAO', '/img', now(), now()); P..
-
[JPA] 왜 JPA의 Entity는 기본 생성자를 가져야 하는가?Programming/JPA 2021. 4. 1. 13:26
왜 JPA의 Entity는 기본 생성자를 가져야 하는가? 정확히 이야기하면 Entity는 반드시 파라미터가 없는 생성자가 있어야 하고, 이것은 public 또는 protected 이어야 한다. 이러한 궁금증을 가지게 된 이유는 setter의 제한을 위해 정적 팩토리 메소드의 도입에서 시작되었다. setter의 제한 Entity의 모든 필드에 public setter 메소드를 생성하는 것은 객체의 값의 변경을 열어두기 때문에 일관성을 보장할 수 없다. 또한 단순히 setter 이기 때문에 그 의도를 쉽게 파악할 수 없다. setter 메소드를 제공하는 것 보단 확실한 비즈니스가 드러나는 메소드를 제공하는 것이 더욱 바람직하다. 간단한 예시를 위하여 학생을 나타내는 Student와 학생의 소속을 나타내는 D..