Home [실전! 스프링 데이터 JPA] 프로젝트 환경설정
Post
Cancel

[실전! 스프링 데이터 JPA] 프로젝트 환경설정

프로젝트 환경설정

  • 김영한님의 실전! 스프링 데이터 JPA 강의를 기반으로 프로젝트 기본 환경설정, 라이브러리 추가, H2 데이터베이스 연동, 그리고 순수 JPA와 스프링 데이터 JPA의 기본 동작 및 차이점 등을 정리함



프로젝트 생성

build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
plugins {
    id 'org.springframework.boot' version '2.2.1.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    
    // 파라미터 로깅용
    implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.7'
    
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    
}



라이브러리 구조

라이브러리 구조

1
2
# gradle 의존관계 확인 명령어
./gradlew dependencies --configuration compileClasspath



H2 데이터베이스 설정

  • H2 데이터베이스 다운로드 후 파일 압축 해제
  • 압축 해제 후 bin 디렉토리로 이동하여 h2.sh 파일에 실행 권한(chmod 755)을 부여하고 스크립트를 실행함

    1
    2
    3
    4
    5
    
      # 실행 권한 부여
      chmod 755 h2.sh
    
      # 실행
      ./h2.sh
    
  • 데이터베이스 파일 생성 순서

    데이터베이스 파일 생성 순서



application.yml 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/datajpa
    username: sa
    password:
    driver-class-name: org.h2.Driver
  jpa:
    hibernate:
      ddl-auto: create       # 실행 시 테이블 drop 후 재생성
    properties:
      hibernate:
        # show_sql: true     # System.out으로 SQL 출력 (비권장)
        format_sql: true     # SQL 포맷팅

logging.level:
  org.hibernate.SQL: debug   # 로거를 통해 SQL 출력 (권장)
  # org.hibernate.type: trace  # 바인딩 파라미터 출력



동작 확인

테스트 컨트롤러

1
2
3
4
5
6
7
8
@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }
}

회원 엔티티

1
2
3
4
5
6
7
8
@Entity
@Getter @Setter
public class Member {

    @Id @GeneratedValue
    private Long id;
    private String username;
}

순수 JPA 리포지토리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Repository
public class MemberJpaRepository {

    @PersistenceContext
    private EntityManager em;

    public Member save(Member member) {
        em.persist(member);
        return member;
    }

    public Member find(Long id) {
        return em.find(Member.class, id);
    }
}

스프링 데이터 JPA 리포지토리

1
2
public interface MemberRepository extends JpaRepository<Member, Long> {
}

순수 JPA 테스트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@SpringBootTest
@Transactional
@Rollback(false)
public class MemberJpaRepositoryTest {

    @Autowired MemberJpaRepository memberJpaRepository;

    @Test
    public void testMember() {
        Member member = new Member("memberA");
        Member savedMember = memberJpaRepository.save(member);
        Member findMember = memberJpaRepository.find(savedMember.getId());

        assertThat(findMember).isEqualTo(member); // JPA 엔티티 동일성 보장
    }
}

스프링 데이터 JPA 테스트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@SpringBootTest
@Transactional
@Rollback(false)
public class MemberRepositoryTest {

    @Autowired MemberRepository memberRepository;

    @Test
    public void testMember() {
        Member member = new Member("memberA");
        Member savedMember = memberRepository.save(member);
        Member findMember = memberRepository.findById(savedMember.getId()).get();

        Assertions.assertThat(findMember).isEqualTo(member); // JPA 엔티티 동일성 보장
    }
}



쿼리 파라미터 로그 설정

  • SQL 실행 시 바인딩 파라미터를 로그로 남기기위해 외부 라이브러리를 추가함 (운영 환경에서는 반드시 성능 테스트 후 적용 필수)

    1
    
      implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
    



순수 JPA와 스프링 데이터 JPA 비교

순수 JPA와 스프링 데이터 JPA 비교

  • 스프링 부트를 사용하면 persistence.xml이나 LocalContainerEntityManagerFactoryBean 설정 없이 application.yml만으로 JPA 설정이 완료됨



연습 문제

  1. Spring Boot 프로젝트에서 특정 기능을 쉽고 빠르게 추가하기 위해 여러 의존성을 묶어 제공하는 것은 무엇일까요?

    a. Spring Boot Starter

    • 스프링 부트 스타터는 관련 라이브러리 묶음을 제공하여 의존성 관리를 단순화함
    • Initializr는 단순한 프로젝트 생성 도구임
  2. Spring Boot 2.x 버전에서 기본적으로 사용되는 데이터베이스 커넥션 풀 라이브러리는 무엇일까요?

    a. Hikari CP

    • 스프링 부트 2.0부터는 성능이 우수한 Hikari CP를 기본 커넥션 풀로 사용함
  3. H2 데이터베이스를 여러 애플리케이션에서 동시에 접근하거나 원격에서 접근할 때 권장되는 연결 모드는 무엇일까요?

    a. TCP 모드

    • TCP 모드는 네트워크를 통해 H2에 접근하므로 여러 프로세스나 원격 접속이 가능함
    • 반면, 파일 모드는 파일 잠금 문제로 동시 접근이 어려움
  4. JPA 엔티티(Entity) 클래스에 @Entity 어노테이션 외에 필수로 필요한 요소는 무엇일까요?

    a. 매개변수 없는 기본 생성자

    • JPA 표준 명세는 프록시 기술 등을 위해 엔티티 클래스에 접근 제한자가 protected 이상인 기본 생성자가 있어야 한다고 요구함
  5. 스프링 데이터 JPA에서 JpaRepository 인터페이스를 상속받아 사용하는 것의 가장 큰 장점은 무엇일까요?

    a. CRUD 기능 구현 코드 자동 생성

    • 스프링 데이터 JPA는 인터페이스 선언만으로 기본적인 CRUD 메소드 구현체를 자동으로 만들어 제공하여 개발 생산성을 크게 높임



요약 정리

  • H2는 여러 애플리케이션의 동시 접근을 위해 TCP 모드로 연결(jdbc:h2:tcp://localhost/~/datajpa)하는 것이 권장됨
  • spring-boot-starter-data-jpa를 통해 JPA 및 Hibernate 관련 라이브러리가 자동으로 포함되며, 기본 커넥션 풀로 성능이 우수한 Hikari CP가 적용됨
  • JPA 엔티티는 @Entity와 더불어, 프록시 생성을 위해 protected 이상의 기본 생성자가 필수적으로 요구됨
  • 순수 JPA는 EntityManager를 이용해 개발자가 직접 인터페이스와 쿼리 메서드를 구현해야 하지만, 스프링 데이터 JPA는 JpaRepository 인터페이스 상속만으로 기본 CRUD 구현체를 런타임에 자동 주입하여 반복 코드를 획기적으로 줄여줌



Reference

Contents

[실전! 스프링 부트와 JPA 활용2] 다음으로 - 스프링 데이터 JPA와 QueryDSL

[실전! 스프링 데이터 JPA] 예제 도메인 모델