목차
개요
요새 자바언어를 공부하시거나 사용하고 계시는 많은 개발자분들은 모를 수 없는 게 있습니다. 바로 JPA
저도 자바 개발자로서 JPA를 사용해보았고 대략 어떤개념인지는 알고 있었으나, 제대로 공부했다는 아니었어서 이번에 JPA관련 강의를 들으며 배운점과 추가적으로 공부한점을 모아 포스팅을 해보겠습니다.
JPA와 ORM
JPA란 Java Persistence API 의 약자로 자바 진영의 ORM(Object Relational Mapping) 기술의 표준입니다.
이렇게 이름만 들어서는 정확히 어떤기능을 하는건지 잘 모르겠습니다.
먼저 ORM에 대해 알아보자면 객체와 관계형 데이터베이스사이에서 매핑해주는 기술이며, 이를 통해
객체는 객체답게 설계하고 관계형 데이터베이스는 데이터베이스대로 설계할 수 있으며 이를 연결해주는게 ORM이 됩니다.
이렇게만 봤을 땐 당연하게 객체는 객체, 관계형 디비는 관계형 디비대로 설계하는거 아닌가? 싶을 수 있습니다.
하지만 현업에서 복잡한 요구사항들을 구현하고 개발하면서 많은 경우 객체지향적인 코드와 객체를 설계하고 코드를 작성하고
SQL쿼리를 작성하면서 일일히 매핑을 직접해줘야하는 수고스러움과 컬럼이 변경(추가, 제외)이 생겨서 수정해야할 때
이와 관련된 테이블의 쿼리들을 모두 변경해야하고, 이때 개발자의 실수로 어떤부분에서 변경의 누락이 생기거나 하는 일이 빈번하게 발생할 수 있습니다. 이런 불편함을 해결하기 위해 나온기능이 ORM이며 자바진영에서 표준으로 쓰이는게 JPA가 됩니다.
JPA는 애플리케이션과 JDBC 사이에서 동작하게 되며 애플리케이션에서 요청이 들어온 객체를 이용해 다음과 같은 일들을 수행해줍니다.
- Entity (예: column) 를 분석합니다. 해당 엔티티가 어떤 컬럼이며 어떤테이블에 소속되어있고 참조하고 있는지 파악합니다.
- SQL Query를 생성합니다
- JDBC API를 사용해 데이터베이스에 접근합니다.
- 패러다임의 불일치문제를 해결합니다.
- 조회 시 ResultSet에 매핑합니다.
이런일 외에도 다양한기능을 수행하면서 개발자의 생산성을 향상시키고 SQL중심으로 개발되던 환경을 객체 중심으로 개발할 수 있게 하며
유지보수성이 높아지고 성능적인 측면에서도 약간의 이득이 발생하며 데이터의 접근 시 추상화와 벤더의 독립성을 지킵니다.
또한 자바진영의 ORM표준인 만큼 안정성을 믿고 사용할 수 있습니다.
패러다임의 불일치
객체지향 프로그래밍과 관계형 데이터베이스는 엄연히 다른개념의 패러다임을 가지고 있고, 애플리케이션의 규모가 커질수록
내부의 복잡성은 증가하며 객체지향과 관계형 데이터베이스의 패러다임 불일치가 발생하게 됩니다.
객체지향은 추상화, 캡슐화, 상속, 다형성등 시스템의 복잡성을 제어할 수 있는 객체중심의 패러다임이며,
관계형 데이터베이스는 데이터중심의 구조화, 집합적인 사고가 필요하며, 객체지향의 특징들과같은 개념이 존재하지 않아서
두 패러다임의 간극이 점점 발생하는 것을 패러다임의 불일치라 합니다. 그리고 이를 해결하기 위해선 많은 시간과 노력이 필요합니다.
1. 패러다임의 불일치 - 상속
기존의 처리방식으로 패러다임의 불일치를 해결하기 위해선
- 부모객체의 데이터만 꺼내서 ITEM용 SQL을 작성 후
- 자식 객체에서 데이터를 추출하여 ALBUM용 SQL을 작성하고
- ITEM과 ALBUM 테이블을 조인하여 그 결과를 Album객체에 전달합니다
이와같이 간단한 예제에서도 여러단계의 처리과정을 거치며 규모가 커질수록 이 이펙트는 점점 커지게 됩니다.
하지만 JPA는 이를 개발자 대신 해결해주며 개발자가 할일은 JPA에게 album 객체를 저장하면 됩니다.
2. 패러다임의 불일치 - 연관관계
객체는 참조를 사용해서 타 객체와 연관관계를 가지고 참조에 접근해서 연관 객체를 조회할 수 있으며
테이블은 외래 키를 사용해서 타 테이블과 연관관계를 맺고 JOIN을 사용해서 연관 테이블을 조회합니다.
기존의 연관관계는 객체를 테이블에 맞춰 설계하고 구조화해야 합니다. 이때 좋은 객체지향적인 프로그래밍을 하기 힘들어지며 심지어 객체지향의 특징을 잃어버리기도 합니다. 불일치를 해결하기 위해선 개발자가 중간에 객체모델의 외래키의 해당하는 역할을 해야합니다.
하지만 JPA는 연관관계에서 같은 트랜잭션에 있다면 이를 setter를 통해 해결하며 jpa.persist 를 사용해 대신 처리해줍니다.
3. 패러다임의 불일치 - 객체 그래프 탐색
객체지향에선 부모객체의 하위객체를 조회할 때 참조를 사용해서 연관된 데이터를 찾을 수 있는데 이를 객체 그래프 탐색이라 합니다.
하지만 관계형 데이터베이스에선 이를 직접 어디까지 탐색할지 지정해야합니다. 이 역시 JPA는 개발자가 원하는 만큼 탐색할 수 있도록 도와줍니다.
성능향상
지연로딩(실제 객체를 사용하는 시점까지 데이터베이스의 연결을 지연)을 사용할 수 있습니다.
즉시로딩(JOIN SQL을 통해 한번에 연관된 객체까지 미리 조회해둠)을 통해 최적화를 할 수 있습니다.
'Programming > JAVA' 카테고리의 다른 글
JPA - 영속성 컨텍스트(persistence context) 파헤쳐보기 (0) | 2022.12.28 |
---|---|
JAVA - Lambda Capturing (0) | 2022.12.06 |
JAVA - Priority Queue(우선순위 큐) 알아보기 (0) | 2022.11.30 |
디자인 패턴 - SOLID (0) | 2022.10.22 |
이펙티브 자바 - 2장 객체 주입 , 관리 , 참조 (0) | 2022.03.15 |