개발자
[JPA] JPA란?(ORM) 본문
ORM(Object Relational Mapping)이란?
JPA 개념을 알아보기 전에 ORM 개념을 먼저 알아야 한다
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑하는 기술을 말한다.
기술적으로는 어플리케이션의 객체를 RDB테이블에 자동으로 영속화 해주는 것
[DB data ------ Mapping ------ Object]
객체를 통해 간접적으로 데이터베이스 데이터를 다룬다
비교되는 개념으로는 SQL Maper가 있다.
[SQL ------ Mapping ------ Object]
● 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.
● 객체 모델과 관계형 모델간에 불일치가 존재한다.(아래 jpa에서 추가설명)
● ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.
● Persistant API라고 할 수 있다. EX),Hibernate 등 (뒤에서 JPA설명시 부가설명 추가)
<사용 이유>
● 객체 지향적인 코드로 인해 더 직관적이고 비즈니스 로직에 더 집중할 수 있게 도와준다
● 재사용 및 유지보수의 편리성이 증가한다
● DBMS에 대한 종속성이 줄어든다
● 개발자가 직접 query 작성하지 않고, 메서드 호출로 원하는 데이터를 조회할 수 있고, 애플리케이션 레벨의 객체로 전환도 해주는 편리함이 있다.
JPA(Java Persistence API)란?
JAVA진영에서 ORM기술 표준으로 사용하는 인터페이스 모음이다. 기술명세이기 때문에 어떻게 사용할지 가이드만 제공한 것이고 실체 구현체는 아니다. 단순 인터페이스이다. 인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현한다
● JPA를 자바 컬렉션에 객체를 저장하듯 JPA에게 저장할 객체를 전달
● INSERT SQL을 작성하고 JDBC API 사용하는 반복적인 일을 JPA가 대신 처리해준다,
● CREATE TABLE 같은 DDL문을 자동으로 생성한다
● 데이터베이스 설계 중심의 패러다임을 객체 설계중심으로 역전
<객체를 저장하고 조회하는 코드>
객체 중심 개발을 좀 더 설명하자면,
JAVA에서 부모클래스와 자식클래스의 관계, 즉 상속관계가 존재하는데 데이터베이스는 이러한 객체의 상속관계를 지원하지 않는다(상속 기능을 지원하는 DB도 있지만 객체 상속과는 다르다) 이런 상속관계를 JPA는 아래와 같은 방식으로 해결했다.
위의 구조에서 만약 Album 클래스를 저장한다고 하면
그러면 JPA는 위의 코드를 아래의 쿼리로 변환해서 실행한다.
위처럼 저장하면 조회할때도 두 테이블을 엮어서 가져올 것이다. 조회하는 JAVA코드와 변환되는 쿼리를 보자
위와 가이 상속관계에 대한 접근도 제공해주는 객체지향에는 연관관계라는 것도 있다. 코드로 따지면 Class에서 또 다른 Class Type을 필드 변수로 가지고 있는 것이다. 객체관계와 이를 테이블 구조로 나타낸 아래 그림을 보자.
위의 그림은 Member 클래스가 Team타입의 team 필드 변수를 가지고 있는 형태인데, 아래는 코드이다.
그렇다면 Team 객체를 참조하는 필드를 가지고 있는 Member 객체는 어떻게 저장할까? 위에서 봤던 상속구조와 다를바가 없다. 아래의 JAVA 코드를 살펴보자
위처럼 Member 객체의 team 필드에 Team 객체를 Set하고 Member 객체를 DB에 저장하게 되면 JPA는 아래와 같은 코드를 데이터베이스에게 실행하라고 할것이다.
이렇게 저장 후 Member 객체만 조회하면, Team 객체 정보도 가져와서 Member 객체의 team필드에 주입해주기 때문에 아래와 같이 사용할 수 있다.
<저장,조회 실행 구조>
-저장
-조회
JPA에서는 수정 메소드는 제공하지 않는다. 그래서 JPA는 데이터 수정시, 매핑된 객체(테이블 데이터)를 조회해서 값을 변경 후 커밋하면 DB서버에 update 문을 전송하여 update를 실행한다.
'개발자 > workflow 리팩토링 프로젝트(SpringBoot,JPA,MySQL)' 카테고리의 다른 글
[RESTful API]개념 (0) | 2023.02.22 |
---|---|
[JPA] Entiy 맵핑(연관관계/어노테이션) (0) | 2023.02.19 |
[JPA] Entity란?(엔티티매니저/영속성/Hibernate/spring Data) (0) | 2023.02.18 |
[동기/비동기] callback 함수 (0) | 2023.02.14 |
♣[WF 프로젝트] SpringBoot JPA MySQL 연동/git hub 연동 / pull request 맛보기 (오류와의 전쟁) (0) | 2023.02.11 |