인프런 80

[JPA] TIL 11일차 - 객체지향 쿼리 언어 JPQL 기본 문법

기본 문법과 쿼리 API TypedQuery, Query Member member = new Member(); member.setUsername("member1"); member.setAge(10); em.persist(member); TypedQuery query1 = em.createQuery("select m from Member m", Member.class); TypedQuery query2 = em.createQuery("select m.username from Member m", String.class); Query query3 = em.createQuery("select m.username, m.age from Member m"); // 타입 정보를 받을 수 없을 때 결과 조회 API Me..

BACK/JPA 2024.04.08

[JPA] TIL 9일차 - JPA 의 다양한 쿼리 방법(JPQL, JPA Criteria, QueryDSL 등)

JPA는 다양한 쿼리 방법(JPQL, JPA Criteria, QueryDSL...)을 지원한다. 대부분 jpql로 해결이 되지만, 어쩌다 안될 경우에는 네이티브 SQL이나 MyBatis, SpringJdbcTemplate를 쓰면 된다. JPQL 소개 JPA를 사용하면 엔티티 객체를 중심으로 개발하게 되고, 검색할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다. 이 때 모든 데이터베이스를 메모리에 올려 객체로 변환해 검색하는것은 말이 안된다. 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 있는 SQL이 필요하다. 이런 문제를 해결하기 위해 JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다. SQL은 DB 테이블을 대상으로 쿼리하는 반면, JPQL은 엔티티..

BACK/JPA 2024.04.05

[JPA] TIL 8일차 : JPA 고급 매핑 - 상속 관계 매핑

관계형 데이터베이스는 상속 관계가 없다. 대신 슈퍼타입 서브타입이라는 모델링 기법이 객체 상속과 유사하다. 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑해 상속관계를 매핑한다. 슈퍼 타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 - 각각 테이블로 변환 : 조인 전략 - 통합 테이블로 변환 : 단일 테이블 전략 - 서브타입 테이블로 변환: 구현 클래스마다 테이블 전략 조인 전략 필요한 테이블을 조인해 가져옴 @Inheritance(strategy = InheritanceType.JOINED) @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn // dtype 컬럼이 생기고 기본 값으로는 엔티티 명..

BACK/JPA 2024.04.04

[JPA] TIL 7일차 - JPA 다양한 연관관계 매핑

연관관계 매핑시 고려사항 3가지 다중성 다대일 @ManyToOne 일대다 @OneToMany 일대일 @OneToOne 다대다 @ManyToMany: 실무에서 쓰면 안됨 단방향, 양방향 테이블: 외래 키 하나로 양쪽 조인이 가능해 방향의 개념이 없다. 객체: 참조용 필드가 있는 쪽으로만 참조가 가능하다. 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향(단방향이 두개) 양방향 시 연관관계의 주인 연관관계의 주인: 외래 키를 관리하는 참조 주인의 반대편: 외래 키에 영향을 주지 않고 단순 조회만 가능 객체 양방향 관계는 참조가 두군데 있고, 둘 중 테이블의 외래키를 관리할 곳을 지정해야 한다. 다대일 다대일 단방향 관계형 DB는 다쪽에 외래키가 항상 있어야 한다. 외래키가 있는 객체에 참조를 넣어 주고 ..

BACK/JPA 2024.04.03

[JPA] JPA의 값 타입 (기본 값, 임베디드, 컬렉션 타입)

JPA의 데이터 타입 분류 엔티티 타입 데이터가 변해도 식별자로 지속해서 추적 가능 ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 @Entity로 정의하는 객체 값 타입 int, Integer, String 처럼 값으로 사용하는 자바 기본 타입이나 객체 식별자 없고 값만 있어 변경 시 추적 불가 ex) 숫자 100 -> 200 변경 시 완전히 다른 값으로 대체 값 타입 분류 기본 값 타입, 임베디드 타입, 컬렉션 타입으로 나눌 수 있다. 기본값 타입 엔티티에 생명 주기를 의존한다 (회원 엔티티를 삭제하면 필드도 함께 삭제) 값 타입은 공유하면 안된다 (회원 이름 변경시 다른 회원 이름이 변경되면 안됨) 자바의 기본 값은 항상 값을 복사한다. Integer같은 래퍼 클래스나 String..

