- Today
- Total
목록ORM (9)
개발하는 고라니
진행하기 앞서... RDB에 Member라는 테이블이 있고, PK는 id이고 salary라는 컬럼이 존재하며 이는 연봉을 나타낸다. 연봉 3000만원 미만의 Member의 salary를 일정 크기만큼 인상한다면 어떻게 SQL을 짜겠는가? 나라면, UPDATE MEMBER SET SALARY = SALARY * 1.3 WHERE SALARY 영속성 컨텍스트에 반영된다. 3. Commit 시점에 변경 감지(Dirty Checking..
진행하기 앞서.. JPA를 한다면 JPQL(Java Persistence Query Language)의 사용은 필수적이다. JPQL에는 경로 표현식이라는 것이 존재하는데, 경로 표현식이란 점(.)을 찍어 객체 그래프를 탐색하는 것이라고 설명할 수 있다. SELECT M.name FROM Member M #상태필드 SELECT M.team FROM Member M #단일 값 연관 경로 SELECT T.memberList FROM Team T #컬렉션 값 연관 경로 위 3가지에 따라 결과가 달라지고, 내부적으로 동작하는게 달라지므로 꼭 주의해서 사용해야한다. 상태필드 : 단순하게 값을 저장하는 필드 연관필드 : 연관 관계를 위한 필드 단일 값 연관 필드 : @ManyToOne, @OneToOne 처럼 xxx..
CASCADE (영속성 전이) JPA에서 Cascade는 특정 엔티티를 persist() 해서 영속상태로 만들 때 연관된 엔티티들도 모두 영속상태로 만들기 위해 사용한다. 다음과 같이 Team과 Member 엔티티가 있다고 할 때, Team : Member = 1 : N이다. 즉 하나의 Team에 여러 Member가 있을 수 있다. @Entity @Data @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @Builder @ToString(exclude = "memberList") public class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; ..
Proxy JPA에서 Proxy란, 실제 데이터를 갖고있는 Entity가 아니라 Entity의 class를 상속받는 객체이고, Entity를 가리킨다. 그래서 Proxy의 내부는 텅 비어있고, 실제 Entity를 가리키는 Entity target를 갖는다. 결과적으로 Proxy와 실제 class의 모습은 동일하며, 사용자 입장에서는 뭐가 class고 Proxy인지 구분하여 사용할 필요는 없다. 하지만 몇 가지 주의해야할 점은 존재한다. Proxy 객체는 실제 객체의 참조를 보관한다. 그리고 Proxy객체를 호출하면 Proxy객체는 실제 객체의 메서드를 호출하게 된다. 실제 객체를 조회하면 DB에 쿼리(SELECT)를 날려 데이터를 가져오지만, 참조를 조회하면 DB에 쿼리를 날리지 않고 비어있는 Proxy..
상속관계 매핑 RDB에는 객체에서의 상속관계와 같은 상속관계가 없다. DB가 지원하는 상속이 있으나, 객체의 상속과는 거리가 멀다. 바로 슈퍼타입 / 서브타입 관계라는 모델링 기법이 존재하긴 한다. 상속관계 매핑이란 객체의 상속구조와 DB의 슈퍼타입 / 서브타입 관계를 매핑하는 것을 말한다. 다음과 같이 객체의 상속관계가 있다고 할 때, 이를 JPA를 이용해 매핑해보고, 그 때의 테이블을 보도록 한다. Entity - Product @Entity //@Inheritance(strategy = InheritanceType.JOINED) //@Inheritance(strategy = InheritanceType.SINGLE_TABLE) //@Inheritance(strategy = InheritanceTyp..
JPA (Java Persistence API) Java 진영의 ORM 기술 표준이다. - 과거 EJB라는 자바진영의 ORM을 구현한 것이 있었는데, 이를 좀더 개선하고자 오픈소스로 만들어진 것 중 하나가 'hibernate'이다. - 이에 자바진영에서 hibernate를 만든사람을 데려와 다듬고 표준 스펙으로 만든 것이 JPA이다. - JPA는 인터페이스의 집합이며, 실제로 내부를 보면 동작하는 것이 아니다. - JPA 2.1를 구현한 여러 구현체 중 3가지를 뽑자면, Hibernate, EclipseLink, DataNucleus 가 존재한다. Q. - ORM을 구현한 오픈소스가 hibernate이고, 자바 진영에서 hibernate를 다듬어 표준스펙으로 만든 것이 JPA라고 말씀하셨는데요. 바로 뒤..
JPA(Java Persisitence API)를 이용해 개발을 진행하다 보면 여러가지 단어가 등장하는데, 접해본 것 중 잘 모르겠는 몇 가지를 알아보고자 한다. ORM JPA Entity Object Querydsl Type-Safe JPQL Query Method # ORM (Obejct Relational Mapping) ORM은 객체지향과 관련이 있다. '객체지향 패러다임을 관계형 데이터베이스에 보존하는 기술'이라고 할 수 있다. 패러다임 입장에서 보면 '객체지향 패러다임을 관계형 패러다임으로 매핑해주는 개념'이라고 볼 수 있다. 객체지향에서 클래스는 관계형 데이터베이스의 테이블과 유사한 형태를 가지고 있다. 하나의 클래스는 다양한 타입(Type)의 데이터를 갖을 수 있는 하나의 데이터 집합체이고..
# JPQL JPQL(Java Persistence Query Language)는 JPA(Java Persistence API)의 일부로 정의된 플랫폼에 독립적인 객체지향 쿼리 언어이다. JPQL은 관계형 데이터베이스의 엔티티에 대한 쿼리를 만드는데 사용된다. JPA는 엔티티 객체를 중심으로 개발하므로 SQL을 사용하지 않는다. 하지만 검색쿼리를 사용할 때는 SQL을 사용해야 한다. SQL의 영향을 받아 SQL과 비슷하나, DB 테이블에 직접 접근하는 것이 아닌 JPA 엔티티에 동작한다. 그래서 JPQL의 쿼리에는 테이블이 아닌 엔티티에서 사용되는 컬럼의 이름을 사용해야 한다. * SQL : 데이터베이스 테이블을 대상으로 쿼리함 * JPQL : 엔티티 객체를 대상으로 쿼리함 # JPQL로 검색을? 웹 어..