JPA [테스트, JPA] 부하테스트와 N+1문제. N+1 문제는 JPA에서 Entity의 정보를 맵핑할 때 발생하는 문제로 1:N 연관관계에 있는 정보에서 N개의 정보를 가져오기 위해 다시 select 쿼리를 날리게 되는데 이를 N+1이라고 한다. JPA에서 연관관계에 있는 정보를 가져오기 위해 N+1 문제가 발생하는 이유는 다음과 같습니다. group (1) - people (N) 관계에서 한 그룹에 여러 사람들이 있는 연관관계를 생각해보... JPAn+1JPA JPA + QueryDSL 계층형 댓글, 대댓글 구현(2) 이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이 전편에서 만들었던 N+1 문제가 발생하던 로직이다. 만약 부모 댓글의 개수가 100개라면 100번 이상의 쿼리가 나가게 되는 아주 좋지 못한 코드이다..ㅠ 🥲 위의 코드는 게시글... JavaJPASpringbootQuerydslJPA JPA 양방향 연관관계 테스트하기 JPA 양방향 연관관계 매핑하고 테스트 코드 작성하는 과정에서 발생한 험난한 여정.. 삽질 1 failed to replace datasource with an embedded database for tests -> 실제 DB가 연결되지 않았기 때문 삽질 2 luvShort_schema 연결했더니 이미 video 테이블 있다고 하길래 테이블 없는 new_schema 연결했더니 또 없다고.. ... JPA테스트코드@DataJpaTest@DataJpaTest JpaSystemException이 뭐야..? 걸음수에 따른 각 학교별 유저의 랭킹을 매번 조회하기에는 성능 저하가 크기 때문에 일정 간격으로 유저의 랭킹을 데이터베이스에 저장시키는 작업을 한다. 그 중에서도 데이터베이스에 좀 더 초점을 맞췄기 때문에 IdClass를 이용해 복합키를 표현했다. UserRank.java UserRankId.java 이런식으로 JPA에서 제공하는 메소드 쿼리를 이용해 유저 랭킹을 조회한다. 직접 postma... Javaback endSpring bootexception프로젝트trouble shootingJPAJPA ManyToOne, OneToOne 연관관계 조회 최적화 V1(Worst) Order -> Delivery를 OneToOne로 연관되어 있으며, Order -> Member는 ManyToOne으로 연관되어 있을때, Order를 통해 연관된 Delivery와 Member도 같이 DB로 부터 값을 가져와서 Response로 보내는 작업입니다. 엔티티를 그대로 가져오게되면, 무한 루프에 빠져서 끝없는 값을 반환받습니다. 그러한 이유는 모든 엔티티를 양방향에 지연 로딩(F... SpringbootJPAJPA ManyToOne, OneToOne 연관관계 조회 최적화 V2(Better)(DTO) Order -> Delivery를 OneToOne로 연관되어 있으며, Order -> Member는 ManyToOne으로 연관되어 있을때, Order를 통해 연관된 Delivery와 Member도 같이 DB로 부터 값을 가져와서 Response로 보내는 작업입니다. API DTO (Result라는 DTO에 OrderDTO를 한 번 감싸서 보내는 이유는, 해당 API에서는 조회 값이 배열로 반... SpringbootJPAJPA ManyToOne, OneToOne 연관관계 조회 최적화 V3&V4(Best) Order -> Delivery를 OneToOne로 연관되어 있으며, Order -> Member는 ManyToOne으로 연관되어 있을때, Order를 통해 연관된 Delivery와 Member도 같이 DB로 부터 값을 가져와서 Response로 보내는 작업입니다. Response를 보내는 것은 V2와 동일한 DTO로 반환하며, 반환 값도 같습니다. 하지만, findOrders를 가져올때 J... SpringbootJPAJPA OneToMany 연관관계 조회 & 컬렉션 조회 V3(V3_0, V3_1, V3_2) 하지만, JOIN FETCH로 orderItems도 가져올 경우, 문제가 발생합니다. Response 값을 보면 중복이 생기는 것을 확인 할 수 있습니다. JOIN FETCH로 ordeItems를 가져오는 것을 생각해면, 'SELECT *FROM orders o JOIN order_item oi ON o.order_id = oi.order_id;' 과 유사합니다. Distinct 덕분에 중복... JPASpringbootJPA JPA 변경 감지와 병합(Merge) 준영속 엔티티 영속성 컨텍스트가 더는 관리하지 않는 엔티티 (예를들면 itemService.saveItem(book)에서 수정을 시도하는 Book 객체다. Book 객체는 이미 DB에 한번 저장되어서 식별자가 존재함. 이렇게 임의로 만들어낸 기존 식별자를 가지고 있으면 준영속 엔티티로 볼 수 있음) DB에 한번 접근 임의로 만들어낸 엔티티도 기존 식별자를 가지고 있으면 준영속 엔티티로 볼 수... JPAJPA OneToMany 연관관계 조회 & 컬렉션 조회 V1 & V2 OneToMany 연관관계에서는 속성들이 컬렉션(List 등)이므로 이를 고려해서 연관관계 조회를 해야 합니다 V1, V2 모두 최적의 방법이 아니기 때문에, 두 방법을 사용하는 것을 추천하지 않습니다. 해당 포스팅은 이런한 방법이 있으며, 어떠한 문제점이 발생하며, 문제점들의 해결방안을 제시하기 위함 입니다. ManyToOne, OneToOne일때와 똑같은 문제 발생과 해결 방법도 비슷합니... SpringbootJPAJPA JPA 연관 관계 매핑1_일대일 단방향 매핑하기 Entity들은 대부분 다른 Entity와 연관 관계를 맺고 있다. JPA에서는 Entity에 연관 관계를 매핑해두고 필요할 때 해당 Entity와 연관된 Entity를 사용해 조금 더 객체지향적인 프로그래밍(OOP)을 할 수 있도록 도와준다. 회원 정보를 담고 있는 Member라는 Entity와 각 회원들의 장바구니를 나타내는 Entity가 아래와 같이 있다. 쇼핑몰에서 회원들은 각자 자신... entityJPAJPA JUnit 테스트 에러 : JPA metamodel must not be empty! JUnit 테스트코드 중 @WebMvcTest(특정클래스.class)를 붙인 Controller 클래스를 run할 때 생기는 오류이다. 이는 JPA에서도 @EnableJpaAuditing을 추가했는데 @WebMvcTest가 JPA 관련 Bean들을 로드하지 않기 때문에 에러가 발생한 것이다. 해결방법 둘 중 편한 방법을 선택하면 된다. 개인적으로는 테스트 추가할 때 마다 @MockBean을 ... SpringbootjunitJPAJPA OSIV Basics OSIV: Open Session in View Spring에서 기본으로 OSIV On 상태로 애플리케이션을 실행합니다. OSIV On일때는 API 응답이 끝나거나, View가 랜더링이 끝날때까지 영속성 컨텍스트와 DB와의 커넥션을 유지 시켜줍니다. 지연 로딩 연관관계 엔티티를 가져오기 위해서는 DB와의 커넥션이 필요한데요, On 상태일때는 어디서든 DB와의 커넥션이 가능했기 때문입니다. O... JPAOSIVSpingBootJPA JPA 연관 관계 매핑2_다대일 단방향 매핑하기 이전 포스팅에서는 @OneToOne. JPA에서 일대일 단방향 매핑하는 방법에 대해서 알아보았었다. 이번 포스팅에서는 @ManyToOne 어노테이션을 이용해 다대일 단방향 매핑을 하는 방법에 대해 알아보고자 한다. 이전 포스팅에서 장바구니와 회원 엔티티를 예로 들어 설명했기 때문에 이번에도 비슷한 예를 들고자 한다. 장바구니에는 각 회원이 관심있어 하거나 나중에 살 수도 있는 상품들을 담아둘... entityJPAJPA JPA 연관 관계 매핑3_다대일/일대다 양방향 매핑하기 장바구니 엔티티에 장바구니 상품 엔티티를 일대다 관계로 매핑을 해주면 양방향 매핑이 된다. 이번에는 주문(Order)과 주문 상품(OrderItem)의 매핑을 통해 양방향 매핑에 대해 더 깊게 알아보고자 한다. 또한 한 명의 회원은 여러 번의 주문을 할 수 있기 때문에 주문 엔티티를 기준으로 했을 때 @ManyToOne 어노테이션을 사용해 다대일 단방향 매핑을 해주었다. 주문 상품 엔티티와 ... entityJPAJPA [Cache]Mysql(JPA)과 Redis를 함께 사용해보자 안녕하세요 오늘은 Redis와 Mysql(JPA)과 이용하는 방법에 대해 설명해보도록 하겠습니다! DB의 부하를 줄이기 위해, 혹은 select 를 빠르게 하기 위해 사용될 때도 있습니다 위 그림과 같이 캐시 서버에 조회하려는 데이터가 없는 경우에 DB에서 직접 조회를 하게 되는데, IO 작업이 필요한 DB와 다르게 캐시 서버인 Redis는 인메모리 저장소이기 때문에 더 빠르게 조회를 할 수... mysqldbredisJPA캐시JPA 영속성 전이(CASCADE)와 고아객체 참고 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들도 싶을 때 예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장. 그럼 cascade는 언제 쓰는가? 무조건 1:N 관계일때 다 걸어야 하는가? 하나의 1이 다수의 N을 관리할 때 의미가 있지만 그 외엔 별로 소용이 없다. 하나의 게시판에 첨부파일정도는 사용이 가능하다. 소유자가 1개일때만 가능하며 다른 엔티티... JPAJPA 게시글 생성 + 파일 업로드(SpringBoot + JPA + AWS S3) 이번 글에서는 게시글 생성 + 파일 업로드(Aws S3)를 다룰 것이다. 먼저 게시글을 생성 하려면 제목, 내용, 카테고리 이름, 이미지파일을 프론트에서 넘겨받아야 한다. 이미지 파일은 List로 여러 개의 파일을 받을 것이다. 이미지 파일을 전송할 때는 FormData 방식으로 전달을 해야 하고, Json 타입의 제목, 내용, 카테고리 이름을 같이 보내기 때문에 @RequestPart를 사... S3awsSpringbootQuerydslJPAJPA JAP 애플리케이션 시작 build.gradle testImplementation group: 'com.h2database', name: 'h2', version: '1.4.199' implementation group: 'com.h2database', name: 'h2', version: '1.4.199' java 버전 11버전 이상 사용시 implementation group: 'javax.xml.bind', n... JPAJPA JPA 프로젝트 생성 접속하여 DB 다운로드 받는다. H2 콘솔을 실행한다. 연결을 누르면 디비가 생성 되었다. build 는 gradle를 선택 하였다. java 버전은 8버전 이상으로 선택 해야 한다. build.gradle 에서 dependencies 추가 implementation group: 'org.hibernate', name: 'hibernate-entitymanager', version: '5.3... JPAJPA 6. 다양한 연관관계 매핑 일대다 연관관계는 항상 다(N)쪽에 외래키가 있으므로, Member.team이 연관관계의 주인이다. 보통 일대다 관계에서 다 쪽에 외래키가 있지만, 여기서는 다 쪽에 외래키를 매핑할 수 있는 참조 필드가 없다. 따라서 일대다 단방향 매핑보다는, 다대일 양방향 매핑을 사용하는 것을 권장한다. 일대다 양방향 매핑은 존재하지 않는데(사실 다대일 양방향이랑 다를게 없기도 하다), 양방향 매핑에서 @... JPASpringstudyJPA [SpringBoot JPA 활용 웹 애플리케이션 개발 : 수정(변경감지, Merge)] JPA에서 Transaction 안의 영속성 Entity의 데이터가 변경되면 변경을 감지해서 데이터를 update 함 Transaction commit 시점에 flush를 날리면서 데이터를 update 함 update를 따로 날릴 필요가 없음 [준영속 엔티티를 수정하는 두 가지 방법] 변경 감지 기능 사용 병합(merge) 사용 변경 감지 Service에서 Update 비즈니스 로직 메서드에... webJPASpringbootJPA @Transactional 과 PROXY 위 그림처럼 Spring AOP는 사용자의 특정 호출 시점에 IoC 컨테이너에 의해 AOP를 할 수 있는 Proxy Bean을 생성해준다. Spring AOP는 런타임 위빙 방식을 기반으로 하고 있고, Spring 에서는 상황에 따라 JDK Proxy와 CGLib방식을 통해 Proxy Bean을 생성해준다. JDK Proxy는 Spring AOP의 근간이 된다.JDK Proxy는 JAVA의 ... JPASpringJPA [SpringBoot JPA 활용 웹 애플리케이션 개발 : 회원 가입 처리] 1. Spring Framework : validation Form Class 또는 DTO의 필드에 @NotEmpty(message = "xxx은/는 필수 입니다.") 로 필수입력 값 validation 체크를 할 수 있다. 2. Validation Check Form Class 또는 DTO로 Parameter를 받을 때 @Valid 하나로 유효성검사를 편리하게 할 수 있다. org.spri... webJPASpringbootJPA Dirty Checking vs. EntityManager.merge() (@RequestMapping, @GetMapping, @PostMapping 등 Spring MVC관련 내용은 이미 학습한 내용으로, 추가로 설명하지는 않겠습니다. 에서 Spring_MVC1 확인) 준영속 엔티티의 값을 변경할 때는 두가지 방법이 있습니다. 첫번째는 Dirty Checking(변화 감지)이고, 두번째는 EntityManager.merge()를 사용하는 것 입니다. 1.Dir... JPASpringbootJPA [SpringBoot JPA 활용 웹 애플리케이션 개발 : 주문 도메인 개발] 상품 주문 주문 내역 조회 주문 취소 주문 엔티티, 주문상품 엔티티 개발 주문 리포지토리 개발 주문 서비스 개발 주문 검색 기능 개발 주문 기능 테스트 취소 시 재고 삭제 주문 Entity는 생성될 때 주문이 들어온 것이기 때문에 주문 수량만큼 재고를 줄여줘야 함 > casecade Entity 관계 설정 중 cascade 를 설정해주면 주테이블에 데이터가 변경될 때 이하 테이블들도 같이 데... webJPASpringbootJPA [JPA] 13장 웹 애플리케이션과 영속성 관리 스프링은 트랜잭션 범위의 영속성 컨텍스트를 기본 전략으로 사용한다. 트랜잭션 범위와 영속성 컨텍스트의 생존 범위가 동일하며, 트랜잭션 종료 시, 영속성 컨텍스트도 동일하게 종료하게 된다. 트랜잭션이 같을 경우, 같은 영속성 컨텍스트를 사용한다. 다양한 위치에서 엔티티 매니저(EntityManager)를 주입받아 사용해도 트랜잭션이 같으면 항상 같은 영속성 컨텍스트를 사용하게 된다. 트랜잭션이... JPAJPA 실무 활용 - 순수 JPA 와 Querydsl MemberJpaRepository 생성자에서 JPAQueryFactory를 새로 만들어 엔티티 매니저를 주입시키는 것을 볼 수 있다. 이 방법 말고도 JPAQueryFactory를 빈으로 따로 만들고 생성자에 그냥 주입만 시키는 방법도 있다. 이 경우에는 @RequiredArgsConstructor를 통해 더 간편한 코드를 짤 수 있다는 장점이 있다. 하지만, 이 방법은 테스트를 진행할때 ... JPASpringQuerydslJPA Controller(+ @Valid) Controller: 웹 계층, Client의 요청을 받는 부분 MemberForm Client 쪽에서 회원가입하는 Member의 Form 데이터를 서버로 보낼때, 해당 데이터들을 MemberForm에 담아서 서버에서 처리합니다. @Valid를 통해 MemberForm를 validate 합니다. @Valid 애노테이션이 있으면, MemberForm에서 @NotEmpty,@NotBlank 등등... JPASpringbootJPA 이전 기사 보기
[테스트, JPA] 부하테스트와 N+1문제. N+1 문제는 JPA에서 Entity의 정보를 맵핑할 때 발생하는 문제로 1:N 연관관계에 있는 정보에서 N개의 정보를 가져오기 위해 다시 select 쿼리를 날리게 되는데 이를 N+1이라고 한다. JPA에서 연관관계에 있는 정보를 가져오기 위해 N+1 문제가 발생하는 이유는 다음과 같습니다. group (1) - people (N) 관계에서 한 그룹에 여러 사람들이 있는 연관관계를 생각해보... JPAn+1JPA JPA + QueryDSL 계층형 댓글, 대댓글 구현(2) 이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이 전편에서 만들었던 N+1 문제가 발생하던 로직이다. 만약 부모 댓글의 개수가 100개라면 100번 이상의 쿼리가 나가게 되는 아주 좋지 못한 코드이다..ㅠ 🥲 위의 코드는 게시글... JavaJPASpringbootQuerydslJPA JPA 양방향 연관관계 테스트하기 JPA 양방향 연관관계 매핑하고 테스트 코드 작성하는 과정에서 발생한 험난한 여정.. 삽질 1 failed to replace datasource with an embedded database for tests -> 실제 DB가 연결되지 않았기 때문 삽질 2 luvShort_schema 연결했더니 이미 video 테이블 있다고 하길래 테이블 없는 new_schema 연결했더니 또 없다고.. ... JPA테스트코드@DataJpaTest@DataJpaTest JpaSystemException이 뭐야..? 걸음수에 따른 각 학교별 유저의 랭킹을 매번 조회하기에는 성능 저하가 크기 때문에 일정 간격으로 유저의 랭킹을 데이터베이스에 저장시키는 작업을 한다. 그 중에서도 데이터베이스에 좀 더 초점을 맞췄기 때문에 IdClass를 이용해 복합키를 표현했다. UserRank.java UserRankId.java 이런식으로 JPA에서 제공하는 메소드 쿼리를 이용해 유저 랭킹을 조회한다. 직접 postma... Javaback endSpring bootexception프로젝트trouble shootingJPAJPA ManyToOne, OneToOne 연관관계 조회 최적화 V1(Worst) Order -> Delivery를 OneToOne로 연관되어 있으며, Order -> Member는 ManyToOne으로 연관되어 있을때, Order를 통해 연관된 Delivery와 Member도 같이 DB로 부터 값을 가져와서 Response로 보내는 작업입니다. 엔티티를 그대로 가져오게되면, 무한 루프에 빠져서 끝없는 값을 반환받습니다. 그러한 이유는 모든 엔티티를 양방향에 지연 로딩(F... SpringbootJPAJPA ManyToOne, OneToOne 연관관계 조회 최적화 V2(Better)(DTO) Order -> Delivery를 OneToOne로 연관되어 있으며, Order -> Member는 ManyToOne으로 연관되어 있을때, Order를 통해 연관된 Delivery와 Member도 같이 DB로 부터 값을 가져와서 Response로 보내는 작업입니다. API DTO (Result라는 DTO에 OrderDTO를 한 번 감싸서 보내는 이유는, 해당 API에서는 조회 값이 배열로 반... SpringbootJPAJPA ManyToOne, OneToOne 연관관계 조회 최적화 V3&V4(Best) Order -> Delivery를 OneToOne로 연관되어 있으며, Order -> Member는 ManyToOne으로 연관되어 있을때, Order를 통해 연관된 Delivery와 Member도 같이 DB로 부터 값을 가져와서 Response로 보내는 작업입니다. Response를 보내는 것은 V2와 동일한 DTO로 반환하며, 반환 값도 같습니다. 하지만, findOrders를 가져올때 J... SpringbootJPAJPA OneToMany 연관관계 조회 & 컬렉션 조회 V3(V3_0, V3_1, V3_2) 하지만, JOIN FETCH로 orderItems도 가져올 경우, 문제가 발생합니다. Response 값을 보면 중복이 생기는 것을 확인 할 수 있습니다. JOIN FETCH로 ordeItems를 가져오는 것을 생각해면, 'SELECT *FROM orders o JOIN order_item oi ON o.order_id = oi.order_id;' 과 유사합니다. Distinct 덕분에 중복... JPASpringbootJPA JPA 변경 감지와 병합(Merge) 준영속 엔티티 영속성 컨텍스트가 더는 관리하지 않는 엔티티 (예를들면 itemService.saveItem(book)에서 수정을 시도하는 Book 객체다. Book 객체는 이미 DB에 한번 저장되어서 식별자가 존재함. 이렇게 임의로 만들어낸 기존 식별자를 가지고 있으면 준영속 엔티티로 볼 수 있음) DB에 한번 접근 임의로 만들어낸 엔티티도 기존 식별자를 가지고 있으면 준영속 엔티티로 볼 수... JPAJPA OneToMany 연관관계 조회 & 컬렉션 조회 V1 & V2 OneToMany 연관관계에서는 속성들이 컬렉션(List 등)이므로 이를 고려해서 연관관계 조회를 해야 합니다 V1, V2 모두 최적의 방법이 아니기 때문에, 두 방법을 사용하는 것을 추천하지 않습니다. 해당 포스팅은 이런한 방법이 있으며, 어떠한 문제점이 발생하며, 문제점들의 해결방안을 제시하기 위함 입니다. ManyToOne, OneToOne일때와 똑같은 문제 발생과 해결 방법도 비슷합니... SpringbootJPAJPA JPA 연관 관계 매핑1_일대일 단방향 매핑하기 Entity들은 대부분 다른 Entity와 연관 관계를 맺고 있다. JPA에서는 Entity에 연관 관계를 매핑해두고 필요할 때 해당 Entity와 연관된 Entity를 사용해 조금 더 객체지향적인 프로그래밍(OOP)을 할 수 있도록 도와준다. 회원 정보를 담고 있는 Member라는 Entity와 각 회원들의 장바구니를 나타내는 Entity가 아래와 같이 있다. 쇼핑몰에서 회원들은 각자 자신... entityJPAJPA JUnit 테스트 에러 : JPA metamodel must not be empty! JUnit 테스트코드 중 @WebMvcTest(특정클래스.class)를 붙인 Controller 클래스를 run할 때 생기는 오류이다. 이는 JPA에서도 @EnableJpaAuditing을 추가했는데 @WebMvcTest가 JPA 관련 Bean들을 로드하지 않기 때문에 에러가 발생한 것이다. 해결방법 둘 중 편한 방법을 선택하면 된다. 개인적으로는 테스트 추가할 때 마다 @MockBean을 ... SpringbootjunitJPAJPA OSIV Basics OSIV: Open Session in View Spring에서 기본으로 OSIV On 상태로 애플리케이션을 실행합니다. OSIV On일때는 API 응답이 끝나거나, View가 랜더링이 끝날때까지 영속성 컨텍스트와 DB와의 커넥션을 유지 시켜줍니다. 지연 로딩 연관관계 엔티티를 가져오기 위해서는 DB와의 커넥션이 필요한데요, On 상태일때는 어디서든 DB와의 커넥션이 가능했기 때문입니다. O... JPAOSIVSpingBootJPA JPA 연관 관계 매핑2_다대일 단방향 매핑하기 이전 포스팅에서는 @OneToOne. JPA에서 일대일 단방향 매핑하는 방법에 대해서 알아보았었다. 이번 포스팅에서는 @ManyToOne 어노테이션을 이용해 다대일 단방향 매핑을 하는 방법에 대해 알아보고자 한다. 이전 포스팅에서 장바구니와 회원 엔티티를 예로 들어 설명했기 때문에 이번에도 비슷한 예를 들고자 한다. 장바구니에는 각 회원이 관심있어 하거나 나중에 살 수도 있는 상품들을 담아둘... entityJPAJPA JPA 연관 관계 매핑3_다대일/일대다 양방향 매핑하기 장바구니 엔티티에 장바구니 상품 엔티티를 일대다 관계로 매핑을 해주면 양방향 매핑이 된다. 이번에는 주문(Order)과 주문 상품(OrderItem)의 매핑을 통해 양방향 매핑에 대해 더 깊게 알아보고자 한다. 또한 한 명의 회원은 여러 번의 주문을 할 수 있기 때문에 주문 엔티티를 기준으로 했을 때 @ManyToOne 어노테이션을 사용해 다대일 단방향 매핑을 해주었다. 주문 상품 엔티티와 ... entityJPAJPA [Cache]Mysql(JPA)과 Redis를 함께 사용해보자 안녕하세요 오늘은 Redis와 Mysql(JPA)과 이용하는 방법에 대해 설명해보도록 하겠습니다! DB의 부하를 줄이기 위해, 혹은 select 를 빠르게 하기 위해 사용될 때도 있습니다 위 그림과 같이 캐시 서버에 조회하려는 데이터가 없는 경우에 DB에서 직접 조회를 하게 되는데, IO 작업이 필요한 DB와 다르게 캐시 서버인 Redis는 인메모리 저장소이기 때문에 더 빠르게 조회를 할 수... mysqldbredisJPA캐시JPA 영속성 전이(CASCADE)와 고아객체 참고 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들도 싶을 때 예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장. 그럼 cascade는 언제 쓰는가? 무조건 1:N 관계일때 다 걸어야 하는가? 하나의 1이 다수의 N을 관리할 때 의미가 있지만 그 외엔 별로 소용이 없다. 하나의 게시판에 첨부파일정도는 사용이 가능하다. 소유자가 1개일때만 가능하며 다른 엔티티... JPAJPA 게시글 생성 + 파일 업로드(SpringBoot + JPA + AWS S3) 이번 글에서는 게시글 생성 + 파일 업로드(Aws S3)를 다룰 것이다. 먼저 게시글을 생성 하려면 제목, 내용, 카테고리 이름, 이미지파일을 프론트에서 넘겨받아야 한다. 이미지 파일은 List로 여러 개의 파일을 받을 것이다. 이미지 파일을 전송할 때는 FormData 방식으로 전달을 해야 하고, Json 타입의 제목, 내용, 카테고리 이름을 같이 보내기 때문에 @RequestPart를 사... S3awsSpringbootQuerydslJPAJPA JAP 애플리케이션 시작 build.gradle testImplementation group: 'com.h2database', name: 'h2', version: '1.4.199' implementation group: 'com.h2database', name: 'h2', version: '1.4.199' java 버전 11버전 이상 사용시 implementation group: 'javax.xml.bind', n... JPAJPA JPA 프로젝트 생성 접속하여 DB 다운로드 받는다. H2 콘솔을 실행한다. 연결을 누르면 디비가 생성 되었다. build 는 gradle를 선택 하였다. java 버전은 8버전 이상으로 선택 해야 한다. build.gradle 에서 dependencies 추가 implementation group: 'org.hibernate', name: 'hibernate-entitymanager', version: '5.3... JPAJPA 6. 다양한 연관관계 매핑 일대다 연관관계는 항상 다(N)쪽에 외래키가 있으므로, Member.team이 연관관계의 주인이다. 보통 일대다 관계에서 다 쪽에 외래키가 있지만, 여기서는 다 쪽에 외래키를 매핑할 수 있는 참조 필드가 없다. 따라서 일대다 단방향 매핑보다는, 다대일 양방향 매핑을 사용하는 것을 권장한다. 일대다 양방향 매핑은 존재하지 않는데(사실 다대일 양방향이랑 다를게 없기도 하다), 양방향 매핑에서 @... JPASpringstudyJPA [SpringBoot JPA 활용 웹 애플리케이션 개발 : 수정(변경감지, Merge)] JPA에서 Transaction 안의 영속성 Entity의 데이터가 변경되면 변경을 감지해서 데이터를 update 함 Transaction commit 시점에 flush를 날리면서 데이터를 update 함 update를 따로 날릴 필요가 없음 [준영속 엔티티를 수정하는 두 가지 방법] 변경 감지 기능 사용 병합(merge) 사용 변경 감지 Service에서 Update 비즈니스 로직 메서드에... webJPASpringbootJPA @Transactional 과 PROXY 위 그림처럼 Spring AOP는 사용자의 특정 호출 시점에 IoC 컨테이너에 의해 AOP를 할 수 있는 Proxy Bean을 생성해준다. Spring AOP는 런타임 위빙 방식을 기반으로 하고 있고, Spring 에서는 상황에 따라 JDK Proxy와 CGLib방식을 통해 Proxy Bean을 생성해준다. JDK Proxy는 Spring AOP의 근간이 된다.JDK Proxy는 JAVA의 ... JPASpringJPA [SpringBoot JPA 활용 웹 애플리케이션 개발 : 회원 가입 처리] 1. Spring Framework : validation Form Class 또는 DTO의 필드에 @NotEmpty(message = "xxx은/는 필수 입니다.") 로 필수입력 값 validation 체크를 할 수 있다. 2. Validation Check Form Class 또는 DTO로 Parameter를 받을 때 @Valid 하나로 유효성검사를 편리하게 할 수 있다. org.spri... webJPASpringbootJPA Dirty Checking vs. EntityManager.merge() (@RequestMapping, @GetMapping, @PostMapping 등 Spring MVC관련 내용은 이미 학습한 내용으로, 추가로 설명하지는 않겠습니다. 에서 Spring_MVC1 확인) 준영속 엔티티의 값을 변경할 때는 두가지 방법이 있습니다. 첫번째는 Dirty Checking(변화 감지)이고, 두번째는 EntityManager.merge()를 사용하는 것 입니다. 1.Dir... JPASpringbootJPA [SpringBoot JPA 활용 웹 애플리케이션 개발 : 주문 도메인 개발] 상품 주문 주문 내역 조회 주문 취소 주문 엔티티, 주문상품 엔티티 개발 주문 리포지토리 개발 주문 서비스 개발 주문 검색 기능 개발 주문 기능 테스트 취소 시 재고 삭제 주문 Entity는 생성될 때 주문이 들어온 것이기 때문에 주문 수량만큼 재고를 줄여줘야 함 > casecade Entity 관계 설정 중 cascade 를 설정해주면 주테이블에 데이터가 변경될 때 이하 테이블들도 같이 데... webJPASpringbootJPA [JPA] 13장 웹 애플리케이션과 영속성 관리 스프링은 트랜잭션 범위의 영속성 컨텍스트를 기본 전략으로 사용한다. 트랜잭션 범위와 영속성 컨텍스트의 생존 범위가 동일하며, 트랜잭션 종료 시, 영속성 컨텍스트도 동일하게 종료하게 된다. 트랜잭션이 같을 경우, 같은 영속성 컨텍스트를 사용한다. 다양한 위치에서 엔티티 매니저(EntityManager)를 주입받아 사용해도 트랜잭션이 같으면 항상 같은 영속성 컨텍스트를 사용하게 된다. 트랜잭션이... JPAJPA 실무 활용 - 순수 JPA 와 Querydsl MemberJpaRepository 생성자에서 JPAQueryFactory를 새로 만들어 엔티티 매니저를 주입시키는 것을 볼 수 있다. 이 방법 말고도 JPAQueryFactory를 빈으로 따로 만들고 생성자에 그냥 주입만 시키는 방법도 있다. 이 경우에는 @RequiredArgsConstructor를 통해 더 간편한 코드를 짤 수 있다는 장점이 있다. 하지만, 이 방법은 테스트를 진행할때 ... JPASpringQuerydslJPA Controller(+ @Valid) Controller: 웹 계층, Client의 요청을 받는 부분 MemberForm Client 쪽에서 회원가입하는 Member의 Form 데이터를 서버로 보낼때, 해당 데이터들을 MemberForm에 담아서 서버에서 처리합니다. @Valid를 통해 MemberForm를 validate 합니다. @Valid 애노테이션이 있으면, MemberForm에서 @NotEmpty,@NotBlank 등등... JPASpringbootJPA 이전 기사 보기