JPA를 공부하다 ORM에 등장배경이 궁금해져 정리하게되었습니다.
데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지않는 데이터의 특성, 영구히 저장되는 그 어떤것
JDBC | SQLMAPPER | ORM |
JDBC API | MyBatis | JPA / Hibernate |
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DatabaseHandler {
private Connection conn;
private PreparedStatement statement;
private ResultSet resultSet;
// 데이터베이스 연결 메소드
public void connect() throws SQLException {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "mypassword";
conn = DriverManager.getConnection(url, user, password);
}
// SQL 쿼리 실행 메소드
public ResultSet executeQuery(String sql) throws SQLException {
statement = conn.prepareStatement(sql);
resultSet = statement.executeQuery();
return resultSet;
}
// 연결 종료 메소드
public void disconnect() throws SQLException {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (conn != null) {
conn.close();
}
}
// 예시 메소드
public static void main(String[] args) throws SQLException {
DatabaseHandler handler = new DatabaseHandler();
handler.connect();
String sql = "SELECT * FROM mytable";
ResultSet resultSet = handler.executeQuery(sql);
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id: " + id + ", name: " + name);
}
handler.disconnect();
}
}
초기의 DB에서 데이터를 조회 및 수정하기위한 소스코드만 봐도 중복된 소스코드, 사용한 자원을 disconnect메소드를 호출해 관리해야하며, SQL을 직접적고 지금보기만해도 힘듭니다...
SQL을 분리하자라는 목표로 시작되었으며 Query를 Java에서 XML로 옮겼습니다.
복잡한 JDBC 코드를 지양하며, 리턴값에 자바객체를 맵핑시켰습니다.
먼저 ORM은 객체와 DB간에 데이터를 변환하고 연결하는 기술입니다.
객체지향 프로그램에서 관계형 데이터베이스에 연결하여 사용하려니, 불편했으며 객체지향 프로그램에서 SQL에 의존적으로 개발을 하게되었습니다.
물리적으로는 SQL과 JDBC API를 데이터 접근 계층에 숨기는 데 성공했을지 몰라도 논리적으로는 엔티티와 아주 강한 의존 관계를 가지고있다.
자바 ORM표준 프로그램 - 김영한
하나의 예를 들어보겠습니다.
Member 클래스가 있었을때 아래와같은 작업들이 있을경우
public class Member {
private String id;
private String name;
}
public Member getMember(String id) {
return dao.getMember(id);
/*
SELECT id, name
FROM member
WHERE id = #{id}
*/
}
public int updateMember(Member member) {
return dao.updateMember(member);
/*
UPDATE member SET name = #{name}
WHERE id = #{id}
*/
}
phoneNo컬럼이 추가되어 수정이 필요하게되었을때
public class Member {
private String id;
private String name;
private String phoneNo;
}
개발자가 실수로, updateMember에 phoneNo를 수정하지않게될수도 있습니다.
물리적으로는 다르게있지만, 논리적으로 연결이되어있는상황입니다.
이로인해 패러다임불일치가 발생되었습니다.
이를 고치고자 ORM이 등장하였습니다.