본문 바로가기

개발스터디/스프링부트 JPA 스터디 (21년)

[JPA] 1. JPA란 어떤것인가?

JPA ( Java Persistent API ) 란? 

 

자바진영의 ORM 기술 표준이다. JPA는 애플리케이션과 JDBC 사이에서 동작한다. 

 

JPA: 객체와 관계형 데이터베이스를 매핑해주는 기술

ORM( Object relational Mapping ) 은 말그대로 객체와 관계형 데이터베이스를 매핑해주는 기술을 뜻한다.

과거 Legacy 기준으로 옛날 이야기를 조금 해보자면, JDBC API는 레거시 형태의 JAVA에서 데이터베이스를 접근하는 기술이었다.

 

public void add(User user) throws ClassNotFoundException, SQLException {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection c = DriverManager.getConnection("jdbc:oracle:thin:@아이피:포트:ORA8", "유저명", "비밀번호");
		
        PreparedStatement ps = c.prepareStatement("insert into user_test(id, name, password) values (?, ?, ?)");
		ps.setString(1, user.getId());
		ps.setString(2, user.getName());
		ps.setString(3, user.getPassword());

		ps.executeUpdate();

		ps.close();
		c.close();
	}

 

위와 같이 java에서 db에 접근하고 (Connection )

SQL을 prepareStatement 객체를 통해서 executeQuery(sql); 메서드를 통해 db에 sql문을 실행하는 명령을 제공하는 형태였다.

위와 같은 레거시 방식은 효율적인 유지보수를 할수 없으며, 중복되는 코드가 굉장히 많아서 초난감 Dao라는 토비의 저자 (이일민) 님은 

표현을 쓰실정도..

 

이러한 레거시 코드에서 가장먼저 중복코드를 제거할수 있는부분은 Connection 코드 부분을 객체화 하는것이었다.

이 코드가 자바의 상속 기능을 이용하여 서브클래스 단위로 분리되었고 그러한 코드를 디자인 패턴의 입장에서는 템플릿 메소드 패턴이라고 부른다.

레거시 코드는 그후에도 인터페이스의 사용등 코드를 분리하려는 노력을 하였다. 이 부분은 토비의 Spring 1권을 읽어보면 이해하기 쉽다.

 

레거시 코드는 그러다가 ibatis, mybatis, JdbcTemplate 와 같은 SQL 매퍼를 사용하면서 , 위 코드를 천문학적으로 분리, 줄일수 있게 되었고 개발자들은 유지보수와 중복 코드를 작성하는데 시간을 절약 할 수 있게 되었다.

그렇지만, 여전히 테이블 설계를 할때 제대로 된 객체 모델링을 하는데는 어려움이 있었다. 그이유는 관계형 데이터베이스와 JAVA의 객체지향은 너무나도 성격이 다른 기술이었기 때문이다.

 

객체와 관계형 데이터베이스의 차이를 메우기위해 더욱 많은 코드와 노력이 필요했고, 객체 모델은 점점 데이터 중심의 모델로 변모되어 갔다. 즉, DB 설계를 먼저하고 도메인을 그안에 끼워 맞추는 식으로 개발이 진행되곤 했다.

그러던 중에 수많은 자바 개발자가 같은 고민을 하면서, 객체와 관계형 데이터베이스 간의 차이를 중간에서 해결해주는 ORM 프레임 워크를 알게 되었다.

 

JPA는 지루하고 반복적인 CRUD SQL을 알아서 처리해줄 뿐만 아니라, 객체 모델링과 관계형 데이터베이스 사이의 차이점도 해결 해주었다.

 

이에 대한 보상은 CRUD SQL을 작성할 필요가 없게 되었고, 조회된 결과를 객체로 매핑하는 작업도 대부분 자동으로 처리해 주게 되며

데이터 저장 계층에 작성해야 할 (DAO ) 코드가 1/3로 줄어들었으며 테이블의 변경과 Database 종류의 변경도 역시 두려워 하지 않게 될수 있었다.