[JPA] JPA 알아보기
들어가기에 앞서
우리가 개발을 하다보면 의아한점들을 느낄 수 있다. 언어도 객체지향이고 코드도 객체지향적으로 짜는데 DB와 매핑할려고보면 객체지향적인 코드가 나오지 않게된다. 이것은 우리가 사용하는 RDB와 객체지향과의 패러다임의 불일치에서 나오는 문제일 것이다.
일반적으로 RDB를 많이 사용하고있는데, RDB는 SQL로만 동작하는 시스템으로 객체라는 개념이 없다. 하지만 우리는 코드를 작성할 때 객체지향적으로 작성하고 이 코드로 가져오는 데이터들을 저장하기 위해서 RDB를 사용한다. 그래서 결국 DB에 맞게 코드를 다시 바꾸게 되는 것이다.
이런 방식으로 개발을 하다보면 어느샌가 SQL중심의 코딩을 하고있는 자신을 볼 수 있다. 똑같은 쿼리를 몇번이나 반복해서 작성하고 테이블에서 하나의 컬럼이 변경되면 수 많은 쿼리들을 다시 수정하는 등의 항상 지루한 작업들을 반복적으로 수행하게된다.
이러한 문제들을 해결해 줄 수 있는 것이 바로 JPA이다.
JPA란 무엇인가
JPA(Java Persistence API)는 자바 표준 ORM으로서 자바와 RDB를 매칭해주는 역할을 하게된다. 기존에 우리가 직접 하던 쿼리매핑을 이 JPA가 대신 해주는 것이다.
보통 우리가 JAVA에서 DB와 연결하기 위해서 JDBC와 같은 데이터베이스에 접속할 수 있는 API를 사용하는데 JPA는 JAVA와 JDBC사이에서 무언가의 역할을 대신 수행해준다.
우리가 코드를 보내면 JPA에서 코드를 풀어 SQL로 변환한다음 JDBC로 매핑을 시켜주는 것이다. 그럼 그대로 DB에 저장이 될것이고 반대로 DB에서 가져올 떄도 JPA가 중간에서 우리가 원래 하던일들을 대신해준다.
이 JPA는 단순히 코드를 쿼리로 변경해주는 정도뿐만이 아니라 가장 큰 문제였던 '패러다임 불일치'의 문제도 해결해준다.
이제 몇가지 예시를 살펴보자
패러다임 불일치 해결
만약 Member라는 객체와 Team이라는 객체가 있고 Team객체가 Member객체에 종속된다고 해보자. 그렇다면 Member라는 객체안에 Team 객체를 넣을 수 있을것이다.
여기서 JPA가 아닌 방식으로 데이터를 가져올 때는 아래의 코드처럼 될 것이다.
class Member {
Long idx;
String name;
int age;
Long teamId;
}
class Team {
Long idx;
String name;
}
class Main {
Member member = memberService.findById(1L);
Long teamId = member.getTeamId();
Team team = memberService.findById(teamId);
}
위의 코드에서 Team객체를 가져와야 할 경우에는 Member객체를 가져온 후 teamId를 꺼낸 뒤 이 teamId값을 이용해서 다시 Team객체를 조회해야한다. 이것은 우리가 자바에서 사용하던 객체를 사용하는 방식이 아니므로 '패러다임의 불일치'라고 하는 것이다.
JPA는 이 패러다임 불일치의 문제를 해결해준다.
class Member {
Long idx;
String name;
int age;
Team team;
}
class Team {
Long idx;
String name;
}
class Main {
Member member = memberService.findById(1L);
Team team = member.getTeam();
}
Member객체에서 바로 Team객체를 가져올 수 있고 부모-자식의 관계가 확실하게 보인다. (getter는 생략했다.)
나중에 나올 글에서 설명하겠지만 내부적으로 쿼리가 동작하는 것을 살펴보면 Member객체를 조회하면서 Team객체도 함께 조회해서 JPA가 관리하고있는 것을 알 수 있다.
반복적인 쿼리문 해결
우리는 개발을 하다보면 어쩔 수 없이 반복적인 쿼리들을 짜게된다. CRUD와 같은 쿼리들은 간단하고 형식도 비슷하지만 필요에 의해서 계속해서 찍어낸다. 그 와중에 테이블 컬럼이 변경이라도 되는 날에는 관련된 컬럼이 있는 쿼리들을 전부 찾아서 수정해주어야 한다. 이것은 번거롭기도 하지만 사람인 이상 놓칠 수도 있다. 하지만 이런 실수는 실무에서는 너무 큰 영향을 가져온다.
JPA는 기본적은 CRUD쿼리를 지원해주므로 직접 쿼리를 작성할 필요가 없어진다. 위의 '패러다임 불일치' 해결방법을 살펴볼 때 작성한 코드중 하나를 살펴보자
....
class Main {
Member member = memberService.findById(1L);
Team team = member.getTeam();
}
Member객체를 가져오는데 단순히 findById를 사용하면 끝이다. 만약 MyBatis라면 xml에 쿼리문을 작성해서 그 쿼리문과 매핑시켜주는 작업을 해야겠지만 JPA는 쿼리문을 작성할 필요가 없다. 물론 복잡한 쿼리는 직접 작성하긴 해야한다. 하지만 이것도 라이브러리를 이용해서 기존보다 깔끔하게 해결할 수 있다.
JPA는 상상이상으로 우리에게 편리함을 제공해 줄 것이고 배우고 익숙해진다면 개발이 이전과는 다르게 훨씬 깔끔해질 것이다.
'JPA' 카테고리의 다른 글
QueryDSL 사용이유와 사용방법 (0) | 2022.06.22 |
---|---|
연관관계 매핑(단방향) (0) | 2022.04.09 |
[JPA] 영속성 컨텍스트 (0) | 2022.02.01 |
[JPA] EntityManager (0) | 2022.02.01 |
[JPA] 프로젝트 생성 (0) | 2022.01.31 |
댓글
이 글 공유하기
다른 글
-
연관관계 매핑(단방향)
연관관계 매핑(단방향)
2022.04.09 -
[JPA] 영속성 컨텍스트
[JPA] 영속성 컨텍스트
2022.02.01 -
[JPA] EntityManager
[JPA] EntityManager
2022.02.01 -
[JPA] 프로젝트 생성
[JPA] 프로젝트 생성
2022.01.31