일단 결론부터.
둘의 제일 큰 차이점은 쿼리문을 직접 쓰냐 안쓰냐 차이다.
그러면 당연히 두개의 장단점이 다를것이다. 자세히 알아보도록 하자 !
하지만 그전에 ORM, SQL Mapper 에 대해 알고있어야지 두개의 기술에 대해 이해가 갈 것이다.
- ORM (Object Relational Mapping)
사실 직역만 해봐도 어떤 기술인지 감이 올 것이다.
객체-관계 매핑 -> 자바 진영에서의 객체 데이터와 RDBMS(관계형 데이터베이스)의 데이터를 자동으로 매핑(연결) 시켜준다는 의미이다. 여기서 객체 데이터는 클래스를 의미하고 RDBMS 데이터는 테이블을 의미한다. 고로 다음과 같은 장단점들이 존재한다.
장점
- 쿼리문을 직접 작성할 필요가 없다. (자동)
- 코드를 객체지향적으로 짤 수 있기에 직관적이며 개발자가 비지니스 로직 개발에 더 집중할 수 있다.
- 전반적인 코드의 양이 줄어든다.
- 객체지향설계 덕분에 재사용 및 유지보수가 편리하다.
- 만약에 RDBMS 교체를 한다고 해도 Object로 설계를 하였기에 직접 쿼리를 작성하는 SQL Mapper 방식보다 리스크와 시간 비용이 적다. (DB에 종속적이지 않다고 말할 수 있다)
단점
- 설계과정에서 많은 비용이 든다. (사용하기 편하지만 만약에 초반에 설계를 잘못하면 나중에 낭패다...)
- 프로젝트의 규모가 크고 복잡성이 커지면 난이도가 상승한다. (ex. 통계와 같은 복잡한 쿼리문을 필요로할때. 물론 직접 쿼리를 작성할 수 도 있다)
- 복잡해짐에 따라 성능이 크게 저하할수 있다.
- SQL Mapping
ORM이 직접 쿼리문을 안쓰는것이였다면, 요 아이는 직접 쿼리문을 작성하여 결과값을 가지고 어떤 객체에 매핑할지 결정한다. 그만큼 단순하며 처음에 배우기에 편하다. 하지만 이 역시 단점들이 존재하며 다음과 같은 장단점이 있다.
장점
- 쿼리문을 직접 작성하기에 세밀한 작업이 가능하며 변경이 편리하다.
- SQL 작성을 잘 한다면 JPA보다 편할수도?....
- SQL이 비지니스 로직과 분리가 되있기에 유지보수가 편할 수 있다. (이건 케바케)
단점
- 만약 DBMS 교체시 기존에 사용한 SQL문의 재사용이 어렵다. (Oracle과 MySql은 지원하는 기능과 사소한 쿼리문의 형태도 다르다).
- 여러대의 DBMS를 지원해야 될때도 SQL문의 특징이 달라 어렵다...
- 개발자가 직.접. SQL을 작성해야한다 (시간적으로 손해)
- 객체와 테이블간 패러다임 불일치 발생 쌉가능.......
- 이 정도면 걍 ORM을 쓰라는거다. 물론 프로젝트의 설계 기준에 따라 SQL Mapping기술을 쓰는게 훨씬 이득일 수 있다.
JPA (Java Persistence API) - ORM
ORM 기술을 적용한 JPA는 자바 진영의 ORM 기술 표준이다.
자바 ORM 기술에 대한 API 표준 인터페이스를 모아 둔 것이라고 생각하면 된다. 대표적인 오픈 소스로 Hibernate가 있으며, CRUD 메소드를 기본으로 제공합니다. 또한 1차 캐싱, 쓰기지연, 변경감지, 지연로딩을 제공합니다. 이외에 장단점은 ORM 기술에 서술해놓은것과 동일합니다.
VS
Mybatis - SQL Mapper
자바에서 SQL Mapper를 지원해주는 프레임워크 입니다.
쿼리문을 xml로 분리가 가능하며 SQL을 직접 작성하여 쿼리 수행 결과를 원하는 객체와 매핑이 가능합니다. 복잡한 쿼리문 작성이 가능하며 데이터 캐싱 기능으로 성능 향상이 가능합니다. 이외에 장단점은 SQL Mapper에 서술해놓은거소가 동일합니다.
그래서 둘 중 뭐 쓰는게 좋아요?
정답은..........!
상황에 따라서 달라요 ^^
은행과 같은 업무의 비지니스를 개발해야된다면 통계와 같은 복잡한 쿼리를 사용해야 하니 Mybatis를 사용하는게 이득일 수 있습니다.
하지만 Mybatis는 기본적인 CRUD조차 개발자가 직접 작성해줘야 하는 등 비지니스 로직을 개발하는데 집중을 하기 힘들 수 있습니다. 진행하고자 하는 프로젝트의 쿼리 복잡성과 DBMS을 여러개를 쓰거나 옮겨야할 경우 등 여러가지 요인에 따라 잘 생각해야 하며 상황에 맞는 기술을 선택하는게 정답입니다 :)
오늘도 슬기로운 코딩 생활 하시길 바라며 궁금하신점이나 부족한점은 댓글로 피드백 주시면
너무 감사하겠습니다 !
728x90
'Spring & Spring Boot' 카테고리의 다른 글
[Spring] JPA 변경감지와, 병합을 통한 Update (0) | 2023.03.15 |
---|---|
[Spring] JPA의 기본 CRUD를 사용해보자 ! (0) | 2023.03.14 |
[Spring] @Autowired, @Inject, @Resource 차이점 정리 (1) | 2023.03.06 |
Spring JPA? Java Presistence API 가 뭘까요 ! (0) | 2023.02.01 |
Spring AND Spring Boot ? (0) | 2023.01.17 |