Web/JPA
-
SpringDataJPA (1) - 공용 인터페이스, @QueryWeb/JPA 2024. 1. 30. 15:18
1. 공용 인터페이스 설정 - JavaConfig 설정 (부트 사용시 생략 가능) @Configuration @EnableJpaRepositories(basePackages = "jpabook.jpashop.repository") public class AppConfig {} - 스프링 부트 사용시 @SpringBootApplication 위치를 지정 - 만약 위치가 달라지면 @EnableJpaRepositories필요 - org.springframework.data.repository.Repository를 구현 클래스는 스캔 대상이 된다. - 프록시로 동작한다. - @Repository 어노테이션은 JPA 예외를 스프링 예외로 변환하는 과정을 처리한다. - 컴포넌트 스캔을 스프링 데이터 JPA가 자동으..
-
JPA(2) - OSIVWeb/JPA 2024. 1. 22. 12:52
1. Open Session In View (Open EntityManager in View) - 영속성 컨텍스트의 범위를 설정하는 옵션이다. - 기본으로 view까지 session이 유지된다. (DB세션 의미) - 트랜잭션 시작시 영속성 컨텍스트가 DB 커넥션을 가지고오는데, OSIV가 켜져있으면, 트랜잭션 종료후에도 커넥션을 반환하지 않는다 (레이지 로딩 때문이다.) 응답이 나갈때 까지 커넥션을 유지한다. - 이 덕분에 view나 컨트롤러에서 지연 로딩이 가능했던 것이다. - 이 전략은 DB커넥션을 너무 많이 사용하기때문에 장애로 이어질 수 있다. - OSIV를 끄면 트랜잭션 종료시 영속성 컨텍스트를 닫고, DB커넥션을 반환한다. 따라서 커넥션 리소스 낭비가 없다. - OSIV를 끄면 모든 지연로딩은..
-
JPA (2) - API 개발 시 기본으로 지켜야 할 사항Web/JPA 2024. 1. 22. 10:47
1. 사용자의 요청과 응답에 대한 요구사항에 맞는 적절한 DTO를 만들어라! @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { Long id = memberService.join(member); return new CreateMemberResponse(id); } @PostMapping("/api/v2/members") public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) { Member member = new Member(); member.setName..
-
JPA (11) - 다형성 쿼리,엔티티 직접 사용,정적쿼리,벌크연산Web/JPA 2024. 1. 12. 14:40
1. 다형성 쿼리 - TYPE > 조회 대상을 특정 자식으로 한정 (ex Item 중에 Book, Movie를 조회하라) select i from Item i where type(i) IN (Book, Movie) > 자바의 타입 캐스팅과 유사하다. > 상속 구조에서 부모 타입을 특정 자식 타입으로 다룰 때 사용 (FROM, WHERE, SELECT에서 사용) select i from Item i where treat(i as Book).author = 'kim' 2. 엔티티 직접 사용 > JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티 기본 키 값을 사용한다. select count(m.id) from Member m //엔티티 아이디를 사용 select count(m) from Member..
-
JPA - 프로젝트 생성Web/JPA 2024. 1. 11. 10:47
> JPA를 사용하기 위해서는 hibernate-entitymanager 필요함 > persistence.xml파일이 필요 (Spring 없이 순수 자바에서 jpa 활용) > DB연동, 엔티티 매니저 팩토리 생성시 필요 > persistence-unit name에 매니저 팩토리 생성시 불러올 이름 지정 > javax.persistence로 시작하는 속성은 JPA표준 속성이고, hibernate로 시작하는 속성은 하이버네이트 전용 속성이다. * 어떤 DB접근 기술을 사용하던 커넥션풀과 데이터 소스 등록필수! -> dialetc는 DB 방언 부분임 -> JPA는 특정 데이터 베이스에 종속적이지 않고, 어떤 DB를 사용하던 똑같이 서비스하도록 설계됨 -> 따라서 각 DB마다 문법과 함수가 다른것은 어떤 DB를..
-
JPA 활용 (1-3) - 엔티티 설계시 주의점Web/JPA 2024. 1. 4. 15:36
1. 엔티티는 가급적 Setter를 사용하지말자 -> Setter가 모두 열려있으면, 변경 포인트가 너무 많아서 유지보수가 어렵다. 1.2 모든 연관관계는 지연로딩으로 설정 > 즉시로딩은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1의 문제가 자주 발생함 > 실무에서 모든 연관관계는 지연로등으로 설정해야한다. > 연관된 엔티티를 DB에서 조회하면 fetch join, 엔티티 그래프들을 사용하자 > @XToOne(OneToOne,ManyToOne)관계는 기본이 즉시 로딩이므로 직접 지연로딩으로 설정해야한다. 1.3 컬렉션은 필드에서 초기화하자 컬렉션은 필드에서 바로 초기화하는 것이 안전하다. >null문제에서 안전함 > 하이버네이트는 엔티티를 영속화 할 때, 컬..
-
JPA 활용 (1-2) - 도메인 분석 설계Web/JPA 2024. 1. 4. 15:25
1. 도메인 모델과 테이블 설계 - 회원,주문,상품 관계 : 회원은 여러 상품을 주문할 수 있음 주문할 때 여러 상품을 선택할 수 있다 (주문과 상품은 다대다관계) (1 주문에 다 상품 1상품에 다 주문) 다대다 관계는 관계형 데이터베이스는 물론이고, 엔티티에서 거의 사용하지않음 따라서, 중간에 주문상품 테이블을 추가해서 다대일관계로 풀어냄 (1주문 다주문상품 다주문상품은 1주문) - 상품 분류 : 상품은 도서,음반,영화로 구분 상품이라는 공통 속성을 사용하므로, 상속구조 표현 - 회원 : 이름,임베디드 타입 주소, 주문을 리스트로 가짐 - 주문: 한 번 주문시 여러 상품을 주문할 수 있으므로 주문과 주문상품은 일대다 관계 주문은 상품을 주문한 회원과 배송정보,주문날짜,주문상태 가지고 있음 -> 주문 상..
-
JPA 활용 (1) - 프로젝트 환경설정Web/JPA 2024. 1. 4. 14:24
1. spring boot (build.gradle) > java 17버전 > dependencies: spring-data-jpa, thymeleaf, validation,spring-web, h2 > gradle은 의존관계 추가하면, 그 의존관계에 필요한 모든 의존관계 자동으로 끌어온다. > ./gradlew dependencies -configuration complieClasspath를 보면 의존관계 라이브러리 살펴볼 수 있음 * dependencies 추가하면서, version이 없는 것은 , plugins에 작성된 것은 2. H2 데이터 베이스 설치 > jdbc:h2:~/jspshop (최소한번) -> 한번 들어가줘야함 파일 모드로 들어가기 > ~/jpashop.mv.db -> 파일 생성 한번..