- Today
- Total
목록JPA (13)
개발하는 고라니
Intro 개인 프로젝트 정도의 규모라면 하나의 프로젝트 안에 api, web, admin 등이 모두 들어가있어도 커버가 되지만, 규모가 커지면 각각 개별 프로젝트로 나누어야 관리가 될 정도가 된다. 그럼 나눴다고 가정하자. 우리는 4개의 repository가 있다. api web admin-api admin-web 이때 admin에 어떤 기능을 추가해달라고 요청이 왔다. 그래서 admin-api, admin-web을 수정해서 PR(Pull Request)을 올렸다. 다음 요구사항은 새 프로모션이다. api, web, admin 모두 개발을 했고 PR을 올렸다. 하나의 이슈이지만 4번의 PR을 올렸다. 지금은 '이게 어때서?' 라고 생각할 수 있다. 조금 더 극단적으로 가정해서 주문과 정산, 회원이 다시..
JPA를 사용함으로써 단순 반복하는 CRUD의 SQL 작성을 획기적으로 줄일 수 있었다. 예를 들어, 테이블을 만들 때마다 Insert 쿼리, Select 쿼리, Update 쿼리, Delete 쿼리 1개씩은 대게 기본으로 SQL을 짜던 것을 JPA에서는 메서드로 가능하게 해주었다. 하지만 인간의 욕심은 끝이없다던가,, 이 간단한 CRUD 작업을 메서드로 하는 것 마저 반복을 줄일 수 없을까 고민을 하게되고, 처음에 이를 해결한 오픈소스 프로젝트를 Spring 측에서 함께 만들어 출시한 것이 Spring Data 프로젝트의 Spring Data JPA이다. 즉, Spring Data JPA를 사용한다면 간단한 저장/삭제/조회 메서드는 기본으로 장착이 되어있고, 커스터마이징 하는 것 또한 더 간편하게 할 ..
OSIV (Open Session In VIew) 순수 JPA를 공부할 때는 접해본 적 없는 단어이지만, Spring Boot + JPA를 공부하다보면 종종 언급되는 단어이다. 여기서 Session은 서버 단에서 사용자의 데이터를 저장해주는 Session이 아니다. 흔히 알고있는 JPA의 Entity Manager가 Hibernate에서는 Session이라 불린다. 그래서 Hibernate에서는 Open Session In View라 하고, JPA에서는 Open EntityManager In View라 하는데 관례상 OSIV라 한다. OSIV를 풀어 말해보면, 'View에서도 Session(EntityManager)가 열려있다' 고 말할 수 있겠다. 그럼 이것이 중요할까? 중요하다. 이로 인해 실시간 트..
진행하기 앞서... 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..