Backend/JPA

    Spring Data Jpa

    Spring Data Jpa

    EntityManager를 이용해 CRUD를 작성해보면 도메인에 상관없이 중복되는 로직이 발생한다. public Team save(Team team) { em.persist(team); return team; } public Optional findById(Long id) { Team team = em.find(Team.class, id); return Optional.ofNullable(team); } public Member save(Member member) { em.persist(member); return member; } public Optional findById(Long id) { Member member = em.find(Member.class, id); return Optional.of..

    JPQL 중급

    JPQL 중급

    경로 표현식 .을 찍어 객체 그래프를 탐색하는 것이다. 연관 필드 : 연관관계를 위한 필드 단일 값 연관 필드 : @XtoOne 대상이 엔티티이다. 컬렉션 값 연관 필드 : @XToMany 대상이 컬렉션이다. 상태 필드는 단순히 값을 저장하는 필드이며, 엔티티가 아니기 때문에 더 이상 탐색이 불가능하고 탐색의 종점이다. class Member { private String username; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; @OneToMany(mappedBy = "member") private List orders = new ArrayList(); } // jpql m.username ->..

    페치 조인 (Fetch Join)

    페치 조인 (Fetch Join)

    JPQL에서 성능 최적화를 위해 제공하는 기능이다. 연관된 엔티티나 컬렉션을 한 번의 SQL로 모두 조회하는 기능이다. join fetch를 이용한다. // jpql select m from Member m join fetch m.team // SQL select m.*, T.* from Member m inner join team t on m.team_id = t.id List resultList = em.createQuery("select m from Member m", Member.class).getResultList(); for (Member member1 : resultList) { System.out.println("member1.getUsername() = " + member1.getUser..

    JPQL 기본

    JPQL 기본

    소개 EntityManager.find → 이후 필요시 객체 그래프 탐색 검색을 하는 경우 엔티티 객체를 대상으로 쿼리를 작성해야한다. 모든 DB 데이터를 객체로 변환하는 것은 좋지 않기 때문에 필요한 데이터만 불러오기 위해 검색 조건이 포함된 SQL을 사용한다. JPQL은 객체 지향 쿼리 언어이고 엔티티 객체를 대상으로 쿼리를 날린다. (SQL은 DB 대상 쿼리) SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. List members = em.createQuery( "select m from Member m where m.username like '%kim%'", Member.class ).getResultList(); Criteria JPQL은 동적 쿼리를 만드는 것이 어렵다. 또한 ..

    값 타입

    값 타입

    엔티티 타입 @Entity 데이터가 변해도 식별자를 이용해 추적하는 것이 가능하다. 즉 컬럼의 데이터가 변경되더라도 @Id로 데이터를 추적하는 것이 가능하다. 값 타입 int, Integer, String 같이 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있기 때문에 변경되더라도 추적이 불가능하다. 값 타입 분류 기본값 타입 : 자바 기본 타입 (프리미티브 타입), 래퍼 클래스, String 임베디드 타입 (Embeddet Type, 복합 값 타입) : 커스텀 클래스 같은 형태 ex) Position (x, y), Address (city, street, zipcode) 컬렉션 값 타입 : 기본 값타입 , 임베디드 타입을 컬렉션에 넣은 형태 기본값 타입 생명주기를 엔티티에 의존한다..