본문 바로가기

백앤드 개발/Java & Spring

[Spring boot] JPA와 스프링 데이터 JPA

1. JPA란

JPA는 객체-관계 매핑 (ORM)을 지원

쿼리를 직접 작성하지 않기 때문에 SQL 중심 설계를 객체 중심 설계로 전환

개발 생산성 크게 상승

 

 

2. 환경 설정

//build.gradle

dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //jpa 라이브러리 추가
runtimeOnly 'com.h2database:h2' // 데이터베이스 관련
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
...
}

 

// resources/application.properties

spring.jpa.show-sql=true // jpa 가 생성하는 SQL 출력
spring.jpa.hibernate.ddl-auto=none // jpa 테이블 자동 생성 기능 off

 

 

3. jpa 회원 관리 구현 

// domain/Member
...

@Entity // 어노테이션을 통해 jpa 관리하의 Entity 임을 선언
public class Member {

    @Id // pk 선언
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본키 자동 생성 (strategy=생성전략), 증가열에 따라 자동으로 기본키 생성
    private Long id;
    private String name;
    // Column 명과 일치하지 않을 경우 @Column(name=) 으로 매핑
    ...
}

 

// repository/JpaMemberRepository

public class JpaMemberRepository implements MemberRepository{

    private final EntityManager em; // EntityManager: DB와의 통신 담당

    public JpaMemberRepository(EntityManager em) {
        this.em = em; // 생성자를 통해 DB 주입
    }

   ...
}

 

// service/MemberService

import org.springframework.transaction.annotation.Transactional

@Transactional // 커밋, 롤백 등과 같은 복잡한 트랜잭션 작업을 직접 처리 하지 않도록
public class MemberService {
	...
}

 

// SprinngConfig

@Configuration
public class SpringConfig {

 private final DataSource dataSource; // DB 연결 객체
 private final EntityManager em; // EntityManager 생성
 
 // 데이터 소스 주입
 public SpringConfig(DataSource dataSource, EntityManager em) {
 this.dataSource = dataSource;
 this.em = em;
 }
 
 @Bean
 public MemberService memberService() {
 return new MemberService(memberRepository());
 }
 
 @Bean
 public MemberRepository memberRepository() {
 return new JpaMemberRepository(em);
 }
 
}