1.1 SQL을 직접 다룰 때 발생하는 문제점
데이타베이스에 데이터를 관리하려면 SQL 사용
자바로 작성한 애플리케이션은 JDBC API사용
1.1.1 반복, 반복 그리고 반복
회원 객체
public class Member {
private String memberId;
private String name;
}
회원용 DAO
public class Member DAO {
public Member find(String memberId) {...}
}
조회하는 기능
회원 조회용 SQL
SELECT MEMBER_ID, NAME FROM MEMBER M WHERE MEMBER_ID = ?
JDBC API를 사용해서 SQL 실행
ResultSet rs = stmt.executeQuery(sql);
조회 결과를 Member 객체로 매핑
String memberId = rs.getString("MEMBER_ID");
String name = rs.getString("NAME");
Member member = new Member();
member.setMemberId(memberId);
member.setName(name);
회원 등록 기능
회원 등록 기능 추가
public class MemberDAO {
public Member find(String memberId){...}
public void save(Member member){...} //추가
}
1. 회원등록용 SQL 작성
String sql = "INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES(?,?)";
2. 회원 객체의 값을 꺼내서 등록 SQL에 전달
pstmt.setString(1, member.getMemberId());
pstmt.setString(2, member.getName());
3. JDBC API를 사용해서 SQL을 실행
pstmt.executeUpdate(sql);
1.1.2 SQL에 의존적인 개발
완성 후에 회원의 연락처도 함께 저장해달라는 요구사항 추가
등록 코드 변경
회원 클래스에 연락처 필드 추가
public class Member {
private String memberId;
private String name;
private String tel; // 추가
}
연락처를 저장할 수 있도록 INSERT SQL을 수정
String sql = "INSERT INTO MEMBER(MEMBER_ID, NAME, TEL) VALUES(?,?,?)";
회원 객체의 연락처 값을 꺼내서 등록 SQL에 전달
pstmt.setString(3, member.getTel());
조회 코드 변경
회원 조회용 SQL을 수정
SELECT MEMBER_ID, NAME, TEL FROM MEMBER WHERE MEMBER_ID = ?
연락처 조회 결과를 Member 객체에 추가로 매핑
...
String tel = rs.getString("TEL");
member.setTel(tel); // 추가
수정코드 변경
연락처가 수정되지 않는 버그 발생
=> UPDATE SQL에 TEL 컬럼을 추가하지 않았음
문제점
- 진정한 의밎의 계층 분할이 어렵다.
- 엔티티를 신뢰할 수 없다.
- SQL에 의존적인 개발을 피하기 어렵다.
1.1.3 JPA와 문제해결
JPA는 SQL 사용시 이런 문제를 어떻게 해결하는가?
JPA 사용 => 개발자가 직접 SQL을 작성하는 것이 아니라 JPA가 제공하는 API를 사용하면 된다.
저장기능
persist() 메소드는 객체를 데이타베이스에 저장
jpa.persist(member); // 저장
- JPA가 객체와 매핑정보를 보고 적절한 INSERT SQL 생성
- 데이타베이스에 전달
조회기능
find() 메소드는 객체 하나를 데이터베이스에서 조회
- JPA는 객체와 매핑정보를 보고 적절한 SELECT SQL을 생성
- 데이타베이스에 전달
- 결과로 Member 객체를 생성해서 반환
String memberId = "helloId";
Member member = jpa.find(Member.class, memberId); // 조회
수정기능
JPA는 별도로 수정 메소드를 제공하지 않는다.
대신 객체를 조회해서 값을 변경만 하면 트랜잭션 커밋할 때 데이터베이스에 적절한 UPDATE SQL이 전달된다.
Member member = jpa.find(Member.class, memberId);
member.setName("이름변경") // 수정
연관된 객체 조회
JPA는 연관된 객체를 사용하는 시점에 적절한 SELECT SQL을 실행
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam(); // 연관된 개체 조회