관계형 데이터베이스가 웹 서비스의 중심이 되다 보니 현업 프로젝트들은 대부분 애플리케이션 코드보다 SQL로 처리하는 게 많아졌습니다. 이 부분을 해결하고자 JPA가 나오게 되었습니다.
JPA란?
- JAVA에서 사용하는 ORM 기술 표준으로 사용되는 인터페이스이다.
- ORM (Object Relational Mapping)은 객체와 관계형 데이터베이스를 매핑해준다는 뜻으로서, 객체는 객체대로 RDB(Relational Database)는 RDB대로 설계하도록 도와주는 프레임워크이다. 쉽게 말해 ORM 프레임워크는 객체와 RDB 사이 중간 다리 역할을 해주는 것이다.
동작 과정
1. JPA로 회원 객체를 넘겨준다.
2. JPA는 회원 객체를 분석하고 insert sql을 생성해준다.
3. JDBC API를 이용하여 SQL을 DB에 날린다.
4. DB로부터 결과를 받고 객체에 매핑
사용해야 하는 이유
1. 객체 중심 개발
- JPA를 사용하게 되면 적절한 SQL문을 자동으로 처리해주기 때문에 데이터베이스 중심이 아닌 객체 중심이 된다.
저장: jpa.persist(member)
조회: Member member = jpa.find(memberId)
수정: member.setName(“변경할 이름”)
삭제: jpa.remove(member)
2. 유지보수
- 필드를 추가할 때마다 SQL을 변경을 해야 했지만 JPA가 처리해주기 때문에 유지보수가 편하다.
3. 패러다임의 불일치 해결
- 제가 고민했던 문제로 게시판에서 회원 정보를 Int로 받는 게 아닌 MemberDto타입으로 받으면서 SQL 의존적인 코딩을 해소시켜 준다.
4. 성능 최적화
- 하나의 값을 가지고 두 개의 인스턴스를 생성 시 다른 값으로 나와야 정상입니다. 하지만 JPA는 1차 캐시로 동일성 비교를 보장해주기 때문에 같다고 나온다.
String memberId = "100";
Member member1 = list.get(memberId);
Member member2 = list.get(memberId);
member1 == member2; // true
- 트랜잭션을 지원하는 쓰기 지연
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
transaction.commit(); // [트랜잭션] 커밋
트랜잭션을 커밋할때까지 INSERT SQL을 메모리에 쌓고, 커밋을 할 때 한꺼번에 DB에 전송합니다.
이렇게 쓰면 서버를 여러번 거치지 않고 한 번만 거친다는 장점이 있습니다.
JPA 사용시 단점
- 통계 처리 같은 복잡한 쿼리는 처리에 어려움을 겪습니다. (이를 보안한 기술인 JPQL이 있으니 나중에 알아보도록 하겠습니다.)
- 매핑 설계를 잘못했을 때 자동으로 생성되는 쿼리가 많아지거나 중복 쿼리문이 많아져서 성능 저하 문제가 발생할 수 있습니다.
마무리
아직까지도 JPA를 사용하는 곳은 많지 않고, JPA를 사용하는 것이 무조권 옳지는 않습니다. 자신의 업무 환경, 장단점을 고려해서 Mybatis/JPA를 사용하시면 좋을 거 같습니다.
'JPA' 카테고리의 다른 글
스프링 데이터 JPA - 다양한 기능2 (0) | 2022.07.05 |
---|---|
스프링 데이터 JPA - 다양한 기능들 (0) | 2022.06.26 |
스프링 데이터 JPA - 다양한 쿼리 기능 (0) | 2022.06.21 |
JPA 영속성 컨텍스트란? (0) | 2022.06.15 |