BACK/JPA 2024.04.02

[JPA] JPA 즉시 로딩과 지연 로딩, 영속성 전이와 고아 객체

즉시 로딩과 지연 로딩 다대일 연관관계가 있는 멤버와 팀이 있을 때, 단순히 멤버 정보만 사용하는 비즈니스 로직이라서 멤버를 조회할 때 팀이 조회가 안되어도 된다고 가정하자. 이런 경우에는 지연 로딩을 쓸 수 있다. 지연 로딩 ⇒ 연관된 것을 proxy로 가져오고, 연관된 것의 실제 값을 사용하는 시점에 실제 쿼리가 나감 ex) 멤버를 사용할 땐 팀은 proxy로 가져오고, 팀의 실제 값을 사용할 때 DB에서 가져옴 Member @ManyToOne(fetch = FetchType.LAZY) // proxy 객체로 조회한다. @JoinColumn private Team team; Member 클래스만 DB에서 조회한다. Team team = new Team(); team.setName("teamA"); e..

BACK/JPA 2024.04.02

[JPA] JPA 프록시의 특징

프록시 JPA는 em.find() 말고도 참조를 가져오는 em.getReference() 라는 메소드가 있다. em.find() : 데이터베이스를 통해 실제 엔티티 객체를 바로 조회 em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 (DB쿼리 안나감) Member member = new Member(); member.setUsername("hello"); em.persist(member); em.flush(); em.clear(); Member findMember = em.find(Member.class, member.getId()); System.out.println("findMember.getUsername() = " + findMember.getUserna..

BACK/JPA 2024.04.02

[JPA] TIL 6일차 - 엔티티 매핑

@ Entity @Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다. 테이블과 매핑하려면 꼭 필수로 달아줘야 한다. JPA 스팩상 기본 생성자(public or protected) 가 필수로 있어야 한다. final 클래스, inner클래스, enum, interface로 사용할 수 없다. DB에 저장할 필드는 final을 사용하면 안된다. 엔티티 이름은 기본 값으로 클래스 이름을 그대로 사용한다. @Table 엔티티와 매핑할 테이블을 지정한다. @Table(name=”DB에서 매핑할 테이블 이름”) 기본값: 엔티티 이름을 사용 데이터베이스 스키마 자동 생성 JPA는 애플리케이션 로딩 시점에 DB테이블을 생성하는 기능을 지원해준다. 객체 매핑을 해놓으면 자동으로 테이블을 create 해준다. 데이..

BACK/JPA 2024.04.02

[JPA] TIL 5일차-영속성 관리(1차 캐시, 쓰기 지연, 변경 감지)

영속성 컨텍스트 고객의 요청이 올 때마다 EntityManagerFactory는 EntityManager를 생성한다. Entity Manager는 내부적으로 데이터베이스 커넥션을 사용해 DB를 사용하게 된다. 엔티티매니저를 생성하면 그 안에 1:1로 눈에 보이지 않는 영속성 컨텍스트란 공간이 생성된다. 영속성 컨텍스트는 엔티티를 영구 저장하는 환경이다. 논리적인 개념이고, 눈에 보이지 않는다. 엔티티 매니저를 통해 영속성 컨텍스트에 접근한다. EntityManager.persist(entity)로 엔티티를 영속성 컨텍스트에 저장해 영속화 한다. 엔티티의 생명 주기 -비영속 : 영속성 컨텍스트와 관계 없는 새로운 상태 객체만 생성되고 영속 컨텍스트에 저장되지 않은 상태 -영속: 객체 생성 후 엔티티 매니저..

BACK/JPA 2024.04.01

[JPA] JPA 연관관계 매핑

연관관계 매핑 객체의 참조와 테이블의 외래키를 매핑하는게 핵심이다. 방향(Direction): 단방향, 양방향 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 연관관계의 주인(Owner): 객체 양방향 연관관계는 관리 주인이 필요 단방향 연관관계 회원은 하나의 팀에만 소속될 수 있다.(N : 1) 하나에 팀에 여러 회원이 소속될 수 있다. Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member = new Member(); member.setUsername("member1"); member.setTeamId(team.getId()); em.persist(member)..

BACK/JPA 2024.03.31