본문 바로가기

Database/JPA

[JPA] 그것은 무엇인가?

반응형

SQL를 직접 다룰때의 문제점.

지금까지의 SQL 처리방식은 이제 그만!

예를 들어 회원을 조회하는 기능을 개발한다고 가정한다면,

 

1 ) 회원 조회용 sql을 작성한다.

SELECT memeber_id, name FROM memeber WHERE member_id = ?

 

2 ) JDBC API를 사용해서 SQL을 실행한다.

ResultSet rs = statement.executeQuery(sql);

 

3 ) 조회 결과를 Member 객체로 맵핑한다.

Member member = new Member ();
member.setMemberId(rs.getString("member_id"));
member.setMemberName(rs.getString("member_name"));

 

이를 통해 알 수 있듯이,

데이터베이스는객체 구조와는 다른 뎅터 중심의 구조를 가지므로 객체를 데이터벵스에 직접 저장하거나 조회할 수는 없다.

따라서 개발자가 객체지향 애플리케이션과 데이터베이스 중간에서 SQL과 JDBC API를 사용해서 변환 작업을 직접 해줘야 한다.

 

문제는 여기서 발생한다.

객체를 데이터베이스에 crud하려면 너무 많은 SQL과 JDBC API를 코드로 작성해야한다는 점이다.

그리고 테이블마다 비슷한일을 반복해야하는데, 이러한 비슷한일을 기능을 추가할때마다 반복해야한다는 점이다.

 

게다가 기존에 만들어둔 기능의 요구사항이 바뀐다면?

예를 들면, 위에 만든 회원 조회 서비스 기능에서 회원의 연락처도 조회해달라는 요구사항이 추가되었다,

그러면,

1) 회원 테이블에서 연락처 필드를 추가하고,

2) 회원 연락처에 저장할 수 있는 기능의 SQL과 JDBC API를 수정하고 잘 저장되는지 테스트를 해야한다. 

3) 그리고나서 회원 조회 화면을 수정해서 연락처 필드가 출력되도록 SQL과 JDBC API를 수정한다.

 

이러면 기능이 잘 동작한다고 생각할 줄 알았는데,

아뿔싸! 이번에는 연락처가 수정되지 않는 버그가 발생했다.

생각해보니, 연락처를 수정하는 기능도 변경해야하는 것이다..

 

만약 회원(Member) 객체를 데이터 베이스가 아닌 자바 컬렉션에 보관했다면,

필드를 추가했다고 해서 이렇게 많은 코드를 수정할 필요는 없을 것이다.

 

결국 이 모든 일은 SQL에 모든 것을 의존하는 상황에서는 개발자들이 엔티티를 신뢰하고 사용할 수 없다.

물리적으로 SQL과 JDBC API를 데이터 접근 계층에 숨기는 데 성공했을지는 몰라도 논리적으로는 엔티티와 아주 강한 의존 관계를 가지고 있다.

 

  • 진정한 계층 분할이 아니다.
  • 엔티티(=비즈니스 요구사항을 모델링한 객체)를 신뢰할 수 없다.
  • SQL에 의존적인 개발을 피하기 어렵다. 

그러면 이러한 문제를 해결해주는 게 무엇이 있을까?

이를 해결할 JPA의 기능을 알아보자.

JPA를 사용하면 객체를 데이터베이스에 저장하고 관리할때, 개발자가 직접 SQL을 작성하는 것이 아니라 JPA가 제공하는 API를 사용하면 된다.

그러면 JPA가 개발자를 대신에 적절한 SQL을 생성해서 데이터베이스에 전달한다.

 

저장 기능

jpa.persist(member);

persist() 메소드는 객체를 데이터베이스에 저장한다.

이를 호출하면 JPA가 객체와 매핑정보를 보고 적절한 INSERT SQL을 생성해서 데이터베이스에 전달한다.

 

조회 기능

Memeber member = jpa.find(Member.class, "memeber_id");

find() 메소드는 객체 하나를 데이터베이스에서 조회한다.

JPA는 객체와 매핑정보를 보고 적절한 SELECT SQL을 생성해서 데이터베이스에 전달하고 그 결과로 Member 객체를 생성해서 반환한다.

 

수정 기능

Memeber member = jpa.find(Member.class, "memeber_id");
member.setName("change_member_id");

JPA는 별도의 수정 메소드를 제공하지 않는다.

대신에 객체를 조회해서 값을 변경하면 트랜잭션을 커밋할때 데이터베이스에 적절한 UPDATE SQL이 전달된다.

 

연관된 객체 조회

Memeber member = jpa.find(Member.class, "memeber_id");
Team team = memeber.getTeam();

JPA는 연관된 객체를 사용하는 시점에 적절한 SELECT SQL을 실행하다,

따라서 JPA를 사용하면 연관된 객체를 마음껏 조회할 수 있다.

 

이로써, JPA는 SQL을 개발자 대신해서 작성해 실행해주는 것 이상의 기능들을 제공한다.

 

반응형

❥ CHATI Github