본문 바로가기

개발일지66

JPA 사용 시 쿼리 방식 선택 권장 순서(컬렉션 조회 안할 때) JPA 사용 시 컬렉션 조회 안할 때 쿼리방식 선택 권장 순서 1. 우선 엔티티를 DTO로 변환하는 방법을 선택한다. 2. 필요하면 페치 조인으로 성능을 최적화 한다. 대부분의 성능 이슈가 해결된다. 3. 그래도 안되면 DTO로 직접 조회하는 방법을 사용한다. 4. 최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용한다 (4번 까지 갈일은 거의 없다.) 2번 까지 사용하는 경우와 3번 까지 사용하는 경우를 비교하면 2번 까지 사용하는 경우는 다음처럼 엔티티를 fetch join해서 엔티티 전체 컬럼 값을 가져오는 것이다. // v3 방법 public List findAllWithMemberDelivery() { /* 프록시도 아니고 진짜 객체.. 2022. 8. 3.
@JsonIgnore 사용과 지연로딩 에러 JPA 사용 시 양방향 관계를 조회하면 양방향 참조로 인한 무한 루프가 발생할 수 있다. ex) 다음 API를 호출하면 @GetMapping("/api/v1/simple-orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch()); return all; } 이렇게 Order 의 List를 조회하게 되면 Order 클래스에 있는 Member를 조회하게 되는데 public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = LAZY) // 지연로딩이면 진짜 Member 객체를 안.. 2022. 8. 1.
도메인 모델 패턴과 트랜잭션 스크립트 패턴 도메인 모델 패턴 엔티티(Entity)가 비즈니스 로직을 가지고 객체 지향의 특성을 적극 활용하는 것을 도메인 모델 패턴이라 한다. OrderService 의 메서드를 보면 비즈니스 로직이 대부분 엔티티에 있다. 서비스 계층은 단순히 엔티티에 필요한 요청을 위임하는 역할을 한다. ddd(domain driven design)를 접목시킬 경우 이 방법을 사용한다. 트랜잭션 스크립트 패턴 반대로 엔티티에는 비즈니스 로직이 거의 없고 서비스 계층에서 대부분의 비즈니스 로직을 처리하는 것을 트랜잭션 스크립트 패턴이라고 한다. 즉, 하나의 트랜잭션으로 구성된 로직을 단일 함수 또는 단일 스크립트에서 처리하는 구조를 갖는다. 그래서 패턴의 이름이 트랜잭션 스크립트이다. 도메인 모델 패턴 예시 // import는 생.. 2022. 7. 25.
다익스트라 알고리즘 다익스트라 최단 경로 알고리즘 특정한 노드에서 출발하여 다른 모든 노드로 가는 최단 경로를 계산한다. 다익스트라 최단 경로 알고리즘은 음의 간선이 없을 때 정상적으로 동작한다. 현실 세계의 도로(간선)은 음의 간선으로 표현되지 않는다. 다익스트라 최단 경로 알고리즘은 그리디 알고리즘으로 분류된다. 매 상황에서 가장 비용이 적은 노드를 선택해 임의의 과정을 반복한다. A→ B , B→ C 를 찾고 A→C 를 찾는 길찾기는 다이나믹 프로그래밍의 원리 그러나 다익스트라 알고리즘은 길찾기 문제 중에서도 탐욕적인 원리를 이용한다는 점에서 그리디 알고리즘으로 분류된다. 다익스트라 최단 경로 알고리즘의 과정 출발 노드를 설정한다. 최단 거리 테이블을 초기화한다. 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드.. 2022. 7. 8.
다양한 연관관계 매핑 연관관계 매핑을 다시 한 번 정리해보려고 한다.연관관계 매핑 시 고려할 3가지다중성 결정하기다대일일대다일대일다대다단방향, 양방향 정하기테이블의 경우 : '방향'이라는 개념 없음, 그냥 외래키로 조인하면 두 테이블이 연관관계를 맺음객체의 경우 : 연관관계 매핑을 객체 참조하는 방식으로 하여,참조가 2군데 있어야함 ( A->B, B->A )→ 연관관계의 주인을 만들어야함→ 외래키를 뭐로 할지, 누가 외래키를 관리할 지 정해줘야 함연관관계의 주인 정하기양방향의 경우, 누가 주인( = 외래키를 관리하는 쪽)인지 정해주자 다대일 @ManyToOne• 다대일 단방향 [N:1] : 주인인 '다'쪽에서는 '일'쪽 참조 가능하나, 반대는 조회도 불가능!• 다대일 양방향 [N:1, 1:N] : 서로 참조하면 주인아닌 쪽에.. 2022. 7. 7.
java.io.FileNotFoundException: class path resource [주소] cannot be opened because it does not exist java.io.FileNotFoundException: class path resource [주소] cannot be opened because it does not exist 나는 h2 db를 사용하고 있었는데 application.yml 에서 db관련 설정은 아래 설정이었는데 url: jdbc:h2:./myselectdb;AUTO_SERVER=TRUE driver-class-name: org.h2.Driver username: sa password: test.db.mv 가 잠시 다른 경로에 있었다. 그래서 다시 test.db.mv를 원래 경로에 두고 localhost:포트번호/h2-console 에서 JDBC URL 에 jdbc:h2:~/test 를 입력해주고 다시 test를 활성화 시킨다음 프로그램.. 2022. 7. 3.