JAVA/Spring을 공부하거나 사용한 개발자라면 JPA를 사용해 보거나, 많이 들어봤을 것이다.
요새 많은 곳에서 사용하는 기술 중 하나이다.
레거시 서비스가 아닌 서비스를 제공하는 곳이라면 개발을 할 때 JPA를 많이 사용하는 추세이다.
JPA란 무엇인지, 기존에 쓰던 Mybatis와 비교하면 알아보자.
JPA(Java Persistence API)
- 자바 진영의 ORM 기술 표준
- 자바 객체와 DB 데이터 간의 매핑을 처리하기 위한 ORM(Object-Relational Mapping) 표준
- 자바 ORM 기술에 대한 API 표준 명세(인터페이스를 모아 둔 것!)
위의 이야기만 보면 어렵게 느껴질 수 밖에 없지만,
자바로 DB에서 데이터를 조회, 수정, 삭제, 추가를 할 때 사용하는 기술이라고 생각하면 된다.
자바에서 DB의 데이터를 가져와서 객체로 만들려면 JPA를 안 쓰고 있다면, Mybatis를 사용하고 있을 확률이 높다.
JPA를 사용하면 Mybatis로 SQL문을 직접 작성하여 쿼리 수행 결과를 객체와 매핑하던 것을 안해도 된다.
(필요에 따라 둘다 사용할 수도 있기는 함)
코드를 한번 보자.
예시) Mybatis Mapper Code
<mapper namespace="member">
<select id="selectAll" resultType="memberVo">
select * from member
</select>
<insert id="insert" parameterType="memberVo">
insert into member values(#{id},#{pwd},#{name},#{age},#{tel},#{gender},#{email})
</insert>
<select id="detail" parameterType="java.util.HashMap" resultType="memberVo">
select * from member where id=#{id}
</select>
<update id="update" parameterType="memberVo">
update member set name=#{name},age=#{age}, tel=#{tel}, gender=#{gender}, email=#{email} where id=#{id}
</update>
<delete id="delete">
delete member where id=#{id}
</delete>
</mapper>
정말 오랜만에 예전에 공부하던 코드!
Mybatis Mapper를 보면 사실 SQL과 거의 똑같다고 보면 된다.
Mapper에 쿼리를 작성하고, 그걸 SqlSessionFactory > SqlSession 메서드 selectList(), insert()로 호출해서 해당 쿼리를 실행해서 객체와 매핑 시켜서 사용했다.
쿼리를 모두 작성해야 하고, 그렇다 보니 RDB 종류에 종속적이다.
예시) Spring Data JPA Repository Code
@Repository
public interface UserRepository extends DefaultJpaRepository<UserEntity, Long> {
Optional<UserEntity> findByName(String Name);
List<UserEntity> findAllByStatus(String status);
}
Mybatis와 다르게 JPA는 위와 같이 구현이 가능하다.
Spring Data JPA를 사용하면 대다수의 것들이 자동설정되기 때문에 편하게 사용이 가능하고,
CRUD SQL을 직접 작성할 필요가 없다.
쿼리를 작성할 필요가 없다.(복잡한 네이티브 쿼리를 사용하는게 아니라면!)
현재 다니는 회사에서 예전에 구축된 프로젝트를 제외하고는 Mybatis를 사용하지 않는다.
(새로운 프로젝트 스펙은 거의 다 JPA로 구현 중)
왜 JPA를 많이 사용하고 있는 걸까?
JPA 사용 이유
- 생산성이 높아짐
- 쿼리를 직접 작성하는게 아니기 때문에 작성할 코드가 줄어 듬
- 자바 컬렉션에 객체 저장하는 것 처럼 JPA에 저장할 객체를 전달하면 됨
- 유지보수하기 좋음(SQL 의존적이지 않기 때문에 필드 추가 시 Entity에 추가하고, 관련 코드를 확인하면 됨)
- RDB를 변경하더라도 의존적으로 코드가 되어 있지 않아서, 변경 용이
물론 알아야 하는 개념이 있긴 하다.
- Entity
- EntityManager
- 영속 컨텍스트
- 라이프사이클
- 연관 (@OneToMany, @ManyToOne 등등)
- QueryDSL 등등
사용해보지 않은 사람이 쉽게 이해할 수 있는 개념은 아니지만,
그래도 한번 배워서 사용하다 보면 왜 많이 사용하는지 이유를 몸으로 느끼게 된다.
개념 공부를 제대로 하기 위해 계속 블로그에 JPA 관련 글을 올리긴 할 예정이나
유튜브 또는 인프런에 최범균 강사님이 무료로 올려놓은 JPA 기초 무료 강의를 한번 보는 것을 추천한다!
기초 개념을 잡기에 좋다. 쉽게 설명되어 있기도하고, 시간도 길지 않으니 들어보시길.
https://www.inflearn.com/course/jpa-spring-data-%EA%B8%B0%EC%B4%88/dashboard
'Java | spring > JPA' 카테고리의 다른 글
JPA 조회 동작 방식 비교 : findById(), getOne(), getReferenceById() (0) | 2024.03.27 |
---|---|
JPA 영속성 컨텍스트 장점(+ 테스트 코드) (0) | 2023.10.09 |
JPA 영속성 컨텍스트 및 내부 동작 방식 (2) | 2023.10.08 |
JPA 사용 하는 이유는? (+ ORM 과 SQL mapper 비교) (0) | 2022.10.17 |
JPA Entity & 영속성 컨텍스트 & 라이프 사이클 알아보자! (0) | 2022.10.14 |
댓글