Springboot

Spring boot/JPA /DB 기본 개념 테이블과 오브젝트(2){JPA의 ORM기술}

25G 2021. 7. 1. 17:47

ORM 기술

 

jpa의 뜻은 java persistence API이다 persistence는 영속이란 뜻이다. 자바로 영구히 데이터를 저장할 수 있는 API라는 뜻이다. 영구히 데이터베이스에 저장할 수 있도록 함수를 제공해주는 것이다.

jpa의 기반 기술은 hirebernate =>ORM(오브젝트 릴레이션 매핑) 기술을 사용한다

 

실습

일단 저번 포스팅에서 사용했던 테이블의 데이터를 다 날리고 새로 만들어 보자

 

기존에 있던 폴인키는 int 타입에 userId로 돼있었는데 그 폴인키를 지우고 위와 같이 코딩해줬다

위 주석은 중요한 내용이니 꼭 숙지해야 한다. 그리고 저장을하면 CREATE가 돼있기 때문에 테이블이 새로 생성되는데

 

 

위 주석처럼 jpa에서 자동으로 폴인키를 설정해준다.

@ManyToOne을 알면 이제부터는 post만 select하면 user오브젝트를 알아서 조인시켜 준다는 것이다. 귀찮은 작업을 생략할 수 있게 해주는것이다.

위 내용을 insert 해주자

 

insert를 해준후에 위와같이 코드를 작성하고 해당 함수를 때리면 자동으로 join 된 자료가 나오는 것을 확인할 수 있다.

jpa에서 제공한@ManyToOne기능이 위와같은 복잡한 쿼리들을 자동으로 join 되도록 해주는 것이다.

 

위 함수를 실행시키면 

Hibernate: select user0_.id as id1_1_0_, user0_.address as address2_1_0_, user0_.email as email3_1_0_, user0_.password as password4_1_0_, user0_.username as username5_1_0_ from user user0_ where user0_.id=?

이러한 쿼리문이 콘솔에 출력된다(show-sql 설정을 해줬기때문).  

 

실험을 위해서 하나의 함수를 더 만들었다

실행시키면

Hibernate: select post0_.id as id1_0_0_, post0_.content as content2_0_0_, post0_.title as title3_0_0_, post0_.user_id as user_id4_0_0_, user1_.id as id1_1_1_, user1_.address as address2_1_1_, user1_.email as email3_1_1_, user1_.password as password4_1_1_, user1_.username as username5_1_1_ from post post0_ left outer join user user1_ on post0_.user_id=user1_.id where post0_.id=?

위 함수의 uri를 때리면 위와 같은 쿼리가 실행됐다라는 것이 콘솔에 출력된다.

위 데이터를 보면 하나의 오브젝트가 리턴이 된 것을 확인할 수 있다.

 

여기서 제가 두 번째 함수를 실행시켰을 때는 left outer join이 실행됐다. 어떤 데이터는 그냥 select를 하고 어떤 데이터는 join 된다. 이 두 데이터의 차이는 무엇일까?

 

 

어떤 테이블을 드라이빙 테이블(비교하는 쪽)로 하고 어떤 테이블을 드리븐 테이블(비교당하는 쪽)로할까?

위 두 테이블을 조인을 한다고 할 때

1. 두 테이블을 메모리에 올린다.

2. 메모리에 올라온 데이터를 조인시키기 위해 순차적으로 연산하여 비교한다.

이 비교시키는 과정에서 속도의 차이가 나는 것이다. 그래서 이 비교 횟수를 최소화할 수 있도록 설계하는 것이 굉장히 중요하다

공식

1. 1:N이 있다고 가정하면 N에 폴인키가 있는 게 보편적이다

2. 드라이빙 테이블에는 폴인키가 있는 게 보편적으로 좋다.

 

jpa를 사용한다고 쿼리를 공부할  필요가 없는 것이 절 때 아니다. 단지 단순한 퀴리를 작성하는 귀찮음을 덜어주는 API일 뿐이다. 그리고 java에서 오브젝트로 db에 모델링할 수 있게 해 준다

 

짤막 팁

unique속성을 달아주면 칼럼 내에 데이터 중복을 금지시킬 수 있다. length는 최대 길이 값을 설정하는 것이다.

@JoinColumn에 name값을 위와 같이 설정해주고 db에 select 해보면

바뀌어있다.