본문 바로가기
영상 후기/Spring Boot

영상 후기 - [10분 테코톡] ⏰ 아마찌의 ORM vs SQL Mapper vs JDBC

by 올리브영 2023. 4. 1.
728x90
반응형

movie

 Persistence

  • 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성(영속성)
  • 객체의 상태를 데이터 베이스에 저장 즉, 객체에게 영속성을 부여

 

Persistence Layer를 구현하는 방법

  1. JDBC만을 이용하는 방법
  2. Persistence Framework를 이용하는 방법

JDBC만을 이용해 영속 계층을 구현

JDBC

  • 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API
  • 자바 애플리케이션에서 DBMS에 종속적이지 않고, 하나의 JDBC API를 이용해 DB 작업을 처리
  • 각각의 DBMS는 이를 구현한 JDBC 드라이버를 제공

JDBC 단점

  • 간단한 SQL을 실행하는 데도 중복된 코드를 반복적으로 사용
  • DB에 따라 일관성 없는 정보를 가진 채로 SQLException를 처리해야 한다.
  • Connection과 같은 공유 자원을 제대로 반환해주지 않으면 시스템의 자원이 바닥나는 버그가 발생하는데, 이를 수동으로 닫아줘야한다.

Persistence Framework

  • JDBC의 단점을 손쉽게 처리해주는 framework
  • JDBC처럼 번거로움 없이 간단한 작업만으로 DB와 연동되는 시스템을 빠르게 개발 가능
  • 모든 Persistence Framework는 내부적으로 JDBC API를 이용하는데 이를 SQL MapperORM으로 나눌 수 있다.

 

SQL Mapper(SQL <-> Object) 

  • Java Persistence Framework 중 하나인 SQL Mapper는 객체(Object)와 SQL문을 맵핑하여 데이터를 객체화 하는 것
  • 객체와 관계를 매핑하는 것이 아닌, 직접 작성한 SQL문의 질의 결과와 객체의 필드를 매핑하여 데이터를 객체화
  • Spring JDBC, MyBatis

Spring JDBC

  • Spring JDBC 또한 SQL문과 객체를 매핑하는 점에서 SQL Mapper의 기능을 제공
  • JdbcTemplate을 사용해서 쿼리 수행 결과와 객체의 필드를 매핑하여 반환 받을 수 있고, 이때 사용되는 Rowmapper를 재활용 할수도 있다.
  • JDBC에서 반복적으로 해야하는 많은 작업들을 대신 해줘서 우리는 실행한 SQL과 바인딩 할 파라미터를 넘겨주거나 쿼리실행 결과를 어떤 객체에 넘겨 받을지를 지정만 하면 된다.

MyBatis

  • 반복적인 JDBC 프로그래밍을 단순화하고 SQL쿼리들을 XML 파일에 작성하여 코드와 SQL을 분리하여 관리
  • JDBC만 사용하면 결과를 가져와서 객체의 인스턴스에 매핑하기 위한 많은 코드가 필요하지만, MyBatis는 그 코드들을 작성하지 않아도 되게 해준다.
  • 스프링부트에서 이용할 경우 DB에 접근하기 위한 별다른 작업 없이 mapper 인터페이스와 mapping file만 구현하면 자연스럽게 객체의 필드와 SQL문이 맵핑이 된다.
  • 동적인 쿼리를 제공

mapper 인터페이스를 정의하고, 인터페이스 메서드와 1대1로 매칭이 되는 Xml 파일을 작성하고 적절한 쿼리를 정의하면 된다.

 

Mybatis 결론

  • 자동으로 Conntection 관리를 해주면서 JDBC를 사용할 때의 중복 작업 대부분을 없애준다.
  • 복잡한 쿼리나 다이나믹하게 변경되는 쿼리 작성이 쉽다.
  • DAO로부터 SQL문을 분리하여 코드의 간결성 및 유지보수성 향상

JDBC와 SQL Mapper와 같이 SQL을 개발자가 직접 작성하는 문제점

  • DB마다 쿼리문법이나 데이터 타입이 달라서 특정 DB에 종속적으로 사용하기 쉽다.
  • 테이블마다 비슷한 CRUD 작업이 계속 일어나는데, 이를 개발자가 일일히 쿼리를 작성하며 반복적인 DAO 개발을 피할 수 없게 된다.
  • 만약 테이블의 필드가 변경되었다면 이와 관련된 모든 DAO의 SQL문, 객체의 필드 등을 수정해야한다.

SQL 의존적인 개발

  • SQL문을 직접 작성하면 결국 SQL 의존적인 설계를 할 수 밖에 없다.
  • 객체간의 관계는 사라지고 데이터베이스에 대한 처리에 집중하게 되어버린다.
  • 비즈니스 로직 구현보다 데이터베이스 접근 로직 구현에 집중하며, 데이터베이스에 항상 의존 관계를 가질 수 밖에 없게된다.

 

관계형DB와 객체간의 패러다임 불일치 문제

  • 객체지향은 추상화, 상속, 다형성을 지향
  • RDB는 데이터 중심의 구조 지향
  • 각각 지향하는 목적이 달라서 사용 방법과 표현방식에 차이가 있을 수 밖에 없다.

ORM(Object Relational Mapping)

  • 객체와 관계형 데이터 베이스를 맵핑하는 것
  • 객체간의 관계를 바탕으로 SQL문을 자동으로 생성하고 직관적인 코드로 데이터를 조작해서 개발자의 불편함 해결
  • SELECT * FROM user; -> user.findAll()

 

JPA(ORM의 대표적인 예)

  • 자바 ORM 기술에 대한 API 표준 명세로 인터페이스들을 모아둔것이다.

  • JPA의 기술을 사용하려면 JPA 인터페이스를 구현한 ORM 프레임워크를 사용해야한다.
  • ORM프레임워크에는 Hibernate(하이버네이트), 이클립스 링크가 있다.

 

ORM 장점

  • 객체지향 언어가 가진 장점을 활용할 수 있다.
  • 생산성 - 반복적인 CRUD 용 SQL을 개발자가 작성하지 않아도 된다.
  • 데이터 접근 추상화, 벤더 독립성 - 데이터베이스 벤더마다 미묘하게 다른 데이터 타입, SQL을 손쉽게 해결
  • 유지보수 - 필드 추가, 삭제 시 관련된 CRUD 쿼리를 직접 수정하지 않고 에티티를 수정하면 됨.
728x90
반응형