728x90

jpa 23

[JPA] ID 생성 전략 알아보기

JPA의 ID 생성 전략을 알아보자 !!!  1. 개념JPA에서 ID를 생성하기 위해서는 직접 할당과 자동 할당을 사용할 수 있다.  직접 할당은 @Id어노테이션만을 사용하여 Id값을 직접 할당하는 방식.자동 할당은 @Id와 @GeneratedValue를 함께 사용해서 원하는 키 생성 전략을 선택하는 방식. @GeneratedValue의 stretagy 옵션을 통해 생성 전략을 설정할 수 있는데, 여기에 올 수 있는 값인 GenerationType는 다음과 같다.@Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface GeneratedValue { Generation..

[JPA] JPA의 N+1 문제 알아보기

N+1에 대해서 알아보자  - 지난 번 만났던 N+1 문제[JPA] N+1 해결하기 [JPA] N+1 해결하기N+1은 한 번의 쿼리를 요청했는데 여러 번 쿼리가 요청되는 현상을 말한다.(1+N) Book 도메인에 아래와 같이 연관관계가 있었고, (각각 양방향 연관관계) @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Cdevhooney.tistory.com     - 개념N + 1 문제는 연관 관계가 설정된 엔티티를 조회할 경우에, 조회된 데이터 개수(N)만큼 연관관계의 조회 쿼리가 추가로 발생하는 현상.예를 들어, 블로그 게시글과 댓글이 있는 경우, 게시글을 조회한 후 각 게시글마다 댓글을 조회하기 위해 추가 쿼리가 발생한다면 N + 1 문제가 발생..

[JPA] 엔티티 매니저 알아보기

엔티티 매니저에 대해서 알아보자 !   1. 영속성 컨텍스트엔티티 매니저에 대해 알기 위해선 영속성 컨텍스트에 대해 알아야 한다. 영속성 컨텍스트는 엔티티를 영구 저장하는 환경으로 1차 캐싱, 쓰기 지연, 변경 감지를 통해 영속 로직을 효율적으로 할 수 있게 해준다. 이러한 효율적인 영속 로직 수행을 위해서 엔티티는 영속성 컨텍스트에 관리되어야 한다.     2. 엔티티 매니저영속성 컨텍스트를 도와주는 것이 바로 엔티티 매니저이다. 엔티티 매니저는 엔티티의 상태를 변경하고, 영속성 컨텍스트와 상호작용함으로써 영속 로직을 수행하는 역할을 가지고 있다.  - 역할엔티티는 영속성 컨텍스트와 관련하여 4가지 상태(비영속, 영속, 준영속, 삭제)를 가질 수 있다. 엔티티 매니저는 persist, merge, re..

[JPA] JPA의 ddl-auto 옵션 알아보기

JPA의 ddl-auto 옵션은 각각 어떤 동작을 하고 어떤 상황에서 사용하는 지 알아보자   ddl-auto 옵션은 스프링 부트 애플리케이션에서 Hibernate와 같은 JPA 구현체를 사용할 때 데이터베이스 스키마 관리를 제어하는 설정이다. 이 옵션은 application.properties 또는 application.yml 파일에서 설정할 수 있으며, 다양한 값에 따라 데이터베이스 스키마에 대해 다른 동작을 수행한다. ddl-auto 옵션에는 none, validate, update, create, create-drop 등이 존재한다 . 1. none데이터베이스 스키마와 관련된 어떠한 작업도 수행하지 않는다.데이터베이스 스키마를 수동으로 관리하고 싶을 때 유용하며, 프로덕션 환경에서 주로 사용된다...

[JPA] Spring Data JPA에서 새로운 Entity 판단하는 방법

Spring Data JPA에서 새로운 Entity를 저장할 때 public interface SaveTestRepository extends JpaRepository {} save @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } } Repository의 save 메소드로 저장한다.   저장할 때 Entity가 insert 인지 update 인지 확인하는 로..

[JPA] N+1 해결하기

N+1은 한 번의 쿼리를 요청했는데 여러 번 쿼리가 요청되는 현상을 말한다.(1+N) Book 도메인에 아래와 같이 연관관계가 있었고, (각각 양방향 연관관계) @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "book_id") private Long id; private String bookNm; // 도서명 ... @OneToMany(mappedBy = "book", fetch = FetchType.LAZY, cascade = CascadeType.ALL , orphanRemoval = true) private List archiveList = new ArrayList(); @OneToMany(mappedBy = "book..

[Kotlin] 코틀린 + 스프링부트 + JPA 사용해보기

코틀린 + 스프링부트 + JPA 사용해보기 코틀린과 스프링부트 JPA를 사용해서 기본적인 Create, Read를 만들어보았다. 1. 프로젝트 생성 코틀린, gradle-kotlin 선택하고 java도 11로 선택 후 다음 선택 라이브러리 선택 Thymeleaf는 넣어도되고 빼도 된다. 2. 컨트롤러 @Controller class TodoController { @GetMapping("/") fun home(model: Model): String { model["title"] = "Todo List" return "todo" } } 화면은 Controller에서 만들어준다. - RestController @RestController @RequestMapping("/api/v1") class TodoRes..

[JPA] fetchCount() 대체하기

회사에서 C#을 자바로 전환하는 작업을 하고있다. 약 16만 건의 데이터를 조회하고 페이징 하는 작업 중 화면까지 로딩 되는 시간이 오래 걸렸다.(3초 정도) 데이터가 그렇게 큰 것 같진 않은데 오래걸려서 속도를 단축시켜봤다. 테이블 구조는 예전에 만들어져 있던 것이라 수정할 수 없었고, 같은 테이블이 4번씩 조인되어 있었는데, 이러한 부분을 없애고, 자바쪽에서 데이터를 가공했다. 그 결과 1.3 ~ 1.5초로 단축했는데, 만족스럽지 않았다. 비슷한 경험을 한 회사 동료가 페이징 때문에 total을 계산 하는 쪽이 문제가 될 수도 있다고 해서, 그 부분을 없애니 속도가 0.1초대로 빨라졌다. JPAQuery jpaQuery = query .select( Projections.constructor(DTO...

[JPA] LIKE 정리

SpringData JPA를 사용하여 개발한 기능에서 에러가 발생 - 이유는 select되어야 하는 데이터가 2개 이상이라.. - 쿼리문이 where data like '%조건'을 원했는데 contains를 사용했더니 앞 뒤로 %가 붙었다. - 이참에 정리해놓으려 한다. Contains - 파라미터로 사용되는 data변수에 자동으로 앞 뒤로 '%'가 붙어서 DB조회를 한다. List dataList = findByDataContains(data); List dataList = findByDataContaining(data); List dataList = findByDataIsContaining(data); Like - 직접 파라미터에 '%'를 넣어주어야 한다. List dataList = findByDa..

[JPA] 스프링 데이터 - 나머지 기능들

김영한님의 실전! 스프링 데이터 JPA 정리 1. Specifications(명세) - 도메인 주도 설계(Domain Driven Design)는 SPECIFICATION(명세)라는 개념을 소개 - 스프링 데이터 JPA는 JPA Criteria를 활용해서 이 개념을 사용할 수 있도록 지원 2. 술어(predicate) -> 실무 사용 X - 참 또는 거짓으로 평가 - AND OR 같은 연산자로 조합해서 다양한 검색조건을 쉽게 생성 예) 검색 조건 하나하나 - 스프링 데이터 JPA는 org.springframework.data.jpa.domain.Specification 클래스로 정의 참고 Querydsl 사용! 3. Query By Example - 실무에서 사용하기에 매칭 조건이 너무 단순함. - LE..

728x90