SQL Mapper, ORM, JDBC, JPA 정리
대충 개념만 알고있는 것들
블로그 글을 보면 오~ 싶은데 안보고 설명하라면 제대로 설명 못할 것들
1. SQL Mapper
SQL문을 이용하여 RDB에 접근, 데이터를 오브젝트(객체)화 시켜준다.
다른 블로그를 보면 다들 저렇게 써놨다. 저 `객체화` 라는 말이 이해가 어렵다
쉽게 말하자면, 쿼리를 매핑해서 DB에 쿼리를 날리고, 거기서 나온 결과를 우리가 만든 Application에서 사용할 수 있게 해준다는 것.
Application에서 DB를 직접 다루도록 도와주는 친구...라고 생각하면 될거같다
- 말그대로 SQL로 RDBMS와 Application을 연결(Mapping)해주는 친구
- 개발자가 직접 쿼리를 작성해서 해당 DB에서 결과를 가져옴 >>>> 직접 DB 데이터를 조작
- SQL 따로, 비즈니스로직 따로 분리됨 >>>> 비즈니스가 복잡하거나 안정적이어야 한다면 SQL Mapper 추천됨
- 물리적으로는 분리.
- 논리적으로 강하게 결합 (DBMS에 종속적이기 때문에) >>>> DTO를 쓴다면 DB 변경시 DTO를 다 바꿔줘야함.
- 디테일하게 쿼리를 작성 가능(Good)
- 기본적인 쿼리도 직접 써야함(Bad)
- DBMS마다 문법이 달라서 DBMS에 종속적(Bad) >>>> DBMS가 바뀌면 쿼리를 다 바꿔야해서 곤란해짐
- ex) MyBatis, JDBCTemplates
- 결국 JDBC는 SQL Mapper중 하나
2. ORM (Object-Relation Mapping)
SQL Mapper가 Application에서 직접 DBMS에 쿼리로 접근했다면, ORM은 Application과 DBMS 사이에 ORM을 끼고 DBMS에 접근한다.
- Application의 객체를 DBMS의 스키마와 매핑 (Good)
- 객체와 DBMS의 관계를 바탕으로 자동으로 SQL을 생성 및 실행
- 자동으로 SQL을 생성해주기 때문에 DBMS 종속적이지 않음
- DBMS 종속적이지 않기 때문에 객체 지향적 (Good)
- 유지보수가 편리 (Good)
- 복잡한 쿼리를 쓰기 어려움 (Bad)
- 처음에 해당 ORM을 배워야함 >>>> 러닝커브 존재 (Bad)
- 그놈의 JPA가 ORM의 표준 인터페이스
- ex) Hibernate, EclipseLink, DataNucleus
3. JDBC, Spring JDBC
DB에 접근할 수 있도록 Java에서 제공하는 API.
Java에서 사용하는 SQL Mapper라고 생각하자
여러 DBMS에 맞게 드라이버를 제공한다. >>>> 어떤 DBMS든 연결할 수 있게 도와줌
DB와 연결하기 전과 후, 위와 같은 과정을 거친다고 한다
연결하고 결과 객체를 받아오고 하는 과정이 복잡해서 나온게 Spring JDBC.
JDBC DriverManager가 하는 일을 JDBC Template에게 맡긴다고 한다.
Spring JDBC = JDBC 를 더 편하게 쓸 수 있게 해주는 친구
xml을 통해 DI를 해서 사용
4. JPA, Spring Data JPA
드디어 JPA
Java에서 제공하는 ORM 기술에 대한 표준 명세 인터페이스. Java 에서 쓰는 ORM이라 생각하자
특징은 ORM의 특징과 같다. 왜냐하면 그것이 ORM이기 때문 (끄덕)
인터페이스라서 구현은 없다.
그 유명한 Hibernate가 JPA의 구현체. 즉 JPA를 구현한 라이브러리
Spring Data JPA도 JPA를 쉽게 사용할 수 있도록 해주는 친구. 라이브러리/프레임워크 이다.
Repository를 사용해서 추가적인 기능을 제공한다.
다른 블로그에 의하면
Repository라는 인터페이스를 제공함으로써 이루어집니다
. 사용자가 Repository 인터페이스에 정해진 규칙대로 메서드를 입력하면, Spring이 알아서 해당 메서드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해 줍니다.
라고 한다.
findAll(), findById() 뭐 이런것들을 써서 쉽게 사용할 수 있게 도와준다
결론
SQL Mapper
: Application에서 쿼리를 매핑해서 DB에 쏴주고 데이터를 가져오는 친구. SQL을 직접 쓴다
ORM
: 객체와 DBMS의 스키마를 중간에서 연결해준다. SQL을 직접 안써도 된다
JDBC
: Java에서 DB에 해당하는 드라이버를 통해 DB에 쉽게 연결할 수 있도록 도와주는 API.
: SQL Mapper의 일종
Spring JDBC
: JDBC Templates을 통해 JDBC를 더 쉽게 사용할 수 있도록 도와주는 친구(디펜던시)
JPA
: Java에서 제공하는 ORM 기술에 대한 표준 명세 인터페이스.
: Java 에서 쓰는 ORM
: Hibernate와 같은 구현체로 구현해야 함
Spring JPA
: JPA를 쉽게 사용할 수 있도록 해주는 라이브러리/프레임워크
: Repository를 사용해서 추가적인 기능을 제공한다.
정리하면서도 헷갈린다.
틀린 내용이 있다면 알려주심 수정하겠습니다
참고한 블로그 엄청많음
이 블로그가 전체적으로 JDBC, JPA에 대한 정리가 잘되어있음.
https://sowon-dev.github.io/2021/03/22/210323jpaVSjdbc/
https://deveun.tistory.com/entry/SQL-Mapper%EC%99%80-ORM-%EC%B0%A8%EC%9D%B4
https://freedman.tistory.com/99
https://lealea.tistory.com/238