DevBoi

[JPA] JPA 기초 개념공부 본문

Develop/[JPA]

[JPA] JPA 기초 개념공부

HiSmith 2021. 7. 23. 00:14
반응형

JPA 는 개발자가 SQL을 쓰지 않고, 개발을 할수 있게 해준다.

즉, 객체에 SET,GET을 하는 것으로 SELECT, INSERT 작업을 할수 있게해준다.

 

JPA는, Learning curve가 심해서, 자세히 모르고, 실무에 도입하게 되면 망한당

 

우선 SQL중심적인 개발이, 현재 중요한 키워드이다.

CRUD를 짜고, SQL을 짜고.... 애플리케이션 개발이... 객체 지향인데 SQL에 목을 메게된다.

SQL 개발의 문제는..?

 

1. 필드추가할때

한개의 필드가 추가되면, 전체 SQL이 도는 곳에 전체 필드를 추가해줘야한다.

즉 SQL 의존적 개발을 하게된다.

 

2. 패러다임의 불일치

객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성등 많은 걸 지원해준다.

객체와 관계형 데이터 베이스의 차이가 있다.

상속, 연관관계, 데이터 타입, 데이터 식별 방법 등등이 객체와, db에 넣을때 패러다임이 

불일치 하게 된다.

 

또한, 생산성 측면에서도 고려를 많이해야한다.

두 테이블의 JOIN 이 들어가는 경우, 객체 지향적인 개발을 할때는 특정

class 내, 참조 class를 변수로 넣으면 되지만, sql로 할때는 member.getTeam().getid()

이런식으로 해야하고, 심지어 조회를 할때도 문제가된다. 테이블이 2개라면 2개 테이블 join

3개,4개라면 그 개수마다 join이 된다. 이렇게 되는 코드는 심지어 엄청난 방대한 량의 쿼리를

탄생시켜 유지보수가 불가능할 정도로 만든다.

 

추가로, 비즈니스 로직상, 추가되야하는 범위가 있다면?

SQL 지향적으로 개발을 한다고 가정하자.

처음에 MEMBER와 TEAM에 대한 데이터들을 탐색해서 가져온다.

추후에, 특정 회원에 대해서 ORDER테이블에 대한 데이터도 필요하다.

SQL 중심개발이 되면, 해당 ORDER테이블을 추가로 JOIN이나 LEFT OUTER JOIN걸어주는 쿼리를

작성하거나, 처음에 가져올때 3개 테이블을 JOIN해야한다

 

안그러면 해당 getOrder()을 하게되면 null이기 떄문이다.

이게 바로, 엔티티 신뢰 문제이다. 또한 계층 분할이 어렵다.

 

ORM이란?

ORM framework, Object-relational mapping 이게 뭘까?

개발자는 Object 위주로 관리및 개발을 하고, RDB 즉 관계형 DB와의매핑은

이 Framework이 해준다는 것이다.

 

JPA는 애플리케이션과, JDBC API 사이에있다.

즉, 애플리케이션이 JPA를 호출, JPA는 JDBC API를 호출, 데이터베이스를 호출

이런방식으로 설계가되어있고, 동작한다.

 

기존 mybatis의 경우, mapper를 통해서, sql을 날리고,

이거에 대한 result를 result map에 담고, 매핑할 객체url을 작성하고 해야한다.

하지만 ORM framework에서는 ? 이 결과에 대한 매핑을 알아서 지원해준다.

 

JPA는 persist,find,setName,remove 등으로 기존 

쿼리없이도, DB에 저장,조회,수정,삭제가 가능하게 해준다.

 

또한 , 상속관계의 개념에서도, persist를 해주면,

부모 객체, 자식 객체에 대한 저장을 자동으로 해주고, 조회도 이를 지원해준다.

 

1. JPA 의 성능 최적화 기능

- JPA에서도, 중간계층이기 때문에 1차 캐시와 동일성 보장을 해준다.

같은 트랜잭션 안에서, 같은 엔티티를 반환 해준다. 약간의 조회 성능을 향상해준다.

같은 트랜잭션에서 동일 객체에 대한 조회를 한다면,

해당 조회 결과를 메모리에 올려놓고, 동일 객체를 호출하면,

sql을 호출하지않고, 메모리에 올라온 녀석을 바로 반환해준다.

- JPA를 사용하면, 비슷한 쿼리들을 트랜잭션으로 하나로 묶어서 한번에 보낸다.

즉 여러개의 쿼리를 날릴때, 네트워크를 여러번 타지않고, 한번만 타서, 전체를 commit한다.

 

-JPA 지연로딩, 즉시 로딩

지연로딩 , 즉 Lazy type은

처음에 find로, 특정 객체를 호출할떄는 해당 객체에 대한 테이블만,

그리고, 추가로 테이블 하위 객체에 대한 find를 할때, 해당 객체에 대한 테이블을 조회하는 방식이다.

반면 즉시로딩은, 특정 객체를 find할떄, 하위 객체에 대한 것들도 한번에 join 해서, find를 해오는 방식이다.

 

 

 

반응형

'Develop > [JPA]' 카테고리의 다른 글

[JPA] Entity Mapping, Table Managing  (0) 2021.07.28
[JPA] JPA 영속 컨텍스트  (0) 2021.07.26
[JPA] 기초 CRUD 사용 해보자  (0) 2021.07.23
[JPA] JPA N+1 문제란?  (0) 2021.07.12
JPA란 무엇일까????  (0) 2021.06.28