전체 글

전체 글

    실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 - 섹션4. API 개발 고급 - 컬렉션 조회 최적화

    이제 일대다 조회(컬렉션 조회)해서 데이터 막 복제되고 하는곳에 성능 최적화를 해보자. OneToMany를 반환할거다 이렇게 엔티티를 직접 반환했지만 이것도 dto로 바꿀꺼다. 근데 안의 내용들까지 dto로 바꾸는게 쉽게 안된다. 그래서 따로 섹션 뺀거다. 일단 겉을 dto로 했을 때 orderItems가 null이 나왔는데 지연 로딩이라 안불러와서 그렇다. 하나하나 불러와주는것도 넣어주고 다시 해보면 잘 나온다. 근데 문제는 사실 저것도 엔티티 그대로인 것이다. 즉, 겉은 dto로 바꿨는데 안은 엔티티를 반환하고 있는것. 안에도 dto로 변환해보자. 이제 아까 했던 것처럼 fetch join을 사용해서 쿼리 최적화를 해보자. 근데 이렇게만 했을 때 일대다일때 여러 번 언급했던 데이터 증식 문제가 나온다..

    실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 - 섹션3. API 개발 고급 - 지연 로딩과 조회 성능 최적화

    주문 + 배송정보 + 회원을 조회하는 API를 만들자 지연 로딩 때문에 발생하는 성능 문제를 단계적으로 해결해보자. > 참고: 지금부터 설명하는 내용은 정말 중요합니다. 실무에서 JPA를 사용하려면 100% 이해해야 합니다. > 안그러면 엄청난 시간을 날리고 강사를 원망하면서 인생을 허비하게 됩니다. 일단 dto를 사용하지 않고 엔티티 자체를 반환하는 방식으로 할 때 이런 문제들이 생기므로 이렇게 쓰지 말라고 하는거다. 그래서 편하게 보면 됨. public List findAllByString(OrderSearch orderSearch) { String jpql = "select o from Order o join o.member m"; boolean isFirstCondition = true; //주문..

    실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 - 섹션2. API 개발 고급 - 준비

    준비 섹션을 따로 만들어놨는데 앞으로 진행할 섹션들에 대해 설명한다. 거의 대부분의 문제는 여기 안에서 해결된다. API 개발 고급 - 조회용 샘플 데이터 입력 API 개발 고급 - 지연 로딩과 조회 성능 최적화 API 개발 고급 - 컬렉션 조회 최적화 API 개발 고급 - 페이징과 한계 돌파 API 개발 고급 - OSIV와 성능 최적화 조회용 샘플 데이터 입력은 보통 수정, 삭제 같은 경우는 잘 안하고 한 줄만 하는거라 에러가 거의 안나고 대부분 조회를 하니 조회 쪽에서 문제가 알이남. 그래서 어떻게 할건지 지연 로딩과 조회 성능 최적화는 lazy 사용하고 뭐 하는듯 컬렉션 조회 최적화는 이제 일대다 컬렉션을 불러올 때 복사되서 뻥튀기 되는 문제들 어떻게 대처할지 페이징과 한계 돌파도 위와 비슷하다. ..

    실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 - 섹션1. API 개발 기본

    섹션 0 강의 소개 내용 할거다. 섹션1 절대로 엔티티를 입력으로 받거나 출력으로 반환하면 안된다. 무조건 dto를 따로 만들어서 사용하기. 이유는 각 요청에 따라 요청 안의 body json 내용도 달라질텐데 이것 때문에 엔티티 자체를 계속 수정할 수도 없고 애초에 엔티티가 이런 곳에 의존성을 가지고 있으면 안된다. 또 엔티티의 내용 그대로를 반환하기 대문에 보안 문제도 있다. 이건 나중에 볼거임. 주어지지 않은 정보는 null로써 채워진다. 수정도 비슷하게 하는데 이 수정 기능에도 일일이 dto를 만들어 사용한다. 기억해야 할건 이 엔티티의 변화를 엔티티 메니저한테 맡기면 쉬워진다. 즉, 영속성 컨텍스트 이용하라고. 영속성 컨텍스트로 ujpdate가 알아서 나간다. response로 응답해주는 부분인..

    자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 11. 객객체지향 쿼리 언어2 - 중급 문법 (JPQL)

    말이 경로표현식이지 어렵게 용어를 정의해서 설명하는데 그냥 점(.) 찍고 원하는거 불러오는거다. 근데 그 불러오는게 단순 필드값인지, 엔티티인지, 컬렉션인지에 따라 내부 동작 방식이 다르기 때문에 각각 구분해서 알아야 해서 이름 붙이고 구분 하는 거다. 여기서 경로라고 표현한 이유가 나오는데 자바 객체이기 때문에 불러오는 걸 타고타고 쭉 갈수 있다는 것. db는 이걸 구현하기 위해 join을 하고 안에서 난리가 난다. 그래서 최적화 할 때 알아두어야된다. 난 단순히 자바 객체 안에 있는걸 불러오려고 했을 뿐인데 안에선 나도 모르게 join이 실행된다. 그래서 묵시적 join인거고.. 그래서 잘 알고 써야 한다. 사실 묵시적 join이 나오도록 코드 짜지 말자. 진짜 나중에 sql문 튜닝할 때 힘들어진다...

    자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 10. 객체지향 쿼리 언어1 - 기본 문법 (JPQL)

    다양하게 있는데 진짜 왠만하면 JPQL, QueryDSL로 대부분 해결되고 진짜 안되는게 있을 땐 SpringJdbcTemplate로 해결한다. 거의 무조건 QueryDSL 사용을 추천. jpql은 쌩 sql과 매우 유사하며 대상이 테이블 객체가 아니라 jpa 객체라는데에 있다. 위 jpql의 경우 쌩 string을 넣기 때문에 동적 쿼리가 힘듬. 그래서 criteria라고 공식으로 지원하는 스펙이 있고, 자바 코드로 짜기 때문에 문법 오류 잡아주고 동적쿼리 하기 쉽고 하다는 장점이 있지만 진짜 뒤지도록 복잡하다.. 걍 안쓴다. querydsl은 진짜 직관적이고 정말 좋다. 자바코드라 문법도 잡아주고 동적도 정말 쉽고 왠만한건 다 이걸로 해결된다. 그냥 이거 써라. jpal말고 진짜 쌩 sql도 날릴 수..

    자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 9. 값 타입

    기본값이랑 임베디드 값 알아볼건데, jpa하며 엔티티가 나오고 엔티티를 엔티티 타입이라고 설정해놓아서 순수 자바 객체 값들을 일반값이라고 정의한거다. 자바에서 순수 int, string같은 타입은 값에 클래스 주소값을 넣는게 아니라 막 0x00001010 이런걸 넣어서 실제 값을 저장한다는걸 알고있을거다. 근데 이제 Integer는 클래스라 주소값 &형식으로 저장할텐데 다른 변수도 이 주소값을 공유하도록 정의하면 이 클래스 안에있는 값이 바뀔경우 의도하지 않았는데 바뀌는 사이드 이펙트가 될거다. 하지만 이런 경우는 자바가 Integer같은 클래스를 만들 때 ㅅset으로 설정 자체가 불가능하게 막아놓았기 때문에 괜찮다. 즉 순수 자바 타입들을 사용하면 사이드 이펙트가 생길 일이 없다. 이걸 알아야 임베디드..

    자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 8. 프록시와 연관관계 관리

    즉시 로딩과 지연 로딩 개념을 이해하기 위해 우선 프록시 개념부터 알아보자. 프록시는 지연 로딩을 하기 위해 나왔는데, 사실 EntityManager는 find 말고도 getReference가 있다. 얘는 실제 db를 조회하는건 아니고, 그 실제 db 객체의 target 위치만 저장하고 실제로 불러올 때 가져오는 거. 이걸 가짜 엔티티 객체를 조회하는 방식으로 만들어서 이 가짜 엔티티가 프록시이다. 클래스를 출력하면 진짜 다르고, getId같은 실제로 불러올 때야 select해서 가져오는걸 볼 수 있다. 이 그림이 중요한데, 프록시 클래스가 만들어질 때 영속성 컨텍스트가 이를 관리하기 위해 일반 클래스도 캐시에 저장했던 것 처럼 프록시 클래스도 캐시에 저장한다. 그래서 실제로 요청할 경우 이 프록시 클래..

    자바 ORM 표준 JPA 프로그래밍 - 기본편 - 섹션 7. 고급 매핑

    자바 객체에는 상속 개념이 있지만 db에는 없다. 그래서 마치 상속인것 처럼 사용하는 전략 3가지가 있는데, 조인 전략, 단일 테이블 전략, 구현 클래스마다 테이블 구현 전략이다. 실습을 위해 한번 만들어보자. 일단 이렇게만 하고 돌려보면 jpa의 기본 전략은 한 테이블에 다 때려박는 단일 테이블 전략인걸 알 수 있다. Inheritance로 JOINED를 넣으면 join방식으로 바뀐다. 저장하는걸 보면 부모가 가지고 있는 정보도 다 가지고 있으면서 자기만의 정보고 가지고 있어야 하기 때문에 정보를 불러오면 join을 해준다. 부모에게서 가져온 id를 자신의 id로 하고 join도 이걸로 한다. 사실 DTYPE이 생략되어 있었는데 @DiscriminatorColumn 어노테이션 추가하면 추가된다. 왠만하..

    pt 13일차 복기 - 팔(이두근) 운동

    준비운동 전신 하라고 해서 했더니 팔만 함... 운동 어디에 무릎으로 비스듬이 누워서 봉을 팔 앞쪽 이두만으로 들어올림. 이두 근육이 작다보니 2세트만 해도 힘이 없어진다. 2세트 중간부터 힘이 없어서 3세트, 4세트는 그냥 올라가는건 보조받고 내려가는거에만 힘줬음. 갈수록 세트 수 줄어서 마지막엔 4세트 8회 한듯. 무게는 봉에 양쪽 합해서 5kg한듯. 어디 누워서 팔은 밑으로 하고 이두로만 올려서 명치까지 들어올리는 운동. 얘도 3세트 15회 한 거 같은데. 그 다음은 파워밴드 가지고 어떻게든 이두 힘들 짜낼려고 노력하신듯.. 마지막으로 누워서 당겼던 거를 서서 위로 올렸음. 이두에만 힘을 주려고 하는게 포인트. 그럴려면 손목을 올린다는 느낌으로 하라는데 잘 모르겠음. 사이클링 15분.