-정영한님의 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술'로 공부중입니다.

✅JPA(Java Persistence API)란 자바를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다. 조금 더 자세하게 설명하자면, Java에서 ORM 기술 표준으로 사용되는 인터페이스의 모음이라고 설명 할 수 있다.
예시를 통해 알아가보고자 한다.
먼저, 단순하게 JDBC를 활용하고자 할때, 코드를 알아보자.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.springframework.jdbc.datasource.DataSourceUtils;
import javax.sql.DataSource;
import java.sql.*;
public class JdbcMemberRepository implements MemberRepository {
private final DataSource dataSource;
public JdbcMemberRepository(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public Member save(Member member) {
//SQL문 지정.
String sql = "insert into member(name) values(?)";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//Connection 연결
conn = getConnection();
//PreparedStatement 객체 설정
pstmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, member.getName());
//실행
pstmt.executeUpdate();
//생성된 키를 ResultSet 형식으로 저장
rs = pstmt.getGeneratedKeys();
if (rs.next()) {
//받아온 키를 member의 ID로 저장.
member.setId(rs.getLong(1));
} else {
throw new SQLException("id 조회 실패");
}
return member;
} catch (Exception e) {
throw new IllegalStateException(e);
} finally {
close(conn, pstmt, rs);
}
}
}
✍코드를 간략하게 해석해보자.
1. SQL문을 먼저 변수에 넣어둔다.
2. Connection 객체를 생성해서 연결한다.
3. PreparedStatement 객체를 만들어 SQL문을 넣고, 자동생성된 key를 가져오게하고, 파라미터 값을 지정해준다.
4. executeUpdate로 실행시킨다.
5. id 값을 받아와 맴버 객체에 id로 지정한다.
상당하게 복잡하다는 것을 알 수 있다. DB를 사용하게 되면 만드는 가장 기초적인 코드라고 할 수 있다. 한개만 보면 이정도는 할 수 있겠는데? 싶었지만, 이건 회원 저장 메소드 단 하나이다. 조회, 검색, 삭제등을 만들고, 점점 메소드가 늘어나게 되면 기하급수적으로 코드가 많아지고 반복되는 것이 많아지는 것을 알 수 있다. 이보다 더 나은 JDBC Template도 있긴하다.
그럼 같은 코드를 JPA에서 확인해보자.
package hello.hellospring.repository;
import java.util.List;
import java.util.Optional;
import hello.hellospring.domain.Member;
import jakarta.persistence.EntityManager;
public class JpaMemberRepository implements MemberRepository {
private final EntityManager em;
public JpaMemberRepository(EntityManager em) {
this.em = em;
}
@Override
public Member save(Member member) {
em.persist(member);
return member;
}
}
1. EntityManager 객체를 생성한다.
2. 데이터를 영속(persist)를 해주었다. (커밋해주면 DB에 저장)
이전에 필요하던 그 많은 코드들과 SQL문이 그냥 한 줄로 대체되었다. 수정하거나 조회에서는 이렇게까지 줄어들진 않지만 옛날 코드들과 비교하면 획기적으로 줄어든다. 단순히 코드를 사용하는 것만해도 이정도로 극적인 차이를 보인다.