분류 전체보기
-
Querydsl (3) - 순수 JPA와 QuerydslWeb/QueryDSL 2024. 1. 24. 15:22
- 순수 JPA 리포지토리와 Querydsl은 같은 Repository에 손쉽게 사용 가능하다. @Repository public class MemberJpaRepository { private final EntityManager em; private final JPAQueryFactory queryFactory; public MemberJpaRepository(EntityManager em) { this.em = em; this.queryFactory = new JPAQueryFactory(em); } public void save(Member member) { em.persist(member); } public Optional findById(Long id) { Member findMember = e..
-
Querydsl (1) - 기본 문법Web/QueryDSL 2024. 1. 24. 15:08
1. QueryDSL 기본 사용법 public void startQuerydsl() { //member1을 찾아라. JPAQueryFactory queryFactory = new JPAQueryFactory(em); QMember m = new QMember("m"); Member findMember = queryFactory .select(m) .from(m) .where(m.username.eq("member1"))//파라미터 바인딩 처리 .fetchOne(); assertThat(findMember.getUsername()).isEqualTo("member1"); } - QMember는 querydsl 라이브러리 추가하고, 엔티티를 한번 빌드하면 생긴다. (별칭은 jpql에서 사용할 별칭 -> 내부..
-
JPA(2) - OSIVWeb/JPA 2024. 1. 22. 12:52
1. Open Session In View (Open EntityManager in View) - 영속성 컨텍스트의 범위를 설정하는 옵션이다. - 기본으로 view까지 session이 유지된다. (DB세션 의미) - 트랜잭션 시작시 영속성 컨텍스트가 DB 커넥션을 가지고오는데, OSIV가 켜져있으면, 트랜잭션 종료후에도 커넥션을 반환하지 않는다 (레이지 로딩 때문이다.) 응답이 나갈때 까지 커넥션을 유지한다. - 이 덕분에 view나 컨트롤러에서 지연 로딩이 가능했던 것이다. - 이 전략은 DB커넥션을 너무 많이 사용하기때문에 장애로 이어질 수 있다. - OSIV를 끄면 트랜잭션 종료시 영속성 컨텍스트를 닫고, DB커넥션을 반환한다. 따라서 커넥션 리소스 낭비가 없다. - OSIV를 끄면 모든 지연로딩은..
-
JPA(2) - 컬렉션 조회 최적화카테고리 없음 2024. 1. 22. 12:41
- OneToMany 관계에서 조회를 최적화 하는 방법을 생각해보자 - 앞에서는 Order 조회시 OrderItem컬렉션은 그냥 무시하고 DTO만들어서 리턴했음 (처음부터 지연로딩으로 두고 초기화 안함) 1. 엔티티 직접 노출 /** * V1. 엔티티 직접 노출 * - Hibernate5Module 모듈 등록, LAZY=null 처리 * - 양방향 관계 문제 발생 -> @JsonIgnore */ @GetMapping("/api/v1/orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName(); //..
-
JPA(2) - 지연 로딩과 조회 성능 최적화카테고리 없음 2024. 1. 22. 11:31
1. 엔티티 직접 노출 private final OrderRepository orderRepository; /** * V1. 엔티티 직접 노출 * - Hibernate5Module 모듈 등록, LAZY=null 처리 * - 양방향 관계 문제 발생 -> @JsonIgnore */ @GetMapping("/api/v1/simple-orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName(); //Lazy 강제 초기화 order.getDelivery().getAddress(); //Lazy 강제 초기환 ..
-
JPA (2) - API 개발 시 기본으로 지켜야 할 사항Web/JPA 2024. 1. 22. 10:47
1. 사용자의 요청과 응답에 대한 요구사항에 맞는 적절한 DTO를 만들어라! @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { Long id = memberService.join(member); return new CreateMemberResponse(id); } @PostMapping("/api/v2/members") public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) { Member member = new Member(); member.setName..
-
연결리스트자료구조와 알고리즘/문제풀기 2024. 1. 15. 18:58
1. 팰린드롬 연결 리스트 1. 내풀이(13ms) 스택 이용한 풀이 public boolean isPalindrome(ListNode head) { ListNode cur = head; Stack st = new Stack(); st.push(cur.val); while(cur.next != null){ cur = cur.next; st.push(cur.val); } while(!st.isEmpty()){ int stVal = st.pop(); if(stVal != head.val){ return false; } head = head.next; } return true; } 2. 데크를 이용한 풀이 (12ms) public boolean isPalindrome(ListNode head) { Deque d..
-
JPA (11) - 다형성 쿼리,엔티티 직접 사용,정적쿼리,벌크연산Web/JPA 2024. 1. 12. 14:40
1. 다형성 쿼리 - TYPE > 조회 대상을 특정 자식으로 한정 (ex Item 중에 Book, Movie를 조회하라) select i from Item i where type(i) IN (Book, Movie) > 자바의 타입 캐스팅과 유사하다. > 상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 때 사용 (FROM, WHERE, SELECT에서 사용) select i from Item i where treat(i as Book).author = 'kim' 2. 엔티티 직접 사용 > JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티 기본 키 값을 사용한다. select count(m.id) from Member m //엔티티 아이디를 사용 select count(m) from Member..