제이제이
article thumbnail

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


다음과 같이 자바코드로 자동차를 의미하는 Car클래스엔진을 의미하는 Engine 클래스가 있습니다.

Car 클래스(자동차를 의미)

class Car{
 int id;
 String name;
 String color;

}

 

Engine 클래스(엔진을 의미)

class Engine{
 int id;
 int power;
}

 

❓Car클래스에서 Engine을 나타내고 싶다면?

🔥 상속이 아닌 결합(콤포지선)을 이용해 나타내야합니다.

 

❓왜 Car클래스에서 Engine을 상속하면 안되는가?

🚨 만약 상속을 하게 되면 Engine클래스가 부모 클래스가 되고 Car 클래스는 자식 클래스가 됩니다.
      즉, 자동차의 부모가 엔진이 되기 때문에 상속을 통해서는 처리하면 안됩니다.

OOP관점에서의 모델링을 한 결과

위의 Car 클래스와 Engine 클래스를 OOP관점에서 다음과 같이 만들 수 있습니다.

 

Car 클래스(자동차를 의미)

class Car{
 int id;
 String name;
 String color;
 Engine engine;
}

 

Engine 클래스(엔진을 의미)

class Engine{
 int id;
 int power;
}

 

JPA는 클래스를 먼저 만들고 해당 클래스를 대상으로 자동으로 DB 테이블을 만들어 준다고 이전에 알아봤었습니다.

그 다음으로 JPA를 통해 위의 두 클래스가 DB에서 어떻게 생기는지 알아봅시다.

DB에서 생성될 Car,Engine 클래스

JPA를 통해 위의 Car클래스와 Engine 클래스는 다음과 같이 생성됩니다.

정리

위의 내용을 정리하면 다음과 같습니다.

그 다음으로 위에서 보지 못했던 상속에 대해서도 살펴봅시다.

상속

만약 위의 Car 클래스Engine 클래스만든 날짜와 업데이트된 날짜를 넣고 싶으면 어떻게 할까요?

먼저 만든 날짜와 업데이트를 날짜를 표시하는 EngineDate클래스를 새로 생성합니다.

 

EntityDate클래스(만든 날짜와 업데이트 날짜를 표기)

class EntityDate{
    TimeStamp createDate;
    TimeStamp updateDate;
}

 

그 다음 Car클래스Engine클래스에 EntityDate클래스를 상속하면 됩니다.

Car 클래스(자동차를 의미)

class Car extends EntityDate{
 int id;
 String name;
 String color;
 Engine engine;
}

 

Engine 클래스(엔진을 의미)

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

 

그럼 DB에서는 다음과 같이 Car클래스Engine 클래스에 Entity Date의 필드가 추가되어 생성됩니다.

7. 방언처리가 용이하여 Migration과 유지보수를 하기에 좋습니다.


스프링은 JPA를 통해 DB에 접근하는 방법에 대해서 알아봤습니다.

사실 데이터베이스를 관리하는 시스템(DBMS)들은 여러개가 있습니다.

 

❓그런데 JPA가 MySQL만 지원한다면??

🚨 MySQL를 통해서만 DB에 접근이 가능하다는 문제점이 있습니다.

 

또한 각 DBMS들마다 표준 SQL외에 사용하는 서로 다른 SQL문들이 존재합니다.

 

각 DBMS들은 표준 SQL외에 제공하는 SQL구문들??

🚨 SQL은 모든 DBMS에서 사용가능한 표준 ANCI SQL이 있고 각 DBMS마다 제공하는 SQL문들이 존재합니다.

 

  • 대표적으로 Oracle DBMS에서 사용하는 PL/SQL이 있습니다.
  • 각기 다른 DBM에서 만든 SQL문은 자신들만의 독자적인 기능을 추가하기 위해 만든 것이므로
    사용하는 해당 DBMS에서만 사용이 가능합니다.

따라서 Oracle의 DBMS에서 Mysql의 DBMS로 변경할 때
Oracle사에서 사용하던 SQL문이라도 Mysql로 변경할 때 수많은 SQL문들을 변경해야 합니다.

이러한 각 DBMS마다 별도로 사용하는 SQL문 들을 우리는 방언(dialect)라고 합니다.

 

❓방언이란?

🔥 각 DBMS마다 표준 ANSI SQL외에 별도로 사용하는 SQL문을 의미합니다.

JPA의 방언(dialect)처리

 

❓JPA는 어떻게 방언을 처리할까?

🔥 JPA에서는 방언(dialect)를 설정할 수 있는 추상화 객체(추상화 방언 클래스)를 제공하고
      설정된 방언으로 각 DBMS에 맞는 구현체를 제공합니다.

ex)

Oracle DB를 사용하다가 MySQL을 사용하고 싶다면 방언(dialect)를 Mysql로 설정하면 됩니다.
즉, DBMS의 종류에 상관없이 자신이 사용하고 싶은 DBMS를 변경하여 사용할 수 있습니다.

이를 그림으로 살펴보면 다음과 같습니다.

8. JPA는 쉽지만 어렵다.


JPA는 RDBMS와 달라 처음에 접할 때는 어렵지만 익숙해질수록 쉽습니다.

 

📒 Reference(참고자료)


 

[무료] 스프링부트 개념정리(이론) - 인프런 | 강의

스프링부트를 공부하며 헷갈리는 개념이 많았던 분 스프링부트에 대해 공부하고 싶었던 모든 분, - 강의 소개 | 인프런...

www.inflearn.com

 

profile

제이제이

@아사비치즈스틱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!