jdbc, sql mapper, orm

yeoro·2021년 7월 13일
0

영속성(persistence) : 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성

jdbc(java database connectivity)

  • 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 api이다. 자바 어플리케이션에서 dbms 종류에 상관없이 하나의 jdbc api를 이용해 db작업을 처리할 수 있게 해준다.
  • 간단한 sql을 실행하는데도 중복된 코드를 반복적으로 사용한다.

persistence framework

  • jdbc 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있다.

sql mapper

  • sql을 직접 작성하여 sql 문과 객체의 필드를 매핑하여 데이터를 객체화 한다.

jdbctemplate

  • jdbc에서 반복적으로 해야하는 많은 작업들을 대신 해준다.
  • 쿼리 수행 결과와 객체의 필드를 매핑하고 매퍼를 재활용 한다.

mybatis

  • 반복적인 jdbc 프로그래밍을 단순화
  • sql 쿼리들을 xml 파일에 작성하여 코드와 sql 분리하여 관리
  • 가져온 결과를 객체의 인스턴스에 매핑하기위해 많은 코드가 필요했지만 그 코드들을 작성하지 않아도 되게 해준다.
  • xml에 작성한 쿼리 정보와 매칭시키며 사용한다.
  • 동적 쿼리를 작성할 수 있다.
  • 자동으로 connection 관리를 해주면서 jdbc를 사용할 때의 중복 작업 대부분을 없애준다.
  • 복잡한 쿼리나 동적 쿼리를 작성하기 쉽다.
  • dao로 부터 sql문을 분리하여 코드의 간결성 및 유지보수성 향상

jdbc, sql mapper의 문제점

  • 특정 db에 종속적으로 사용하기 쉽다
  • 테이블 마다 비슷한 crud sql을 작성하기 때문에 dao 개발이 매우 반복되는 작업이다.
  • 테이블 필드가 변경될 시, 이와 관련된 모든 sql문, 객체의 필드 등을 수정해야 한다.
  • 코드상으로 sql과 jdbc api를 분리했다 하더라도 논리적으로 강한 의존성을 갖고 있다.
  • sql을 직접 작성하면 비즈니스 로직 구현보다 db 접근 로직 구현에 집중하며 db에 의존적인 코딩을 한다.
  • 관계형 db(데이터 중심의 구조)와 객체(추상화, 상속, 다형성) 간의 패러다임 불일치
  • 각각 지향하는 목적이 다르기 때문에 사용방법과 표현 방식에 차이가 있을 수 밖에 없다.

ORM

  • 객체와 관계형 DB를 맵핑하는 것

  • 객체간의 관계를 바탕으로 sql 문을 자동으로 생성하고 직관적인 메서드로 데이터를 조작하여 개발의 불편함을 해결할 수 있다. (select * from ... -> user.findAll())

  • 패러다임 불일치 문제를 해결

  • 장점

    • 패러다임 불일치 문제 해결 - 객체지향 언어가 가진 장점 활용 가능
    • 생산성 - 지루하고 반복적인 CRUD 용 sql을 개발자가 작성하지 않아도 됨
    • 데이터 접근 추상화, 벤더 독립성 - 데이터베이스 벤더마다 미묘하게 다른 데이터 타입, sql을 손쉽게 해결
    • 유지보수 - 필드 추가, 삭제 시 관련되 crud 쿼리를 직접 수정하지 않고 엔티티만 수정하면 됨
    • jpql을 통한 쿼리 직접 작성 가능

JPA

  • 자바 orm 기술에 대한 api 표준 인터페이스
  • jpa 인터페이스를 구현한 프레임워크 사용 : hibernate, eclipseLink

패러다임 불일치

  • RDB 테이블은 객체의 상속이라는 개념이 없다.

  • 공통 부분을 슈퍼타입으로 묶고 공통으로 부터 상속받아 다른 엔티티와 차이가 있는 속성에 대해서는 서브 타입으로 구현하면 상속과 유사하게 테이블 설계 가능

  • person을 상속받은 crew

    • jpa가 해주는 일

      crew 객체를 저장하려면

      insert into person... , insert into crew

      쿼리를 두 번 날려야 한다. crew 객체를 조회하려면

      select p.*, c.* from person p join crew c on p.id = c.id;

      join 문을 이용한 쿼리를 사용해야한다.

    • 개발자가 할 일

      jpa.persist(album)

      Crew crew = jpa.find(Crew.class, crewId)

[참고]

0개의 댓글