JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.
JPA를 사용하면 개발 생산성을 크게 높일 수 있다
Jpa는 인터페이스이다. 그리고 이를 여러 구현체로 사용하는데, 그 중에서 Hibernate
를 거의 사용한다고 생각하면 된다.
Jpa는 orm이라는 기술이다.
o : Object
r : relational
m : Mapping
객체가 테이블이 되도록 매핑시켜주는 것이다.
예를들어, User 테이블의 데이터를 출력하기 위해서
MySQL에서는 SELECT * FROM user; 라는 query를 실행해야 하지만,
ORM을 사용하면 User 테이블과 매핑된 객체를 user라 할 때, user.findAll() 라는 메서드 호출로 데이터 조회가 가능합니다.
강사님은 JPA를 많이 사용하시는 것 같다.
spring.jpa.show-sql=true : Jpa가 날린 sql을 볼 수 있다.
spring.jpa.hibernate.ddl-auto=none : Jpa를 사용하면 객체를 보고 테이블도 알아서 만들어진다. 하지만 예제에서는 이미 테이블이 만들어져 있고, 만들어진 것을 사용할 것이기 때문에 자동으로 생성해주는 기능을 꺼주는 것. ( none 대신에 create라고 하면 자동으로 만들어줌)
SQL에서 아이디를 생성할때 ID 번호가 자동으로 생성되는 것을 IDENTITY
라고 한다. 이를 넣어주기 위해 아래 사진처럼 코드를 작성한다.
JPA를 사용하기 위해서는 EntityManager를 주입받아야 한다.
em.persist(member) - member에 영구 저장하다.
em.find(Member.class, id) - 조회
em.createAuery("select m from Member m", Member.class)
.getResultList();
여기서 select m from Member m
을 잘 보면
SQL의 경우 select *
로 많이 사용하지만,
JPA는 Entity
객체를 select
하는 것을 볼 수 있다.
em.createAuery("select m from Member m where m.name = :name", Member.class)
.setParameter("name", name)
.getResultList();
강의 노트
스프링 부트와 JPA만 사용해도 개발 생산성이 정말 많이 증가하고, 개발해야할 코드도 확연히 줄어듭니다.
여기에 스프링 데이터 JPA를 사용하면, 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공합니다.
스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술입니다. JPA를 먼저 학습한 후에 스프링 데이터 JPA를 학습해야 합니다.
이렇게 하면 끝난다. 이렇게 짧은 코드에서 어떻게 save
, findAll
등등의 메서드를 실행하는걸까?
이 인터페이스를 들어가면 findAll
메서드를 찾을 수 있다.
그 외에도 구현이 미리 되어있다는 것이다.
이를 그림으로 보면 아래처럼 된다.
하지만, findByName
같이 없는 메서드도 있다. 이는 어떻게 구현할까?
findByName
이라고 쓰면 JPA가 quary에 주석 처럼 써주는 규칙이 있다. 물론 다른 규칙도 여러가지가 있고, 이를 이용해서 많은 메서드를 형성할 수 있다.
강의노트:
참고 : 실무에서는 JPA와 스프링 데이터 JPA를 기본으로 사용하고, 복잡한 동적 쿼리는 Querydsl이라는 라이브러리를 사용하면 된다. Querydsl을 사용하면 쿼리도 자바 코드로 안전하게 작성할 수 있고, 동적 쿼리도 편리하게 작성할 수 있다. 이 조합으로 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를 사용하거나, 앞서 학습한 스프링 JdbcTemplate를 사용하면 된다.
인프런 홈페이지 - https://www.inflearn.com/
강의 제목 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술