국비필기노트/Spring

Spring_DB연결(JDBC -> JPA로 연결하기)

개발..너... 2022. 7. 15. 01:23
JPA

 

기존에는 DB컬럼을 추가한다는 의미는 프로젝트를 전반적으로 수정한다라는 의미를 내포하고있었다. 

 

그러나 JPA라는 API를 사용하면서  SQL 데이터 중심의 설계에서 객체 중심의 설계로 패러다임 전환이 가능해졌다. JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해주는 API이다.

JPA를 사용하면 개발 생산성을 크게 높일 수 있으며 JPA도 Spinrg 만큼이나 큰 기술이다. 

 

또한 자바 진영에서 ORM(Object-Relational Mapping)기술 표준으로 사용되는 인터페이스의 모음이다.

즉, 실제적으로 구현된 것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크로서 JPA를 구현한 대표적인 오프소스로는 Hibernate가 있다.

 

쉽게 말하자면 어플리케이션의 DB접근은 JPA이라고 하는 인터페이스를 사용한다. 이 인터페이스는 하나의 설계도 역할로서 이를 기반으로 해서 여러가지의 구현체가 존재한다. 이클립스 링크, 오픈 JPA등이 있으나 대부분 Hibernamte를 사용한다. 즉, JPA는 표준 인터페이스, 구현체는 Hibernate라는 것이다. 

 

 

JPA 라이브러리 가져오기

 

*Build.gradle

 

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

 

JPA 내부에 JDBC라이브러리가 포함되어있기에 방금 사용한 JDBC라이브러리는 주석처리를 해주고 Build.gradle에서 위 한줄만 추가해주면 된다. 

 

JPA 라이브러리 입력 예시

 

Maven은 하나부터 열까지 모두 입력을 해야하지만 Gradle로 프로젝트를 생성했다면 이 한줄만 입력한다면 관련된 모든 라이브러리들을 가지고오는 것 이다.

 

 

*application.properties

 

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none

 

이 두줄을 입력해준다.

 

 

*Member.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.koreait.core.member.dto;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
 
@Entity
public class Member {
 
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mySequenceGenerator")
    @SequenceGenerator(name="mySequenceGenerator", sequenceName = "member_seq", allocationSize = 1)
 
    private int id;
    private String name;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
}
 
cs

 

JPA를 통해서 RDBMS와 연결되는 대상이 되는 클래스는 Member.java이다.

그래서 위에 어노테이션을 줌으로서 JPA가 관리하게 설정해준다.

 

@Entity 

JPA를 사용하기 위해서는 EntityManager를 주입받아야하는데 이 때 사용하는 어노테이션

 

@ID

기본키 매핑에 대한 정보를 알려주는 어노테이션이다. 

 

@GeneratedValue & @SequenceGenerator

ID를 시퀀스로 +1이 증가되게끔 하였기때문에 이를 처리하기 위한 어노테이션

 

 

*JPAMemberRepository.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.koreait.core.member.repository;
 
import java.util.List;
 
import javax.persistence.EntityManager;
 
import org.springframework.stereotype.Repository;
 
import com.koreait.core.member.dto.Member;
 
@Repository
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 null;
    }
 
    @Override
    public List<Member> findAll() {
        return em.createQuery("select m from Member m", Member.class).getResultList();
    }
 
}
 
cs

 

JPA EntityManager 주입

 

JPA도 EntityManager라는 것으로 모든지 동작을 한다. 

JPA를 사용하려면 EntityManager를 주입받아야하며 이를 위해 위의 코드를 작성하였다.

 

insert문

 

위는 모든 insert문을 처리하게되며

 

select문

 

위는 select문을 처리하는 코드이다.  

이는 JPQL이라는 쿼리로서 Member이라는 Entity를 조회하여 select할 때 Member라는 객체 자체를 select하는 것이다. 

 

*Service

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.koreait.core.member.service;
 
import java.util.List;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import com.koreait.core.member.dto.Member;
import com.koreait.core.member.repository.MemberRepository;
 
 
@Service
@Transactional
public class MemberService {
    
    MemberRepository memberRepository;
    
    // 생성자 주입
    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    
    // 회원가입
    public int join(Member member) {
        memberRepository.save(member);
        return member.getId();
    }
    
    // 전체 회원 조회
    public List<Member> findMembers(){
        return memberRepository.findAll();
    }
    
 
}
 
cs

 

JPA로 사용하기 위해선 service 클래스에서 @Transactional 어노테이션을 붙혀주어야하며, 기존의

*JPAMemberRepository.java의 @Repository는 주석처리해준다.