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

데이타베이스에 데이터를 관리하려면 SQL 사용
자바로 작성한 애플리케이션은 JDBC API사용

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(); // 연관된 개체 조회

results matching ""

    No results matching ""