ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring boot #7 JPA
    Study/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는 사실상 거의 필수나 다름 없는것 같다.

     
     
     

    댓글

Designed by Tistory.