본문 바로가기

기록/인프런6

실전! 스프링 부트와 JPA 활용2 - 컬렉션 조회 최적 API 개발 고급 - 컬렉션 조회 최적화 OneToMany 를 조회하고 최적화 하는 방법 엔티티를 직접 노출하는 잘못된 API V1 /* 엔티티를 직접 노출 이렇게 하면 안 된다는 예시 */ @GetMapping("/api/v1/orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getUserName(); order.getDelivery().getStatus(); order.getOrderItems().stream().forEach(o -> o.getItem().getName()); } return all;.. 2023. 5. 10.
실전! 스프링 부트와 JPA 활용2 - 지연 로딩과 조회 성능 최적화 지금부터 설명하는 내용은 정말 중요합니다. 실무에서 JPA를 사용하려면 100% 이해해야 합니다. 안그러면 엄청난 시간을 날리고 강사를 원망하면서 인생을 허비하게 됩니다. XtoOne(ManyToOne, OneToOne) 관계에서는 성능을 어떻게 최적화 하는가? 양방향 연관관계 주의점양방향 연관관계일 때 한 쪽은 @JsonIgnore 해줘야한다 → 무한루프 발생Fetch.Lazy 이면 class org.hibernate.proxy.pojo.bytebuddy 에서 proxy 객체를 만들어서 대신 넣어놓는다, 문제는 뭐냐면 Jackson 이 bytebuddy 를 변환할 수 없어서 에러가 남Hibernate5Module 을 설치하면 해결 가능함그런데 결과적으로 Entity 를 외부에 노출하는거 자체가 잘못된 .. 2023. 5. 8.
실전! 스프링 부트와 JPA 활용1 - 동적 쿼리 및 변경 감지와 병합 JPA 에서 동적 쿼리를 처리하는 방법 동적 쿼리를 해결하는 방법 .. 분기? 조건절? query string 동적 생성하기 -> 무식한 방법 JPA Criteria -> 권장하는 방법 아님 -> 실무에서 쓸만한 방법이 아님 -> 유지보수성이 0에 가까움 본인 책에도 적어놨지만 JPA Spec 에 있기 때문에 적어놓은거지 쓸만한건 아니다그 걸 바로 해결할 수 있는게 QueryDsl 이라는게 있습니다! 제가 실무할 때는 SpringBoot + Spring Data JAP + QueryDsl 은 꼭 항상 같이 가져갑니다-> 생산성 폭발 변경 감지와 병합(merge) 참고: 정말 중요한 내용이니 꼭! 완벽하게 이해하셔야 합니다. 준영속 엔티티? 영속성 엔티티는 값이 변경되면 JPA 가 알아서 commit 해주.. 2023. 4. 29.
실전! 스프링 부트와 JPA 활용1 - 도메인 분석 설계 연관관계의 주인은 왜 중요한건가 외래키가 있는 곳을 연관관계의 주인으로 정해라. 연관관계의 주인은 단순히 외래 키를 누가 관리하냐의 문제이지, 비즈니스상 우위에 있다고 주인으로 정하면 안된다. 예를 들어서 자동차와 바퀴가 있으면, 일대다 관계에서 항상 다쪽에 외래키가 있으므로 외래키가 있는 반퀴를 연관관계의 주인으로 정하면 된다. FK 꼭 넣어야 되요? 대용량 처리 → FK 안 거는게 낫다(index만 잘 걸면 된다) 돈과 같이 정합성이 엄청 중요하다 → FK 거는게 낫다 실무에서는 @ManyToMany 절대 쓰지마라 @Enumerated(EnumType.STRING) Enum 은 무조건 이걸로, 왜냐면 EnumType.ORDINAL로 하면 중간에 Enum 값 넣을 수 없으므로 엔티티 설계시 주의점 엔티.. 2023. 4. 27.
스프링 핵심 원리 - 고급편 | 쓰레드 로컬 및 디자인 패턴 ThreadLocal traceId 를 파라미터로 넘기지 않고 로그 트레이스를 할 수 있는 방법은 없을까? 필드 파라미터로 traceId를 관리 → 동시성 이슈 발생 자바는 언어차원에서 쓰레드 로컬을 지원하기 위한 ‘java.lang.ThreadLocal’ 클래스를 지원한다. 주의점: 해당 쓰레드가 쓰레드 로컬을 모두 사용하고 나면 ThreadLoca.remove() 를 통해 메모리를 해제 해주어야 한다. 스프링에서는 비용 절감 차원에서 쓰레드풀을 사용하여 쓰레드를 사용하기 때문에 ThreadLocal.remove() 를 해주지 않는다면 이전 쓰레드가 사용했던 데이터를 다음 쓰레드에서 재사용하게 되는 문제점이 발생할 수 있다. (UserA가 로그인 했는데 UserA 가 사용하던 ThreadLocal 에 .. 2023. 3. 15.
스프링 핵심 원리 - 고급편 | 로그 추적 로그 추적기 정상요청, 예외 발생 로그 추적 응답 시간등을 측정 요구사항 모든 PUBLIC 메서드의 호출과 응답 정보를 로그로 출력 애플리케이션의 흐름을 변경하면 안됨 로그를 남긴다고 비지니스 로직의 동작에 영향을 주면 안됨 메서드 호출에 걸린 시간 정상 흐름과 예외 흐름 구분 메서드 호출의 깊이 표현 HTTP 요청을 구분 HTTP 요청 단위로 특정 ID를 남겨서 어떤 HTTP 요청에서 시작된 것인지 명확하게 구분이 가능해야 함 트랜잭션 ID(DB 트랜잭션X), 여기서는 하나의 HTTP 요청을 트랜잭션이라고 함 누가 잘 만들어놓으면 다른 사람들은 잘 쓰겠죠 물론 모니터링 툴을 도입하면 많은 부분이 해결되지만, 지금은 학습이 목적이라는 점을 명심하자 애플리케이션의 모든 로그를 남겨도 되요. 로그 추적기 V.. 2023. 3. 14.