본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/DB

[DB, JBDC] 데이터베이스 연결, JDBC, SQL Mapper, ORM 정리

by 미노드 2024. 1. 29.

DB

프로그래밍은 절차지향, 객체지향, 함수형 프로그래밍 같은 개발 지향적 방법이 있습니다.

비슷하게 데이터베이스도 데이터를 저장하고, 데이터에 접근하여 읽기 위해 사용하며
효율적으로 데이터를 저장하기 위한 방법이 있습니다.
대표적으로 관계형(RDB)으로 저장하거나 비관계형(NoSQL DB)으로 저장하기도 합니다.

자바를 기준으로 DB를 사용하려면 아래같은 구조가 필요합니다.
자바 어플리케이션 -> 데이터 접근 인터페이스 -> 데이터 베이스
자바어플리케이션에서 데이터베이스에 접근하기 위해 데이터 접근 인터페이스를 통해 연결을 구현하고
데이터를 교환하게 됩니다.

DB에서 데이터를 교환하는 과정을 크게 풀어보면 다음과 같습니다.
- DB에 Connection을 연결합니다.
- Connection 을 통해 SQL을 전달하고 수행을 요청합니다.
- 결과를 응답받고, 응답을 활용한 뒤 커넥션을 닫습니다.

그러면 대표적인 데이터 접근 인터페이스인 JDBC를 정리해보겠 습니다.

1. JDBC (데이터 접근 인터페이스)

먼저 데이터베이스에 접근하려면 DB 환경마다 필요한 DB코드가 있습니다.
개발자가 각 DB마다 커넥션, SQL 전달, 결과 응답 같은 방법을 작성해야 하는데, 이는 번거로운 작업이 될 수 있습니다.

데이터 접근 방법이 같다면 DB환경이 다르더라도 데이터 접근 방법이 같아, 어플리케이션에서 편리하게 개발이 가능할 것입니다.
데이터베이스를 추가하거나 변경한다 해도 유연하게 대응이 가능한 것입니다.

이를위해 데이터 접근 기술로 JDBC(Java DataBase Connectivity) 라는 인터페이스를 사용할 수 있습니다.
자바를 이용해 다양한 데이터베이스에 일관적으로 접근할 수 있습니다.

과정을 정리해보겠습니다. (예외처리도 넣기가능)
- JDBC를 사용하여 Connection을 만듭니다.(Connection conn = DriverManager.getConnection(connurl, user, password);
     connurl에 jdbc:postgresql://127.0.0.1:5432/postgres    같은 주소가 들어가며, 사용자id와 pw를 넣어 connection을 만듭니다.
- conn 객체로 Statement객체를 생성합니다.(Statement객체에 sql 쿼리와 동적 조건이 들어갈 수 있습니다.)
- Statement 객체로 쿼리를 실행합니다. (state.  execute    executeUpdate()    executeQuery() )
- 응답을 ResultSet으로 받습니다. ( executeUpdate 라면 성공이면 1응답)
- 응답 처리 후 Connection을 닫습니다. (finally로 보통 합니다.)

JDBC를 활용하여 conn만 활성화 된다면, 데이터베이스에 접근하여 일관적인 방법으로 데이터를 가져올 수 있습니다.
다만 이부분에서 위 과정을 직접 수행시켜야 데이터베이스에 접근할 수 있으므로 해당 작업을 매번 수행해야 합니다.
또한 자바코드 내에 sql 쿼리가 노출되는 것이 특징이며, 필요한 경우 여러 소스에 반복적인 sql 쿼리를 사용해야 하는 경우가 있습니다.

이를 통해 일관적인 방법으로 데이터 접근이 가능한 것이 장점이지만, 코드의 중복이 많아질 수 있는게 단점일 수 있습니다.

2. SQL Mapper

데이터베이스에 접근하기 위한 방법으로 SQL Mapper 라는 것이 있습니다.
이는 SQL문과 VO DTO 같은 객체의 필드를 매핑하여 데이터를 객체화시켜 사용하기 위한 기술입니다.

대표적으로 Mybatis 또는 Spring framework에서 제공하는 JDBC 도구인 Spring JDBC의 jdbcTemplate가 있습니다.

jdbcTemplate은 위의 JDBC를 이용하여 데이터베이스에 접근하는 과정을 메소드로 분리하여 코드를 간결하게 사용할 수 있는 장점이 있습니다.
Mybatis는 XML서술자로 자바 객체와 SQL사이에 자동 매핑을 지원하는 java Persistent framework 입니다.

Mybatis를 이용하면 쿼리는 xml에서 관리하며, xml설정에 자바 객체를 설정하여 매핑시킬 수 있습니다.
이후 해당 객체의 인스턴스를 만든다면 지정된 쿼리를 수행 후 값을 매핑시켜 바로 인스턴스를 사용할 수 있습니다.

3. ORM (Object Relational Mapping) 이란?

ORM이란, 객체와 관계형 DB를 적절하게 매핑시켜 값이 들어있는 인스턴스를 바로 사용할 수 있도록 해줍니다.
이를 통해 sql을 직접 작성할 필요없이 객체만 바로 불러와서 개발에 사용할 수 있으므로, 객체에 집중한 설계가 가능해집니다.

기존에 데이터베이스와 프로그램을 설계를 할 때 지양하는 방식이 다음과 같습니다.
데이터 중심으로 설계할 때 
- 현실에 있는 요소들 중 데이터화 시킬 요소를 구분하여 테이블을 설계하고, 테이블 간의 관계를 설계합니다

객체 중심으로 설계할 때
- 현실에 있는 요소들 중 객체에 넣을 변수, 객체를 설계합니다.

이를 보면 객체 중심 설계와 데이터 중심 설계는 비슷하다고 볼 수 있지만 차이점이 있습니다.
테이블(변경이 어려우며, 데이터가 한곳에 모입니다.)
객체(변경이 상대적으로 쉬우며, 객체의 인스턴스 하나당 데이터가 하나씩 세분화 됩니다.)

정리하자면 데이터를 테이블에서 다루는 것과 객체에서 다루는 것은 차이가 있다는 것이며,
이는 설계할 프로그램을 객체지향적으로 설계하기보다, 데이터 지향적 으로 설계하게 되는 문제가 발생합니다.
변경이 어려운 데이터를 중심적으로 설계하는 것이 더 편할 수 있기 때문입니다.

이를 해결하기위해 (객체 지향적 설계를 수월하게 수행하기 위해) ORM 이라는 개념이 도입되었으며, hibernate JPA 같은게 있습니다.

 여기서 ORM과 SQL Mapper는 차이가 있는데,
SQL Mapper는 쿼리의 실행 결과를 미리 지정하여 두고, 이를 객체로 매핑하는 기술입니다.
- 이를 위해 쿼리를 작성 해둬야 합니다.
ORM은 개발자가 쿼리에 관여하지 않고 객체만을 사용하는 것이 목적입니다.
- 쿼리를 작성하지 않고, 개발자가 객체지향 코드만 신경쓰도록 하자는 데에서 시작한 기술입니다. 때문에 초기에 객체에 JPA 설정이 많이 어렵다는 이야기도 있었습니다.

현재는 JPA 기반 데이터 접근방식을 주로 활용하는 것으로 보이며, db연결방식을 여러 과정에서 정리해봤습니다.