인프런 스프링부트 개념정리(이론)
이 글은 다음 강의의 이론 정리 글 입니다.
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
id | name | color | engineId |
---|---|---|---|
1 | BMW | white | 2 |
2 | Sonata | black | 1 |
Engine
id | power |
---|---|
1 | 2000 |
2 | 4000 |
이 때, 모든 클래스에 날짜를 적고싶다하면
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
id | name | color | engineId | createDate | updateDate |
---|---|---|---|---|---|
1 | BMW | white | 2 | ||
2 | Sonata | black | 1 |
Engine
id | power | createDate | updateDate |
---|---|---|---|
1 | 2000 | ||
2 | 4000 |
연관관계는 annotation 키워드를 쓰면 되는데 나중에 코드로 설명
Spring은 JPA를 이용해서 데이터베이스에 접근을 한다. 이때 JPA가 무조건 MySQL만 지원을 한다면 데이터베이스를 MySQL밖에 못쓸 것이다. 하지만, JPA는 Oracle, MariaDB, MSSQL, MySQL, Postgre 등 수많은 방언(dialect)들을 지원해준다.
그래서 어느 하나를 정해놓고 사용하는게 아니라 JPA에 추상화 객체를 두고, 이 추상화 객체가 데이터베이스에 붙어있다. 추상화 객체에는 내가 사용할 데이터베이스를 설정해서 연결해주면 된다.
마치 손은 그대로 있고 총이 계속 바뀐다고 한들 손가락이 트리거를 당긴다는 행위에는 변화가 없는 것과 같다.
처음 접하면 일반적으로 RDBMS를 하다가 OOP 방식의 처리를 사용하는 JPA 개념이 헷갈린다. 하지만 적응하게 되면 편리하고 쉬울 것이다. 하지만 또 다시 방대한 데이터를 접하게 되면 이 JPA 쓸데없이 무자비한 select를 날리기 때문에 이를 관리하려면 다시 어려울 수 있다.