Wanna be Brilliant Full-Stack Developer
2/16 Spring OOP관점에서 모델링이란??? 본문
우리가 어떤 클래스를 만들떄 그 클래스를 Car라고 한다!
자동차가 있는데 만약에 굉장히 잘만든 엔진이라는 클래스도 있다.
그 잘만든 엔진을 그 자동차 클래스에서 사용하고 싶으면 상속은 할수 없다. 왜냐하면 상속은
이 자동차가 자식이고 엔진이 부모가되는 관계가 형성되면 자동차의 부모가 엔진이 되는것인데 말이 안된다.
자동차의 부모는 엔진이 아니다. 상속으로 구성할수 없고 콤포지션 이라는 방법을 사용해야하는데
결합(콤포지션) 해야한다!
만약에 자동차가 String name ; String color; 있으면 상속하는것이 아니라
Engine engine;
JPA는 데이터베이스를 먼저 만들고 데이터베이스에 만들어져있는 테이블을 통해서 Car클래스를 모델링 하는것이 아니라 클래스를 먼저 만들고 그다음에 클래스를 토대로 자동생성해서 데이터베이스의 테이블을 만들어주는 기법이기 떄문에!
engine는 하나의 데이터를 가지고 있는것이 아니라 오브젝트이기 떄문에 오브젝트는 여러가지의 데이터를 가지고 있을수 있다.
모든 클래스에 날짜를 넣고 싶다? 날짜는 공통되니까 TimeStamp createDate;를 넣고싶다
TimeStamp에 updateDate; 를 넣고싶으면? class car에도 동일하게 넣고 싶으면
class EntityDate 라고 해서 클래스를 하나 만들고 거기에다가 TimeStamp createDate; , TimeStamp에 updateDate; 만들고 애를 필요한곳에서 상속하면 된다!
이렇게 상속하면 데이터베이스 테이블에는 어떻게 만들어지냐면 엔진처럼 오브젝트를 들고 온게 아니라 상속을 하게되면 밑에 필드가 두개가 생긴거와 같은 효과를 내기 떄문에 옆에 붙는다.
방언 처리가 용이하여 Migration하기 좋음. 유지보수에도 좋음
유지보수에도 좋다는데 이게 무슨말인가???
우리가 Spring을하는데 JPA를 이용해서 DB에 접근한다. 이떄 만약에 JPA가 무조건 MySQL만 지원한다고하면 이 데이터베이스를 MySql만 사용할수 있따. JPA는 MySql만 지원할수 있는게 아니라 수많은 방언들을 지원해준다.
방언은 영어로 Dialect 방언의 종류가 많다 Oracle도 있고 MariDB도 있고 MSSQL있고 MySQl도 등등 많은데
우리는 이것을 정해놓고 사용하는것이 아니라 추상화 객체를 두고 추상화 객체가 DB에 달라붙어있는다
추상화 객체는 무엇인가? 오라클이 될수도 있고 Mysql도 될수도있고 머가 될지 모른다는거다.
밑에 오라클 끼어 넣으면 이제 오라클 되는거고 , 사용안할거면 삭제하고 사용하고 싶은 Mysql이면 MYsql을 만들어서 연결하면 추상화 객체는 MYsql이 도는것처럼 이렇게 구성되어있다.
Spring을 할떄는 JPA 돌릴떄 추상화 객체만 바라보고 있기 때문에 추상화 객체가 다양한 방언으로 바뀌든 상관없이 데이터베이스에 연결해서 사용할수 있기때문에 방언처리가 굉장히 용이하다.
내가 뭐 오라클을 사용하다가 더이상 오라클사용할수 없어서 MYsql을 사용한다고 하면 원래는 코드가 엄청나게 바뀌는데 서로 어떤 특정함수를 지원하는것이 어느 한부분에서는 지원안할수도 있는데 그리고 오라클에서 지원하는 어떤 조인문법에 플러스 문법같은게 Mysql같은곳에서 지원하지 않기떄문에 서로 다르기때문에 달라질때마다 스프링의 코드들이 달라져야하는데
그런거 없이 추상화 객체를 바라보고 JPA를 이용하게 되든 밑에 무엇을 갈아끼우든 상관없다.
우리 손이 있으면 권총이 있으면 총을 손으로 쏠수 있는데 권총이 리볼버, 다른 종류의 총이 있어도 손가락으로 트리거 할떄 총이 바뀌는것은 상관없다.
JPA는 쉽지만 어렵다? 헷갈릴수도 있지만 적응을하면 이렇게 좋은 기능이있나 쉽다가 많은 방대한 데이터를 처리하게되면 내부적으로 돌고 있는 쿼리가 무자비한 셀렉트를날릴때 나중에되면 어려울수도있따!
'Back-End > Spring Boot' 카테고리의 다른 글
2/17 SpringBoot 인기 페이지 & 프로필 Likes 카운트 구현 (0) | 2022.02.17 |
---|---|
2/17 SpringBoot Likes View Rendering (0) | 2022.02.17 |
2/16 SPRING with JPA 영속성 컨텍스트는 무엇인가? (0) | 2022.02.17 |
2/16 SpringBoot 좋아요 API 만들기 (0) | 2022.02.16 |
2/16 SpringBoot Likes 모델 만들기 (0) | 2022.02.16 |