아직 Order 테이블 연관관계를 SQL 쿼리문으로 안맺어서 NULL 값이 반환됨.
옛날 자바에서는 엔티티 객체를 생성할 때 레포지토리에 짰던 SQL 문들을 다 뒤져보면서 추출할 수 있는지 없는지 다 확인해야 됐다. 이 테이블 연관관계 맺은 SQL이 존재하나 찾아보는 것.
자바코드에서는 member_num = 100 으로
member1 = member_num
member2 = member_num
member1 != member2
sql에서는
member1 == member2
이런 불편함을 없애기 위해 만들어진 JPA 자바 펄시스턴스 api. 근데 이제 ORM 기술이 들어간.
오브젝트 릴레이셔널 매핑의 약자.
객체와 관계형 데이터베이스를 중간에서 매핑(연결)해준다.
객체는 객체대로 설계, 관계형 데이터베이스는 관계형 데이터베이스대로 설계.
구현체는 대부분 하이버네이트(오픈소스) 사용. 오픈 소스는 여러 팀과 개발자가 지속적인 개발 및 업데이트를 위해 새로운 기능이나 수정 사항을 자유롭게 개선하여 기여할 수 있도록 만들어져 배포되는 소프트웨어
실용적인 하이버네이트 기반으로 JPA(자바표준)이 만들어졌다.
INSERT INTO 쿼리문 안써도 됨.
앨범을 저장한다고 한줄쓰면 jpa가 쿼리문 두개를 날려준다.
ITEM의 상속을 받고 있는 ALBUM 객체를 만들어 앨범 아이디를 조회한다고만 해도 JPA가 알아서 두개의 테이블을 조인시켜서 앨범아이디에 맞는 앨범 데이터를 반환해준다.
JPA는 컬렉션과 같다. 자바 컬렉션이 DB와 일한다는 컨셉.
JPA는 애플리케이션과 DB 사이에 하나의 계층이 있다. 그래서 두가지 기능을 할 수 있다. 첫번째, 캐시. 두번째, 버퍼링 write. 이 두가지로 성능 최적화가 가능해진다.
2번은 어려우니 넘어가자.
이게 이제 백만개면 많은 성능의 최적화가 된다.
Member member = memberRepository.find(memberId)
2 이후 멤버에서 Team의 name을 참조하기 위해서 이 두줄을 쓰면 따로 SELECT * FROM TEAM이 코드에 맞게 JPA에서 쿼리문을 생성한다.
Team team = member.getTeam();
String teamName = team.getName();
지연 로딩에서는 쿼리문이 두번 나가고 즉시 로딩에서는 쿼리문이 한번 나간다.
먼저 지연로딩으로 설계를 다 해놓은 다음에 성능 최척화를 하기위해서 그 부분들만 바꾸면 된다.
MEMBER와 TEAM이 계속 같이 조회된다면 즉시로딩으로 바꾸면 된다.
ORM은 객체와 RDB 두 기능을 다 알아야 쓸 수 있는 기술. 그러므로 둘다 깊이 있게 알아야 한다.