[자바 ORM 표준 JPA 프로그래밍] 1.1 SQL을 직접 다룰 때 발생하는 문제점
개발서적/자바 ORM 표준 JPA

[자바 ORM 표준 JPA 프로그래밍] 1.1 SQL을 직접 다룰 때 발생하는 문제점

Reference. 자바 ORM 표준 JPA 프로그래밍

책 목차 및 이전 글

더보기

들어가기 전 JPA 특징, Q&A

1. JPA 소개

  1.1 SQL을 직접 다룰 때 발생하는 문제점

 

1.1.1 반복, 반복 그리고 반복

예제1.

public class Member {
		private String memberId;
		private String name;
		...
}
public class MemberDAO { 
		public member find(String memberId{...}
}

기존의 개발 순서

1. 회원 조회용 SQL을 작성한다.

SELECT MEMBER_ID, NAME FROM MEMBER M WHERE MEMBER_ID = ?

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

ResultSet rs = stmt.executeQuery(sql); //JDBC
UserDto userdto = MemberMapper.select(UserDto); //Mybatis, ibatis

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

String memberId = rs.getString("MEMBER_ID");
String name = rs.getString("NAME");

Member member = new Member();
member.setMemberId(memberId);
member.setName(name);
...
회원 객체를 데이터베이스가 아닌 자바 컬렉션으로 보관한다면 어떨까? →list.add(member);

 

하지만 데이터베이스객체 구조와 다른 데이터 중심의 구조를 가지므로 직접 저장 조회가 불가

겍체들을 CRUD를 하려면 많은 SQL과 JDBC API를 작성해야 한다.

(테이블 수 * 커스텀이 필요한 쿼리) = 무수한 SQL 작성

 

1.1.2 SQL에 의존적인 개발

등록 코드 변경

→ 고객에 의해 Membertel 필드가 추가된 경우

public class Member {
		private String memberId;
		private String name;
		private String tel; //추가
		...
}
  1. insert 쿼리 수정
String sql = "insert into member(member_id, name, tel) values(?, ?, ?)";
pstmt.setString(3, memer.getTel());
  1. 조회 코드 변경
SELECT MEMBER_ID, NAME, TEL, FROM MEMBER WHERE MEMBER_ID = ?

...
String tel = rs.getString("TEL");
member.setTel(tel);
  1. update 쿼리 수정
UPDATE MEMBER SET ... TEL = ? WHERE MEMBER_ID = ?

 

만약 회원 객체를 데이터베이스가 아닌 자바 컬렉션으로 보관한다면 어떨까?

list.add(member); //등록
Member member = list.get("1"); //조회
member.setTel("010-xxxx-xxxxx"); //수정

연관된 객체

public class Member {
		private String memberId;
		private String name;
		private String tel;
		private Team team; //추가
		...
}

class Team {
	...
	private String teamName;
	...
}
public class MemberDAO { 
		public member find(String memberId{...}
		public member findWithTeam(String memberId{...}
}
SELECT M.MBER_ID, M.NAME, M.TEL, T.TEAM_ID, T.TEAM_NAME
FROM MEMBER M
JOIN TEAM T
	ON M.TEAM_ID = T.TEAM_ID
  • Member 객체가 연관된 Team 객체를 사용가능 여부SQL에 달림
  • 데이터 접근 계층을 사용해서 SQL을 숨겨도 DAO를 열어서 SQL이 실행되는지 확인 필요
  • 논리적으로 엔티티와 아주 강한 의존관계를 가짐
    조회 및 객체 필드를 추가하면 DAO의 CRUD코드와 SQL 대부분을 변경해야하는 문제발생

 

1.1.3 JPA와 문제 해결

  • JPA를 사용하면 SQL을 작성하는 것이 아니라 JPA가 제공하는 API를 사용하면 됨
    * 수정 메소드를 제공하지 않음.
    대신 객체를 조회해서 값을 변경하면 트랜잭션 커밋할 때, 적절한 UPDATE SQL이 전달
//------------저장------------
jpa.persist(member); 

//------------조회------------
String memberId = "helloId";
Member member = jpa.find(Member.class, memberId); 

//------------수정------------
Member member = jpa.find(Member.class, memberId);
member.setName("이름변경")

//------------연관된 객체 조회------------
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();