-
Spring boot #7 JPAStudy/Spring boot 2021. 7. 14. 00:06
JdbcTemplate으로 간단하게 DB 데이터 관리를 맛 보았으니까 이번에는 스프링의 대표 ORM이라고 할 수 있는 JPA를 이용해서 앞의 코드들을 바꿔보자.
먼저 디펜던시에 jpa를 추가해줘야 한다. 그리고 properties에서 jpa 설정을 아래처럼 추가해주자. show-sql =true는 JPA가 생성한 SQL문을 출력하겠다는 의미이고, hibernate.dll-auto = none 은 JPA가 자동으로 table을 생성할 수도 있는데 이를 사용하지 않겠다는 의미다.
// build.gradle implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // aplication.properties spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=none
그리고 JPA를 통한 데이터 변경은 Transaction 안에서 실행 되야한다. 그러므로 Memberservice에 @Transaction 어노테이션을 추가해주자.import org.springframework.transaction.annotation.Transactional; @Transactional public class MemberService
그럼 이제 사용할 도메인 클래스에도 entity를 추가해줘야 한다. 아래처럼 어노테이션을 추가해주자. 그리고 PK는 @Id 어노테이션이 추가로 필요하다.
@Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
그 다음 Jpa 클래스를 생성하고 MemberRepository 인터페이스를 상속받자. JPA는 JDBC와 다르게 datasource를 주입받니 않고 EntityManager 객체를 주입받는다. 그래서 아래와 같이 생성자를 통해 주입 받아주자.
private final EntityManager em; public JpaMemberRepository(EntityManager em) { this.em = em; }
그리고 save 메소드를 구현해보자. 아래처럼 em.persist를 사용하면 끝이다. JDBC와 비교하면 코드양이 거의 1/10수준으로 줄었다.
@Override public Member save(Member member) { em.persist(member); return member; }
쿼리가 필요한 경우도 간단하다. findAll 매소드를 구현해보면 한줄로 끝낼수 있다. sql문 안에 m은 as 라는 의미라고 생각하면 된다.
@Override public List<Member> findAll() { return em.createQuery("select m from Member m", Member.class).getResultList(); }
직접 서버를 가동시켜 잘 작동되는지 확인해보면, 아래처럼 db에 값이 잘 저장되는지 확인가능하다. JDBC템플릿도 복잡하고 코드양이 적지 않은데, JPA는 사실상 거의 필수나 다름 없는것 같다.
'Study > Spring boot' 카테고리의 다른 글
Spring boot #8 AOP (0) 2021.07.14 Spring boot #6 JdbcTemplate로 DB 접근 (0) 2021.07.13 Spring boot #5 JDBC로 db접근 (0) 2021.07.10 Spring boot #4 bean과 의존관계 (0) 2021.07.09 Spring boot #3 간단한 회원 서비스 및 테스트 구현 (0) 2021.07.08