SpringBoot 개념정리(7) - 2. JPA란?

Jang Seowoo·2022년 8월 19일
0
post-thumbnail

인프런 스프링부트 개념정리(이론)
이 글은 다음 강의의 이론 정리 글 입니다.


OOP 관점에서 모델링이란 무엇일까요?

6) JPA는 OOP의 관점에서 모델링을 할 수 있게 해준다. (상속, 콤포지션, 연관관계)

Class Car {
	int id; (PK)
	String name;
    String color;
    Engine engine;
}

Class Engine {
	int id;
    int power;
}

다음과 같이 Car 클래스와 Engine 클래스가 있을 때, Car와 Engine은 상속관계는 아니다.(Car의 부모는 Engine이 아님) 따라서, 콤포지션(결합)을 해야된다.

JPA는 데이터베이스를 먼저 만들고 데이터베이스에서 만들어져있는 테이블을 통해서 Car 클래스를 모델링하는게 아니라, 자바에서 Car 클래스를 먼저 만들고 클래스를 토대로 데이터베이스에 자동생성해서 다음과 같이 테이블을 만들어준다.

Car

idnamecolorengineId
1BMWwhite2
2Sonatablack1

Engine

idpower
12000
24000

이 때, 모든 클래스에 날짜를 적고싶다하면

Timestamp createDate; 
Timestamp updateDate;

다음과 같이 위의 코드가 다양한 클래스에서 반복된다.

Class Car {
	int id; (PK)
	String name;
    String color;
    Engine engine;
    Timestamp createDate;
    Timestamp updateDate;
}

Class Engine {
	int id;
    int power;
    Timestamp createDate;
    Timestamp updateDate;
}

반복을 줄이기 위해 우리는 한번에 날짜를 담는 Class를 만들어줄 수 있다. 그리고 이를 다양한 Class에 상속시킨다.

Class EntityDate {
	Timestamp createDate;
    Timestamp updateDate;
}

Class Car extends EntityDate {
	int id; (PK)
	String name;
    String color;
    Engine engine;
}

Class Engine extends EntityDate {
	int id;
    int power;
}

그러면 데이터베이스는 다음과 같이 열이 추가 생성된다.

Car

idnamecolorengineIdcreateDateupdateDate
1BMWwhite2
2Sonatablack1

Engine

idpowercreateDateupdateDate
12000
24000

연관관계는 annotation 키워드를 쓰면 되는데 나중에 코드로 설명

7) 방언 처리가 용이하여 Migration 하기 좋다. 유지보수에도 좋다.

Spring은 JPA를 이용해서 데이터베이스에 접근을 한다. 이때 JPA가 무조건 MySQL만 지원을 한다면 데이터베이스를 MySQL밖에 못쓸 것이다. 하지만, JPA는 Oracle, MariaDB, MSSQL, MySQL, Postgre 등 수많은 방언(dialect)들을 지원해준다.

그래서 어느 하나를 정해놓고 사용하는게 아니라 JPA에 추상화 객체를 두고, 이 추상화 객체가 데이터베이스에 붙어있다. 추상화 객체에는 내가 사용할 데이터베이스를 설정해서 연결해주면 된다.

트리거
마치 손은 그대로 있고 총이 계속 바뀐다고 한들 손가락이 트리거를 당긴다는 행위에는 변화가 없는 것과 같다.

8) JPA는 쉽지만 어렵다.

처음 접하면 일반적으로 RDBMS를 하다가 OOP 방식의 처리를 사용하는 JPA 개념이 헷갈린다. 하지만 적응하게 되면 편리하고 쉬울 것이다. 하지만 또 다시 방대한 데이터를 접하게 되면 이 JPA 쓸데없이 무자비한 select를 날리기 때문에 이를 관리하려면 다시 어려울 수 있다.

profile
https://devseowoo.notion.site/Seowoo-Portfolio-b21365c3477345818913e8d8fe2e3b90

0개의 댓글

관련 채용 정보