[JPA] JPA 등장 배경

김우진·2022년 8월 25일
0
post-thumbnail

JPA(Java Persistence API) 등장 배경

순수 JDBC

public class MemberDao {
    public Long save(Connection conn, Member member) {
        PreparedStatement pstmt = null;

        String sql = "INSERT INTO MEMBER(USERNAME, PHONE_NUMBER) VALUES (?, ?);

        try{
            pstmt = conn.conn.prepareStatement(sql);
            pstmt.setString(1, member.getUsername());
            pstmt.setString(2, member.getPhoneNumber());

            pstmt.executeUpdate();

            ResultSetgeneratedKeys = pstmt.getGeneratedKeys();
            if(generatedKeys.next()) {
                long memberId = generaedKeys.getLong(1);
                return memberId;
            }
            return null;
        } catch(Exception e) {
            throw new RuntimeException(e);
        } finally {
            close(pstmt);
        }
    }
}

과거에는 객체를 DB에 저장을 하거나 조회를 하려면 위와 같이 복잡한 JDBC API와 SQL문을 직접 작성해야만 했다.

SQL Mapper

Jdbc Template

public class MEmberDAO {
    private JdbcTemplate jdbcTemplate;
    private SimpleJdbcInsert insertActor;

    public Member findOne(Long id) {
        String sql = "SELECT MEMBER ID, USERNAME, PHONE NUMBER FROM MEMBER WHERE ID = ?"
        return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Member>(), id);
    }
}

Mybatis mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.demo.test.dao.TestMapper">
	<select id="findById" resultType="BoardDetailDto">
        select
        member_id,
        username,
        phone_number
        from member
        where member_id = #{id}
    </select>
</mapper>

후에 이를 간편화 하기 위해서 JdbcTemplate, Mybatis와 같은 SQL Mapper가 등장해서 개발 코드는 줄었지만 위의 코드와 같이 아직 SQL문은 직접 작성해야만 한다.

JPA

하지만, JPA는 객체와 Relational Database와 Mapping을 자동으로 해줘 아래와 같이 별도의 sql문을 작성하지 않아도 된다.

public class MemberDAO{
    @PersistenceContext
    EntityManager jpa;

    public void save(Member member) {
        jpa.persist(member);
    }

    public Member findOne(Long id) {
        return jpa.find(Member.class, id);
    }
}

이렇게 JPA를 사용하면 이제는 SQL문 조차도 작성하지 않아도 된다. 게다가 spring-data-jpa dependency를 추가하면, 위 코드보다 훨씬 간편하게 영속성 컨텍스트를 이용한 개발을 할 수 있다.

물론, 복잡한 코드나 동적 쿼리 등은 개발자가 직접 작성해주어야 하지만 이 역시 QueryDSL을 이용하면 비교적 쉽게 작성할 수 있다. 또한, QueryDSL은 문자보다 코드적으로 작성 가능하므로 위의 방식들 보단 개발에 용이하다.

이처럼 개발 생산성, 유지보수 측면에서 JPA가 이전과는 확연하게 차이가 나게 된다.

주의 사항
위와 같은 장점으로 개발자는 쿼리를 비교적 덜 신경쓰고 로직 개발에 집중할 수 있어 생산성이 크게 상승한다. 하지만, 그만큼 개발자가 작성한 코드가 자동으로 JPA(영속성 컨텍스트)로 인해 Database에 영향을 주게된다. 실제 서비스에서 이는 매우 치명적으로 작용할 수 있어, JPA를 사용할 때는 깊은 이해와 주의성이 필요하다.

Infrean 강의 링크

자바 ORM 표준 JPA 프로그래밍 - 기본편

0개의 댓글