본문 바로가기
728x90

jpa18

[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.. 2023. 3. 7.
[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.. 2022. 12. 2.
[JPA] fetchCount() 대체하기 회사에서 C#을 자바로 전환하는 작업을 하고있다. 약 16만 건의 데이터를 조회하고 페이징 하는 작업 중 화면까지 로딩 되는 시간이 오래 걸렸다.(3초 정도) 데이터가 그렇게 큰 것 같진 않은데 오래걸려서 속도를 단축시켜봤다. 테이블 구조는 예전에 만들어져 있던 것이라 수정할 수 없었고, 같은 테이블이 4번씩 조인되어 있었는데, 이러한 부분을 없애고, 자바쪽에서 데이터를 가공했다. 그 결과 1.3 ~ 1.5초로 단축했는데, 만족스럽지 않았다. 비슷한 경험을 한 회사 동료가 페이징 때문에 total을 계산 하는 쪽이 문제가 될 수도 있다고 해서, 그 부분을 없애니 속도가 0.1초대로 빨라졌다. JPAQuery jpaQuery = query .select( Projections.constructor(DTO... 2022. 10. 25.
[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.. 2022. 8. 24.
[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.. 2022. 8. 2.
[JPA] 스프링 데이터 - 스프링 데이터 JPA 분석 김영한님의 실전! 스프링 데이터 JPA 정리 1. 스프링 데이터 JPA 구현체 분석 - 스프링 데이터 JPA가 제공하는 공통 인터페이스의 구현체 - org.springframework.data.jpa.repository.support.SimpleJpaRepository - @Repository 적용: JPA 예외를 스프링이 추상화한 예외로 변환 - @Transactional 트랜잭션 적용 (1) JPA의 모든 변경은 트랜잭션 안에서 동작 (2) 스프링 데이터 JPA는 변경(등록, 수정, 삭제) 메소드를 트랜잭션 처리 (3) 서비스 계층에서 트랜잭션을 시작하지 않으면 Repository에서 트랜잭션 시작 (4) 서비스 계층에서 트랜잭션을 시작하면 Repository는 해당 트랜잭션을 전파 받아서 사용 (5.. 2022. 8. 1.
[JPA] 스프링 데이터 - 확장 기능 김영한님의 실전! 스프링 데이터 JPA 정리 1. 사용자 정의 리포지토리 구현 - 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성 - 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음 - 다양한 이유로 인터페이스의 메소드를 직접 구현하고 싶다면? (1) JPA 직접 사용(EntityManager) (2) 스프링 JDBC Template 사용 (3) MyBatis 사용 (4) 데이터베이스 커넥션 직접 사용 등등.. (5) Querydsl 사용 - 사용자 정의 인터페이스 public interface MemberRepositoryCustom { List findMemberCustom(); } - 사용자 정의 인터페이스 구현 클래스 .. 2022. 7. 28.
[JPA] 스프링 데이터 - 쿼리 메소드 기능 김영한님의 실전! 스프링 데이터 JPA 정리 1. 메소드 이름으로 쿼리 생성 - 메소드 이름을 분석해서 JPQL 쿼리 생성 - 이름과 나이를 기준으로 회원을 조회하려면? // 순수 JPA public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age > :age") .setParameter("username", username) .setParameter("age", age) .getResultList(); } // 스프링 데이터 JPA public interface MemberReposit.. 2022. 7. 26.
[JPA] 스프링 데이터 - 공통 인터페이스 기능 김영한님의 실전! 스프링 데이터 JPA 정리 1. 공통 인터페이스 설정 - JavaConfig 설정 - 스프링 부트 사용 시 생략 가능 @Configuration @EnableJpaRepositories(basePackages = "jpabook.jpashop.repository") public class AppConfig {} - 스프링 부트 사용 시 @SpringBootApplication 위치를 지정(해당 패키지와 하위 패키지 인식) - 만약 위치가 달라지면 @EnableJpaRepositories 필요 - 스프링 데이터 JPA가 구현 클래스 대신 생성 - org.springframework.data.repository.Repository를 구현한 클래스는 스캔 대상 -> memberReposito.. 2022. 7. 25.
728x90