자바 ORM 표준 JPA 프로그래밍 - 기본편 섹션1 JPA 소개
❌SQL을 직접 다룰 때 발생하는 문제점
◻반복 작업
SQL작성, SQL실행, 객체 매핑,CRUD...지루함과 반복의 연속이다.
◻ SQL에 의존적인 개발
Member 클래스에 연락처를 추가하려면 SQL과 JDBC API를 수정해야한다. 또한 조회,수정 코드를 수정한다.수정에 끝이없다...
◻ 연관된 객체
회원이 어떤 한 팀에 소속되어야 한다는 요구사항이 추가되었다고 해보자.
이때 아래 코드에서 member.getTeam() null 에러가 발생했다.
member.getTeam().getTeamName(); // 추가
코드를 살펴보니 연결된 MemberDAO 코드에는 (team조회가 빠져있는) find()메소드를 그대로 유지했다.
알고보니 타 개발자가 findWithTeam()이라는 메소드를 추가했었다. 결국 findWithTeam()으로 변경해서 문제를 해결했다.
결국 DAO를 열고,SQL을 확인해야 원인을 알 수 있었다. 😥
여기서 문제점은, Member 객체가 Team 객체를 사용할 수 있는지는 사용하는 SQL에 달려있다는 것이다.
회원 객체에 필드 하나를 추가할 때도 DAO CRUD,SQL 코드 변경이 필요하다.
결국 SQL과 엔티티는 아주 강한 의존관계를 가지고 있다. ( 엔티티는 비즈니스 요구사항을 모델링한 객체를 말한다. )
💢애플리케이션에서 SQL을 직접 다룰 때 발생하는 문제점
- 진정한 의미의 계층 분할이 어렵다.
- 엔티티를 신뢰할 수 없다.
- SQL에 의존적인 개발을 피하기 어렵다.
🔲 패러다임의 불일치
관계형 데이터베이스는 추상화, 상속, 다형성 같은 개념이 없다.
🟢 상속
예를들어 Album 객체를 저장하려면 Item,ALBUM에 각각 INSERT를 해야 한다.
🟢 연관관계
- 객체는 참조를 사용: member.getTeam()
- 테이블은 외래 키를 사용: JOIN ON M.TEAM_ID = T.TEAM_ID
객체는 자유롭게 객체 그래프를 탐색할 수 있어야한다. 하지만 SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프 탐색 범위가 정해진다. 아래를 보자. SQL을 어떻게 하냐에 따라 탐색 범위가 달라진다.
SELECT M.*, T.*
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
member.getTeam(); //OK
member.getOrder(); //null
🟢 데이터 타입
MemberDAO.getMember() 를 호출할 때마다 new Member()로 인스턴스가 새로 생성된다. 따라서 아래는 다르다.
String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);
member1 == member2; //다르다.
반면 JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장한다.
String memberId = "100";
Member member1 = list.get(memberId);
Member member2 = list.get(memberId);
member1 == member2; //같다.
🟩 JPA
- Java Persistence API
- 자바 진영의 ORM 기술 표준
🟢 ORM이란 ?
- Object-relational mapping (객체 관계 매핑)
- 객체는 객체대로 설계 , 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
🟢 JPA는 표준 명세
- JPA는 인터페이스의 모음
- 하이버네이트, EclipseLink, DataNucleus
🟢 JPA를 왜 사용해야 하는가?
SQL 중심적인 개발에서 객체 중심으로 개발
◼ 생산성
- 저장: jpa.persist(member)
- 조회: Member member = jpa.find(memberId)
- 수정: member.setName(“변경할 이름”)
- 삭제: jpa.remove(member)
◼ 유지보수
- 기존: 필드 변경시 모든 SQL 수정
- JPA: 필드만 추가하면 됨, SQL은 JPA가 처리
🟥 패러다임의 불일치 해결
◼ 자유로운 객체 그래프 탐색
동일한 트랜잭션에서 조회한 엔티티는 같음을 보장
◼ 성능
- 1차 캐시와 동일성(identity) 보장
- 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
- 지연 로딩(Lazy Loading)
지연 로딩: 객체가 실제 사용될 때 로딩
즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 미리 조회
◼ 데이터 접근 추상화와 벤더 독립성
JPA는 애플리케이션과 DB 사이 추상화된 데이터 접근 계층을 사용해서 특정 DB 기술에 종속되지 않도록 한다.
DB를 변경하면 JPA에게 다른 DB를 사용한다고 알려주기만 하면 된다.
(예를 들어 페이징 처리는 DB마다 다르지만, 코드를 변경하지 않고 JPA에게 알려주기만 하면 된다.)
◼ 표준
JPA는 자바 진영의 ORM 기술 표준이다.
🔶 정리
JPA ORM은 객체지향과 관계형 데이터 베이스라는 두 기둥 위에 있는 기술이다.
'JPA' 카테고리의 다른 글
자바 ORM 표준 JPA 프로그래밍 - 기본편 섹션4 영속성 관리 - 내부 동작 방식 (0) | 2025.01.17 |
---|---|
자바 ORM 표준 JPA 프로그래밍 - 기본편 섹션2 JPA 시작하기 (0) | 2024.03.30 |