java/jpa

[Spring Data JPA] 프로젝트 환경설정

danuri 2021. 5. 23. 16:34

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA-%EC%8B%A4%EC%A0%84/

 

실전! 스프링 데이터 JPA - 인프런 | 강의

스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다

www.inflearn.com

강의를 들으며 생각 정리 + "자바 ORM 표준 JPA 프로그래밍" 책 참고

 

 

프로젝트 생성


스프링 부트 스타터(https://start.spring.io/) 에서 프로젝트를 생성한다.

dependencies : web, jpa, h2, lombok

 

간단하게 테스트(애플리케이션 실행, 컨트롤러 테스트 등) 해서 정상 작동하는지 확인한다.

 

+) 롬복의 경우 다음 링크를 참고해서 설치한다.

gksdudrb922.tistory.com/65

 

스프링 - 롬복(lombok) 라이브러리 설치

롬복 라이브러리는 도메인 클래스에서 getter/setter 메서드와 toString, equals, hashCode 등의 메서드를 애노테이션으로 사용할 수 있도록 해주는 라이브러리이다. 이외에도 몇 가지 기능이 존재하지만,

gksdudrb922.tistory.com

 

+) IntelliJ에서 Gradle 사용 시 주의점

gksdudrb922.tistory.com/66

 

IntelliJ에서 Gradle 사용시 자바 직접 실행

IntelliJ에서 Gradle 프로젝트 사용시 Gradle 대신에 자바 직접 실행 방법 최근 IntelliJ 버전은 Gradle로 실행을 하는 것이 기본 설정이다. 이렇게 하면 실행속도가 느리다. 다음과 같이 변경하면 자바로

gksdudrb922.tistory.com

 

 

라이브러리 살펴보기


스프링부트는 기본적으로 라이브러리를 등록하면 의존관계가 필요한 다른 라이브러리들을 모두 가져온다.

 

프로젝트 생성시 등록한 라이브러리들에 대한 주요 의존 라이브러리들을 살펴보면 다음과 같다.

 

스프링부트 라이브러리

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 커넥션 풀 (부트 기본)
  • 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: 테스트 프레임워크(junit5)
  • mockito: 목 라이브러리
  • assertj: 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리
  • spring-test: 스프링 통합 테스트 지원

 

H2 데이터베이스 설치


h2 데이터베이스는 개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면을 제공한다.

 

version : 1.4.200

+) 현재 사용하는 스프링부트 버전과 맞는 h2 버전은 스프링 매뉴얼을 참고하면 된다.

https://gksdudrb922.tistory.com/110

 

[Spring] 스프링 부트, 라이브러리 버전 맞추기

현재 사용하는 스프링 부트에서 새로운 라이브러리를 implement 하고 싶을 때, 부트 버전에 맞는 라이브러리 버전을 설치해줘야 정상 동작한다. 스프링 부트에 맞는 라이브러리 버전을 확인하는

gksdudrb922.tistory.com

 

다운로드 및 설치 방법

gksdudrb922.tistory.com/68

 

H2 데이터베이스 설치

H2 데이터베이스는 개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면을 제공한다. 현재 1.4.200 버전(2019 -10-14)을 사용한다. 다운로드 및 설치 다운로드 링크 https://www.h2database.com 윈도우 유저는 Win

gksdudrb922.tistory.com

 

 

스프링 데이터 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:
        format_sql: true

logging.level:
  org.hibernate.SQL: debug

spring.datasource -> H2 데이터베이스 연결

spring.jpa.hibernate.ddl-auto: create -> 애플리케이션 실행 시점에 테이블을 drop 하고, 다시 생성한다.

spring.jpa.properties.hibernate: format_sql -> SQL 출력시 보기 좋게 포맷 후 출력해준다.

logging.level.org.hibernate.SQL : debug -> logger를 통해 하이버네이트 실행 SQL을 남긴다

+) 참고: 모든 로그 출력은 가급적 로거를 통해 남겨야 한다.

 

+) 쿼리 파라미터 로그 남기기

https://gksdudrb922.tistory.com/111

 

[JPA] 쿼리 파라미터 로그 남기기

기본적으로 JPA에서 쿼리를 화면에 출력할 때, 쿼리 파라미터가 '?'로 찍힌다. insert into member (username, id) values (?, ?) 파라미터 값을 로그로 남기는 법을 알아보자. 1. 설정 정보 간단한 방법으로 appl.

gksdudrb922.tistory.com

 

동작 확인

스프링 데이터 JPA가 잘 동작하는지 간단한 테스트를 해보자.

도메인

</entity/Member>

@Entity
@Getter @Setter
public class Member {

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

    protected Member() {
    }

    public Member(String username) {
        this.username = username;
    }
}

 

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

</repository/MemberRepository>

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

 

테스트

@SpringBootTest
@Transactional
class MemberRepositoryTest {

    @Autowired
    MemberRepository memberRepository;

    @Test
    public void testMember() {
        //given
        Member member = new Member("memberA");
        Member savedMember = memberRepository.save(member);

        //when
        Member findMember = memberRepository.findById(savedMember.getId()).get();

        //then
        assertThat(findMember.getId()).isEqualTo(member.getId());
        assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        assertThat(findMember).isEqualTo(member);
     }
}