[JPA] 프로젝트 환경설정

박세윤·2023년 5월 31일
0
post-thumbnail

인프런 김영한 강사님의 실전! 스프링 데이터 JPA을 정리한 글입니다.

📖 프로젝트 환경설정


📌 프로젝트 생성


✅ 프로젝트 생성

  • 스프링 부트 스타터 활용

  • Gradle - Groovy Project

  • 사용 기능 : web, jpa, h2, lombok

    • SpringBootVersion :
    • groupId : study
    • artifactId : data-jpa
  • 스프링부트 3.0 이상 사용 시

    1. Java 17 이상 사용
    2. javax 패키지 이름을 jakarta로 변경
    3. H2 데이터베이스를 2.1.214 버전 이상 사용

  • 패키지 이름 변경 예시
    • JPA 애노테이션

      • javax.persistence.Entity -> jakarta.persistence.Entity
    • 스프링에서 자주 사용하는 @PostConstruct 애노테이션

      • javax.annotation.PostConstruct -> jakarta.annotation.PostConstruct
    • 스프링에서 자주 사용하는 검증 애노테이션

      • javax.validation -> jakarta.validation



✅ Gradle 전체 설정

plugins {
    id ‘org.springframework.boot’ version= ‘2.2.1.RELEASE’
    id ‘io.spring.dependency-management’ version ‘1.0.8.RELEASE’
    id ‘java’
}

group = ‘study’
version = ‘0.0.1-SNAPSHOT’
sourceCompatibility = ‘1.8’
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

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’
    
    annotationProcessor ‘org.projectlombok:lombok’
    
    testImplementation(‘org.springframework.boot:spring-boot-starter-test’) {
        exclude group: ‘org.junit.vintage’, module: ‘junit-vintage-engine’
    }
}

test {
    useJUnitPlatform()
}
  • 동작 확인
    • 기본 테스트 케이스 실행
    • 스프링 부트 메인 실행 후 에러페이지로 간단하게 동작 확인
    • 테스트 컨트롤러를 만들어서 spring web 동작 확인



✅ 테스트 컨트롤러

package study.datajpa.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

     @RequestMapping("/hello")
     public String hello() {

         return "hello";
     }
}

참고 : 최근 IntelliJ 버전은 Gradle로 실행 하는 것이 기본 설정이고, 이는 실행 속도가 느리므로. 자바가 직접 실행하도록 변경하자.



✅ 롬복 적용

  1. Preferences -> plugin -> lombok 검색 실행 (재시작)
  2. Preferences -> Annotation Processors 검색 -> Enable annotation processing 체크 (재시작)
  3. 임의의 테스트 클래스를 만들고 @Getter, @Setter 확인



📌 라이브러리 살펴보기


✅ gradle 의존관계 보기

  • ./gradlew dependencies --configuration compileClasspath



✅ 스프링 부트 라이브러리 살펴보기

  • spring-boot-starter-web
    • spring-boot-starter-tomcat : 톰캣 (웹 서버)
      - spring-webmvc : 스프링 웹 MVC
  • spring-boot-starter-data-jpa
    • spring-boot-starter-aop

    • spring-boot-starter-jdbc

      • HikariCP 커넥션 풀 (부트 2.0 기본)
    • hibernate + JPA : 하이버네이트 + JPA

    • spring-data-jpa : 스프링 데이터 JPA

  • spring-boot-starter(공통) : 스프링 부트 + 스프링 코어 _ 로깅
    • spring-boot
      • spring-core
    • spring-boot-starter-logging
      • logback, slf4j



✅ 테스트 라이브러리

  • spring-boot-starter-test
    • junit : 테스트 프레임워크, 스프링 부트 2.2부터 junit5(jupiter) 사용

      • 과거 버전은 vintage
        • mockito : 목 라이브러리
    • assertj : 테스트 코드를 좀 더 편하게 작성하도록 도와주는 라이브러리

    • spring-test : 스프링 통합 테스트 지원

  • 핵심 라이브러리
    • 스프링 MVC
    • 스프링 ORM
    • JPA, 하이버네이트
    • 스프링 데이터 JPA
  • 기타 라이브러리
    • H2 데이터베이스 클라이언트
    • 커넥션 풀 : 부트 기본은 HikariCp
    • 로깅 SLF4J & LogBack
    • 테스트



📌 H2 데이터베이스 설치


  • 개발이나 테스트 용도로 가볍고 편리한 DB, 웹 환경 제공

✅ H2 데이터베이스

  • 권한 주기 : chmod 755 h2.sh

  • 데이터베이스 파일 생성 방법

    • jdbc:h2:~/datajpa (최소 한번)
    • ~/datajpa.mv.db 파일 생성 확인
    • 이후 부터는 jdbc:h2:tcp://localhost/~/datajpa 의 형태로 접속

참고 : H2 데이터베이스의 MVCC 옵션은 H2 1.4.198 버전부터 제거되었음. 사용 버전이 1.4.199이므로 옵션 없이 사용



📌 스프링 데이터 JPA와 DB 설정, 동작 확인


✅ application.yml

spring:
 datasource:
   url: jdbc:h2:tcp://localhost/~/datajpa
   username: sa
   password:
   driver-class-name: org.h2.Driver
 jpa:
   hibernate:
     ddl-auto: create
   properties:
     hibernate:
      # show_sql: true
       format_sql: true
   
logging.level:
   org.hibernate.SQL: debug
  # org.hibernate.type: trace
  • spring.jpa.hibernate.ddl-auto : create
    • 애플리케이션 실행 시점에 테이블을 drop 하고 다시 생성

참고 : 모든 로그 출력은 가급적 로거를 통해 남겨야 한다.
show_sql : System.out에 하이버네이트 실행 SQL을 남김
org.hibernate.SQL : logger를 통해 하이버네이트 실행 SQL를 남김



✅ 회원 엔티티

@Entity
@Getter @Setter
public class Member {

     @Id @GeneratedValue
     private Long id;

     private String username;

     ...
}



✅ 회원 JPA 리포지토리

@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 기반 테스트

@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.getId()).isEqualTo(member.getId());
         assertThat(findMember.getUsername()).isEqualTo(member.getUsername());

         assertThat(findMember).isEqualTo(member); //JPA 엔티티 동일성 보장
     }
}
  • Entity, Repository 동작 확인

  • jar 빌드해서 동작 확인

참고 : 스프링 부트를 통해 복잡한 설정이 다 자동화
1



✅ 쿼리 파라미터 로그 남기기

  • 로그에 다음을 추가하자.
    • org.hibernate.type : SQL 실행 파라미터 로그로 남김.
  • 스프링 부트 사용 시 아래 라이브러리만 추가하면 됨.
    • implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.7'

참고 : 쿼리 파라미터를 로그로 남기는 외부 라이브러리는 시스템 자원을 사용하므로, 개발 단계에서는 편하게 사용해도 된다.
운영 시스템에 적용하려면 꼭 성능 테스트를 하고 사용하는 것이 좋다.


스프링부트 3.0 버전 이상일 경우,

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



profile
개발 공부!

0개의 댓글