8.Spring(JPA)

박종현·2024년 2월 8일

스프링 프로젝트

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

JPA

JPA(Java Persistence API)란 자바를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다. 조금 더 자세하게 설명하자면, Java에서 ORM 기술 표준으로 사용되는 인터페이스의 모음이라고 설명 할 수 있다.

  • ORM(Object Relational Mapping)이란? 애플리케이션 class와 관계형 데이터베이스를 매핑(연결)하는 것이다.

👍ORM의 장점

  • Method를 통해 DB를 조작할 수 있게 된다. 그로인해 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데 더 집중할 수 있음.
  • 부수적인 코드가 줄어듦으로써, 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높임
  • 객체지향적인 코드 작성이 가능
  • 매핑하는 정보가 Class로 명시되어 ERD를 보는 의존도를 낮추고 유지보수 및 리팩토링에 유리함

👍JPA의 장점

  • JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
  • JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.
  • JPA를 사용하면 개발 생산성을 크게 높일 수 있다.

예시를 통해 알아가보고자 한다.
먼저, 단순하게 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문이 그냥 한 줄로 대체되었다. 수정하거나 조회에서는 이렇게까지 줄어들진 않지만 옛날 코드들과 비교하면 획기적으로 줄어든다. 단순히 코드를 사용하는 것만해도 이정도로 극적인 차이를 보인다.

참고
[Spring JPA]JPA란?

0개의 댓글