본문 바로가기
반응형

혼자 공부하는 것들/JPA9

[지구최강 JPA 스터디] 8-9주차 JPA의 프록시 활용 JPA에서의 프록시는 어떻게 사용하는지 정리해보겠습니다. 간단한 이해를 돕기 위해 이전에 작성했던 포스팅 정보를 첨부해놓겠습니다. https://applepick.tistory.com/159 프록시 패턴과 데코레이터 패턴 인프런 스프링 고급 원리를 들으면서 프록시 패턴과 데코레이터 패턴을 공부하고 있습니다. "둘이 뭔가 비슷한데? 뭐가 다른거지? 정확하게 어떠한 상황에서 사용해야 할까?"라고 느껴 정리를 applepick.tistory.com 프록시 특징 실제 클래스를 상속받아서 만들어집니다. 사용하는 입장에서 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됩니다.(때에 따라서...) 프록시 객체는 실제 객체의 참조(Target)를 보관합니다. 프록시 객체는 처음 사용할 때 한 번만 초기화 프록시.. 2022. 10. 8.
주문조회 페이징 처리 API 설계하면서 고민했던 점 및 트러블 슈팅 JPA에서 페이징 처리를 공부하면서 적용해봤습니다. 배경을 설명해드리자면, 주문 조회 시 시작 날짜와 종료 날짜를 입력받아 페이징 처리하여 보여주는 기능을 구현했습니다. package assignment.shop.order.repository; import assignment.shop.order.Order; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import java.tim.. 2022. 9. 24.
[Spring + JPA] 동시성 문제를 해결해보자! 서버에서 여러 트랜잭션에서 동시에 같은 데이터를 변경하려고 시도할 경우 데이터 요청이 일부 유실될 수 있습니다. 이것은 큰 장애로 커질 수 있는데요. 예를 들어 상품이 100개인 상품이 있다고 가정해봅니다. 서로 다른 5명이 동시에 100개를 동시에 주문할 경우 한 명의 주문만 성공해야 합니다. 5명의 주문이 성공할 경우 큰 장애로 이어집니다. 이런 이슈를 JPA의 락 기능을 통해서 동시성 문제를 해결해보려고 합니다. 이슈 동시에 여러 트랜잭션을 통해 주문이 들어올 경우 주문이 모두 성공하는 이슈가 있었습니다. 해당 상품으로 테스트를 진행해보겠습니다. 상품 테이블에 맥북의 재고가 100개가 저장되어있습니다. 아래 테스트 코드를 보면서 문제점을 확인해봅니다. package assignment.shop.co.. 2022. 9. 9.
[지구최강 JPA 스터디] 6-7주차 연관관계 매핑 4가지와 단방향, 양방향! 사실 테이블에서 방향이라는 개념은 따로 있지 않고 설계의 편의를 위해 적용 테이블이 한쪽만 참조하면 단방향이고, 테이블이 양쪽에서 참조하면 양방향입니다. 양방향에서 연관관계 주인이 중요합니다. 양방향 매핑에서 연관관계 주인은 외래 키를 관리하는 곳 연관관계 주인의 반대편은 외래키에 영향을 주지 않습니다. 단순 조회 가능 단방향은 연관관계 주인이라는 개념이 따로 없습니다. JPA에서 연관관계 매핑 방식이 4가지가 있습니다. 다대일 : @ManyToOne 외래 키가 있는 쪽이 연관관계 주인입니다. 다대일에서도 단방향과 양방향을 설계할 수 있습니다. 축구선수와 팀의 테이블을 설계해야 한다면 축구선수 테이블이 @ManyToOne입니다.(연관관계 주인은 축구선수 테이블) = [단방향] 축구선수 여러 명은 하나의 .. 2022. 8. 14.
[지구최강 JPA 스터디] 4-5주차 객체 설계 할때는 단방향으로!? 양방향일 때 연관관계의 주인을 누구로 지정해야 할까? 객체의 두 관계 중 하나를 연관관계의 주인으로 지정해야 합니다. 연관관계의 주인만 외래 키를 관리(등록, 수정)가 가능합니다. 주인이 아닌 경우 읽기만 가능합니다. 주인 -> mappedBy 사용 x 주인이 아닌경우 -> mapppedBy 속성으로 주인을 지정 비즈니스 로직을 기준으로 연관관계의 주인을 선택하면 안 됩니다. 연관관계의 주인은 외래 키의 위치를 기준으로 정해야 합니다. Member와 Order Entity가 있다고 가정해봅니다. 양방향으로 매핑했다고 생각하고 연관관계주인을 설정한다면, 외래키가 Order 기준으로 있으므로 이 두 개의 객체의 연관관계 주인은 Order로 설정해야 합니다. @ManyToOne은 항상 연관관계의 주인(Mapp.. 2022. 7. 28.
[지구최강 JPA 스터디] 2-3주차 몰아서 정리하자! 데이터베이스 스키마 설정은 개발 초기 단계 아니면 validate 나 none으로 해줘야 합니다.(create, create-drop, update는 테스트할 때만!) gradle이면 이런 식으로 세팅하고 #application.yml spring: jpa: hibernate: ddl-auto: validate OR none maven이면 아래와 같은 방식으로 세팅해줍니다. 자주 사용하는 매핑 어노테이션 정리 @Column(name = "name") private String username; @Column은 DB의 컬럼과 매핑해주는 어노테이션입니다. @Enumerated(EnumType.STRING) private RoleType roleType; @Enumerated는 자바의 enum타입과 매핑해주는.. 2022. 7. 13.
[지구최강 JPA 스터디] 1주차 영속성 컨텍스트란? 회사에서 동기들과 JPA를 함께 스터디를 하기로 했습니다. https://www.inflearn.com/course/ORM-JPA-Basic/ 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의 JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런 www.inflearn.com 회사가 인프런 강의를 지원해줘서 위에 강의를 베이스로 스터디를 진행했습니다. 1주차 정리 EntityManagerFactory가 EntityManager를 만들어줍니다. EntityManager를 통해서 영속성 컨텍스트에 접근합니다. 스프링 프레임워크 같은 컨테이너 .. 2022. 6. 30.
내가보려고 정리한 JPA OSIV(Open EntityManager In View) OSIV는 Open EntityManager In Viewd의 약자입니다. spring.jpa.open-in-view는 기본적으로 True로 되어있습니다. OSIV은 Appleication 실행 중 어느 시점에 세팅되는지 확인해보겠습니다. 위에 로그를 잘 보면 Appleication이 실행이 되고 톰켓이 켜진다음 빈 주입을 쭉 실행해줍니다. 다음으로 테이블을 만들어줍니다. 만들어주는이유는 application.yml에 jpa: hibernate: ddl-auto: create create로 설정했기 때문에 실행 시점에 테이블을 만들어줍니다. 테이블 설정이 마무리되었다면 마지막으로 JpaBaseConfiguration$JpaWebConfiguration에서 spring.jpa.open-in-view is .. 2022. 6. 22.
[JPA] 엔티티 설계할 때 이 점을 주의하자! JPA를 공부하던 중 엔티티를 설계할 때 주의해야 할 점을 정리해보려고 합니다. 엔티티 설계시 가급적이면 Setter를 사용하지 말자! Setter가 모두 열려있으면, 변경점을 찾기 어렵고, 열어놓고 누군가 사용한다면 그 해당 로직을 쭉 읊으면서 변경점을 찾아야 한다는 번거로움이 있습니다. 또한, 리팩터링 하기가 다소 어렵습니다. 모든 연관관계는 지연 로딩으로 설정하자!(제일 중요!) 연관관계는 즉시 로딩과 지연 로딩이 있습니다. 즉시 로딩은 연관된 테이블을 로딩하는 시점에 모두 로딩해주는 방식입니다. 이 방식은 비추! 사용하면 안됩니다. 즉시로딩( EAGER )은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵습니다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생합니다. 실무에서 모든 연관관.. 2022. 3. 5.
반응형