ORM은 데이터베이스를 객체로 매핑함으로써 객체 간의 관계를 바탕으로 테이블을 만들고 관리하는 것을 말한다.
ORM을 사용하면 SQL문이 아닌 클래스의 메서드를 통해 데이터베이스를 조작할 수 있어서 개발자가 객체 모델만 사용해서 프로그래밍을 하는 데 집중할 수 있게 한다.
JPA의 경우 추상화된 데이터 접근 계층을 제공하기 때문에 특정 벤더에 종속적이지 않다. 즉 설정파일에서 어떤 DB를 사용하고 있는지 알려주기만 하면 얼마든지 DB를 변경할 수 있다.
스키마가 변경되었을 경우 Mybatis에서는 관련 DAO의 파라미터, 결과, SQL 등을 모두 확인하여 수정해야 하지만 JPA를 사용하면 이런 일들을 대신해준다.
직접 SQL을 작정하는 것보다 성능이 떨어진다. (물론 해결법 또한 존재한다.)
메서드 호출로 DB데이터를 조작하기 때문에 세밀함이 떨어진다. 복잡한 통계 분석 쿼리를 메서드만으로 해결하는 것을 힘든 일이다.
러닝커브가 있다.
ORM 에서 성능 이슈가 발생하면 가장 흔한 원인으로 N+1 Problem이 언급된다.
N+1 Problem은 쿼리 1번으로 N건의 데이터를 가져왓는데 원하는 데이터를 얻기 위해 이 N 건의 데이터를 데이터 수 만큼 반복해서 2차적으로 쿼리를 수행하는 문제이다.
예를들어 2개의 팀이있고 2명의 멤버가 각각 다른팀에 들어가 있다고 생각해보자.
이때 모든 멤버를 조회하게 된다면,
모든 멤버 조회 -> 멤버들의 팀이 비어있으니까 채워서 반환시키기 위해 팀을 각각 쿼리를 날려서 가져옴
위와 같은 순서로 쿼리가 날아간다. 멤버가 수천, 수만명이라고 생각하면 굉장히 비효율 적이다.
N+1의 의미는 쿼리를 1개 날렸는데 그것 때문에 추가쿼리가 N개 나간다는 의미이다.
RDBMS를 객체 지향 모델로 매핑하게 도와주는 인터페이스(?) 이다.
객체를 SQL statement에 매핑 시킬 수 있도록 도와준다.
또한 개발자가 작성한 SQL문으로 해당되는 Row를 읽어온 후 결과 값을 오브젝트화 시켜 사용가능하게 만들어준다.
JDBC를 사용했을때 발생하는 불필요한 코드들을 줄일 수 있다.
SQL이 코드와 분리되어 있기 때문에 유지보수가 편한다.
SQL 쿼리를 그대로 사용하기에 복잡한 JOIN, 튜닝 등을 좀 더 수월하게 작성 가능하다.
동적 쿼리 생성에 유용하다.
데이터베이스 설정 변경 시 수정할 부분이 너무 많다.
특정 DB에 종속적이다.
레퍼런스
https://ict-nroo.tistory.com/132
https://dreaming-soohyun.tistory.com/entry/JPA%EC%99%80-MyBatis%EC%9D%98-%EC%B0%A8%EC%9D%B4-ORM%EA%B3%BC-SQL-Mapper