인프런160 1) 예제 도메인 모델, 공통 인터페이스 기능 소개 멤버에서 팀은 다대일팀에서 멤버스[컬렉션]은 일대다양방향 연관관계 @Entity@Getter @Setter// JPA가 프록시 기술같은걸 사용할때 기본생성자가 필요하다, private로 해두면 JPA가 사용할수없으므로 Protected로 해둔다.// [개발자가 실수로 사용하는것을 막기위해 protected로 제한 ]@NoArgsConstructor(access = AccessLevel.PROTECTED)@ToString(of ={"id","username","age"} ) // id, username, age 필드만 포함하여 toString() 메서드를 생성하라는 것, team이 포함되면 무한참조순환이 되므로 뺴준것public class Member { @Id @GeneratedValue .. 인프런/실전! 스프링 데이터 JPA 2024. 6. 11. 끝) API 개발 고급 - 실무 필수 최적화 - OSIV OSIV와 성능 최적화 Open Session In View: 하이버네이트Open EntityManager In View: JPA (관례상 OSIV라 한다.) OSIV ON- spring.jpa.open-in-view : true -> 기본값 [ OSIV ON ] WARN 5472 --- [main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning.. 인프런/실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 2024. 6. 11. 3) API 개발 고급 - 컬렉션 조회 최적화 컬렉션인 일대다 관계(OneToMany) 를 조회하고, 최적화하는 방법을 알아보자. 주문 조회 V1: 엔티티 직접 노출@RestController@RequiredArgsConstructorpublic class OrderApiController { private final OrderRepository orderRepository; /** * V1. 엔티티 직접 노출 * - Hibernate5Module 모듈 등록, LAZY=null 처리 * - 양방향 관계 문제 발생 -> @JsonIgnore */ @GetMapping("/api/v1/orders") public List ordersV1() { List all = orderRepository.. 인프런/실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 2024. 6. 11. 2) API 개발 고급 - 지연 로딩과 조회 성능 최적화 조회용 샘플 데이터 입력 /** * 종 주문 2개 * * userA * * JPA1 BOOK * * JPA2 BOOK * * userB * * SPRING1 BOOK * * SPRING2 BOOK */@Component@RequiredArgsConstructorpublic class InitDb { private final InitService initService; @PostConstruct public void init() { initService.dbInit1(); initService.dbInit2(); } @Component @Transactional @RequiredArgsConstructor static cla.. 인프런/실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 2024. 6. 10. 1) API 개발 기본 [ 회원 등록,수정,조회 API ] 1편의 프로젝트를 가지고 API 개발을 진행한다. 회원 등록 API V1@RestController@RequiredArgsConstructorpublic class MemberApiController { private final MemberService memberService; @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { Long id = memberService.join(member); return new CreateMemberResponse(id); } @Data static class Cr.. 인프런/실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 2024. 6. 10. 끝) 웹 어플리케이션 개발 [ 웹 계층 ] 홈 화면과 레이아웃홈 컨트롤러 등록 @Controller@Slf4jpublic class HomeController { @RequestMapping("/") public String home() { log.info("home controller"); return "home"; }} [타임리프 사용]Home.html HELLO SHOP 회원 기능 회원 가입 회원 목록 상품 기능 상품 등록 상품 목록 주문 기능 상품 주문 .. 인프런/실전! 스프링부트와 JPA활용1 2024. 6. 7. 3) 웹 어플리케이션 개발 [회원,상품,주문 도메인] 회원 기능 회원 등록회원 조회 상품 기능상품 등록상품 수정상품 조회 주문 기능 상품 주문주문 내역 조회주문 취소 예제를 단순화 하기 위해 다음 기능은 구현X 로그인과 권한 관리X파라미터 검증과 예외 처리X상품은 도서만 사용카테고리는 사용X배송 정보는 사용X 애플리케이션 아키텍처 계층형 구조 사용controller, web: 웹 계층service: 비즈니스 로직, 트랜잭션 처리repository: JPA를 직접 사용하는 계층, 엔티티 매니저 사용domain: 엔티티가 모여 있는 계층, 모든 계층에서 사용 패키지 구조jpabook.jpashop-domain-exception-repository-service-web 개발 순서: 서비스, 리포지토리 계층을 개발하고, 테스트 케이스를 작성해서 검증.. 인프런/실전! 스프링부트와 JPA활용1 2024. 6. 7. 2) 도메인 분석 설계 요구사항 분석 도메인 모델과 테이블 설계 회원, 주문, 상품의 관계 회원은 여러 상품을 주문할 수 있다.그리고 한 번 주문할 때 여러 상품을 선택할 수 있으므로 주문과 상품은 다대다 관계다.하지만 이런 다대다 관계는 관계형 데이터베이스는 물론이고 엔티티에서도 거의 사용하지 않는다. 따라서 그림처럼 주문상품이라는 엔티티를 추가해서 다대다 관계를 일대다, 다대일 관계로 풀어냈다. 상품 분류 상품은 도서, 음반, 영화로 구분되는데 상품이라는 공통 속성을 사용하므로 상속 구조로 표현했다. 회원 엔티티 분석 회원(Member) 이름과 임베디드 타입인 주소( Address ), 그리고 주문( orders ) 리스트를 가진다[회원이 오더리스트를 가지고있는것은 좋은 설계가 아니다. 일반적으로는 단방향으로 .. 인프런/실전! 스프링부트와 JPA활용1 2024. 6. 5. 11] 객체지향 쿼리 언어 - 중급 문법 경로 표현식.(점)을 찍어 객체 그래프를 탐색하는 것 select m.username -> 상태 필드 from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드where t.name = '팀A' 엔티티에서 바로 탐색가능한것 == 상태필드상태필드로 객체 그래프를 탐색했다.라고 볼수있다. 3가지 경로표현식이 존재 경로 표현식 용어 정리 상태 필드(state field): 단순히 값을 저장하기 위한 필드 (ex: m.username) 연관 필드(association field): 연관관계를 위한 필드 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티(ex: m.team) 컬렉션 값 연관 필드: @OneToM.. 인프런/자바 ORM 표준 JPA 프로그래밍 - 기본편 2024. 6. 4. 10) 객체지향 쿼리 언어(JPQL) JPA는 다양한 쿼리 방법을 지원 • JPQL • JPA Criteria • QueryDSL • 네이티브 SQL • JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL 소개 가장 단순한 조회 방법• EntityManager.find()• 객체 그래프 탐색(a.getB().getC()) • JPA를 사용하면 엔티티 객체를 중심으로 개발 • 문제는 검색 쿼리 • 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 • 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 • 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요 • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 • SQL과 .. 인프런/자바 ORM 표준 JPA 프로그래밍 - 기본편 2024. 6. 4. 9) [ 미완 ]값 타입 [임베디드 타입,값 타입과 불변 객체 JPA의 데이터 타입 분류 엔티티 타입 • @Entity로 정의하는 객체 • 데이터가 변해도 식별자로 지속해서 추적 가능 • 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 • int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 • 식별자가 없고 값만 있으므로 변경시 추적 불가 • 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 기본값 타입 • 자바 기본 타입(int, double)• 래퍼 클래스(Integer, Long)• String 임베디드 타입(embedded type, 복합 값 타입) 컬렉션 값 타입(collection value type) 기본값 타입 • 예): String name.. 인프런/자바 ORM 표준 JPA 프로그래밍 - 기본편 2024. 5. 31. 8) 프록시,즉시 로딩, 지연 로딩,영속성 전이, 고아객체 Member를 조회할 때 Team도 함께 조회해야 할까? 어떤 경우에는 회원과 팀을 함께 출력해야하므로 둘다 조회해야하고어떤 경우에는 회원만 출력하므로 둘다 조회할 필요가 없다. 회원만 출력하는데 둘다 조회해오면 낭비가 되니까 그걸 해결하기위해 jpa는 프록시를 이용한다. [ 지연로딩 , 즉시로딩] 프록시 em.find() vs em.getReference() em.find() 데이터베이스를 통해서 실제 엔티티 객체 조회em.getReference()데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 [db에 쿼리가 실행되지않는데 객체가 조회된다. ] em.find로 테스트Member member = new Member();member.setName("hello");em.persist(me.. 인프런/자바 ORM 표준 JPA 프로그래밍 - 기본편 2024. 5. 31. 이전 1 2 3 4 5 6 7 8 ··· 14 다음