Close
Close full mode
logo만렙 개발자 키우기

(1) SQL을 직접 다룰 때 발생하는 문제점

Git RepositoryEdit on Github
Last update: a year ago by nowwaterReading time: 2 min

관계형 데이터베이스는 가장 대중적이고 신뢰할 만한 안전한 데이터 저장소이다.

데이터베이스에 데이터를 관리하려면 SQL을 사용해야 한다.

자바로 작성한 애플리케이션은 JDBC API를 사용해서 SQL을 데이터베이스 전달한다.

엔티티 : 비즈니스 요구사항을 모델링한 객체를 의미한다.

불필요한 반복

개발자는 데이터 접근 계층 (DAO)를 통해 SQL과 JDBC API를 사용해서 직접 변환 작업을 해주어야한다.

객체를 데이터베이스에 CRUD 하려면 매우 많은 SQL 과 JDBC API를 코드로 작성해야 하는 문제가 발생한다.

비슷한 작업을 계속해서 반복하는 것은 불필요한 작업이다.

public class MemberDAO {
// 회원 조회용 SQL
public Member find(String memberId) {
String sql = "SELECT MEMBER_ID, NAME FROM MEMBER M WHERE MEMBER_ID = ?";
ResultSet rs = stmt.executeQuery(sql);
String memberId = rs.getString("MEMBER_ID");
String name = rs.getString("NAME");
Member member = new Member();
member.setMemberId(memberId);
member.setName(name);
}
// 회원 등록용 SQL
public void save(Member member) {
String sql = "INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES (?, ?)";
pstmt.setString(1, member.getMemberId());
pstmt.setString(2, member.getName());
}
}

SQL에 의존적인 개발

  • 진정한 의미의 계층 분할이 어렵다.

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

  • 엔티티를 신뢰할 수 없다.

    DAO를 열어서 어떤 SQL이 실행되고 어떤 객체들이 함께 조회되는지 일일이 확인해야 한다.

  • SQL에 의존적인 개발을 피하기 어렵다.


JPA와 문제 해결

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

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

저장 기능

persist() 메소드는 객체를 데이타베이스에 저장

jpa.persist(member); // 저장

조회 기능

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

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

🚀 JPA — Previous
1장. JPA 소개
Next
(2) 패러다임의 불일치