SpringBoot와 JPA를 사용하면서 제대로 된 이해도가 낮다고 생각해서 JPA의 개념에 대해서 공부해보고, 끄적여보았습니다.. 틀린 점이나 이상한 점 있으시면 조언해주시면 감사드리겠습니다.
객체지향적 개발 vs SQL 매핑
처음 Java라는 객체지향언어를 처음 배우고, 웹에 관심을 가지게 되면서 MVC 같은 디자인패턴도 배우고, 구조적인 부분이나 개발방법 등 기초적인 부분에 대해서 관심을 많이 가지기 시작했다.
하지만 Spring을 배우고, 익숙해지면서 서로 다른 프로젝트를 해도 내 프로젝트 구조는 점점 획일화되고, 주구장창 SQL매핑만 하고있는 나를 발견하게 되었다.
SQL매핑에 신경을 쏟다보니 나에게 객체지향은 의미가 없었다..객체지향이 뭐더라
JPA?
iBatis, Mybatis 밖에 모르던 때에 개발을 하면 SQL매핑만 잘하고 쿼리 잘 짜면 장땡인 줄 알았다.
하지만 Mybatis같은 것은 ORM이라고 불린다는 것을 알고, 다른 ORM은 없나하고 찾아보다가 알게된 것이 JPA였다. (무려 Java ORM 표준)
내가 느낀 JPA는 서로 상반된 사상을 가진 객체지향과 RDBS 사이를 연결을 시켜주는 ORM역할을 하고, 철저하게 분리 시켜주는 역할을 해주는 것 같아보인다. 그럼 Mybatis도 ORM인데 더 나은 점이 무엇이길래 열광하고, 인기가 있을까?
JPA를 사용해야하는 이유(장점)
- SQL 중심적인 개발이 아닌 객체중심으로 개발을 할 수 있다.
- 이러한 이유때문에 비즈니스로직에 집중할 수 있게된다.
- 생산성
- 쿼리를 작성할 필요없이 jpa가 대신해준다.
- 유지보수
- 객체중심의 개발이므로 실제 테이블에서 컬럼이 수정,추가,삭제 되었을 때 개발자는 필드만 수정하면된다.
- 패러다임의 불일치 해결
- 상속
- 저장
- 조회
- 연관관계
- 신뢰할 수 있는 엔티티, 계층
- 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.(Java Collection처럼)
- 상속
- RDBS와 객체사이에서 동작하기 때문에 성능 상에서 문제가 생길 수 있다고 생각하지만 개발하기 나름이다. 중간 레이어가 있다는 것은 양날의 검이다.
- 지연로딩
- 객체가 실제 사용될 때 로딩
- 즉시로딩
- JOIN SQL로 한번에 연관된 객체까지 미리 조회
- JPA가 쿼리를 작성하고 지원하는 기능이 많다고 해서 그냥 아무생각없이 사용하면 안되고, 알고 써야한다! 근본이 중요하다.