JPA 5

Springboot+JPA 사용중 발생한 N+1 문제 개선

개인프로젝트에서 만든 조회 api에 아주 심각한 성능 문제가 있었다. 바로 조회 한번에 select쿼리가 약 10개~15개가 나가는 것이다...... 문제의 쿼리 덩어리가 날아가는 부분을 찾기 위해 디버깅을 해보니 원인을 파악할 수 있었다. 현재 Member엔티티와 Post엔티티가 다대다여서 MemberPost라는 중간 객체를 두고 필요한 정보를 이 객체를 통해 조회하고있는데, 이를 불러오는 과정에서 문제가 발생하는 것 같았다. 아래는 개선 전 도메인 코드이다. @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String nickname; p..

JPA 2024.03.14

JPA기본편 - 엔티티 매핑 (연관관계 매핑)

데이터 중심 설계의 문제점 기본 매핑 예제를 보면 데이터베이스 테이블의 외래키를 객체에 그대로 가져오며 테이블 설계에 객체를 맞춘 것을 볼 수 있다. @Entity @Table(name = "ORDERS") //order가 예약어로 걸려있는 경우가 있어서 ORDERS로 많이 쓴다. public class Order { @Id @GeneratedValue @Column(name = "ORDER_ID") private Long id; @Column(name = "MEMBER_ID") private Long memberId; //누가 주문했는지. private LocalTime orderDate; @Enumerated(EnumType.STRING) private OrderStatus Status; } 그리고 ..

JPA 2023.04.05

JPA기본편 - 엔티티 매핑 (객체와 테이블, 필드와 컬럼, 기본 키 매핑)

데이터베이스 스키마 자동 생성 jpa에서는 DDL을 애플리케이션 실행 시점에 자동으로 생성해준다. 데이터베이스 방언(dialect)을 이용해서 데이터베이스에 맞는 적절한 DDL을 생성한다. 그리고 이렇게 생성된 DDL은 개발 장비에서만 사용하고 운영서버에서는 사용하지 않는다. (사용하더라도 다듬고 사용) hibernate.hbm2ddl.auto 옵션 create 기존 테이블 삭제 후 다시 생성 (drop + create) create-drop create와 같으나 종료 시점에 테이블 drop update 변경분만 반영(운영 DB에는 사용하면 안됨!) validate 엔티티와 테이블이 정상 매핑되었는지만 확인 none 사용하지 않음. 운영장비에는 절대 create, create-drop, update를 사..

JPA 2023.04.01

JPA기본편 - 영속성 관리

엔티티 매니저 팩토리와 엔티티 매니저 고객의 요청이 올 때마다 엔티티매니저를 생성하고, 이 엔티티 매니저는 데이터 커넥션을 사용해서 db에 접근하게 된다. 영속성 컨텍스트란? 영속성 컨텍스트란, 엔티티를 영구 저장하는 환경이다. 논리적인 개념으로 눈에 보이지는 않고 엔티티 매니저를 통해서 영속성 컨텍스트에 접근한다. //엔티티를 영속성 컨텍스트에 저장한다. EntityManager.persist(entity); 엔티티 생명주기 1. 비영속 (new/transient) = 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 2. 영속 (managed) = 영속성 컨텍스트에 관리되는 상태 3. 준영속 (detached) = 영속성 컨텍스트에 저장되었다가 분리된 상태 4. 삭제 (removed) = 삭제된 상태 ..

JPA 2023.04.01

JPA기본편 - JPA소개와 기본 개념

JPA란? JAVA Persistence API. 객체와 관계형데이터베이스의 차이때문에 생기는 SQL의존적인 개발을 피하기 위해 사용하는 자바 진영의 ORM 기술 표준! 애플리케이션과 JDBC 사이에서 동작하며, 프로그래머가 객체중심으로 데이터베이스에 접근하며 개발할 수 있도록 도와준다. JPA 구동 방식 객체와 테이블을 생성하고 매핑하기 @Entity는 jpa가 관리할 객체를 알려주고, @Id는 데이터베이스의 pk와 매핑된다. //객체생성 @Entity public class Member { @Id private Long id; private String name; } //테이블생성 create table Member ( id bigint not null, name varchar(255), primar..

JPA 2023.03.31