Peony의 기록 창고 🌼
article thumbnail
반응형

프로젝트 환경설정

https://start.spring.io/

Dependencies

  • spring-boot-starter-web
    • 톰캣, 스프링 웹 MVC 등 지원
  • spring-boot-starter-thymeleaf
    • 뷰 단을 SSR로 제공하는 타임리프 템플릿 엔진
  • Spring-boot-starter-data-jpa
    • aop, jdbc (HikariCP 커넥션 풀), 하이버네이트 , 스프링 데이터 jpa 등 지원
  • spring-boot-starter(공통)
    • 스프링 부트 + 스프링 코어 + 로깅 등 지원

테스트 라이브러리

  • spring-boot-starter-test
    • junit, mockito, assertj, spring-test

핵심 라이브러리

  • 스프링 MVC
  • 스프링 ORM
  • JPA, 하이버네이트
  • 스프링 데이터 JPA

기타 라이브러리

  • H2 데이터베이스 클라이언트
  • 커넥션 풀 : 기본은 HikariCP
  • WEB (thymeleaf)
  • 로깅 SL4FJ & LogBack
  • 테스트
  •  

H2 데이터베이스 설치

H2 데이터베이스 버전은 1.4.200을 사용했다. 맥환경에서는 설치 후 bin 폴더에서 ./h2.sh를 통해 실행한다.

  • 최초 접속시 jdbc:h2:~/jpashop 후 루트 폴더에 ~/jpashop.mv.db 파일 생성 확인
  • 이후 접속시 jdbc:h2:tcp://localhost/~/jpashop

 

JPA 및 DB 설정

application.yml 파일에 DB 접속 정보를 설정한다.

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop
    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

 

회원 도메인

package jpabook.jpashop;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Getter @Setter
public class Member {

    @Id @GeneratedValue
    private Long id;
    private String username;
}
package jpabook.jpashop;

import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Repository
public class MemberRepository {

    @PersistenceContext
    EntityManager em;

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

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

스프링 부트 starter-jpa가 em을 자동 생성해줘서 @PersistenceContext을 통해 가져다 쓰면 된다.

 

테스트

package jpabook.jpashop;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;

import static org.assertj.core.api.Assertions.*;

@SpringBootTest
class MemberRepositoryTest {

    @Autowired MemberRepository memberRepository;

    @Test
    @Transactional
    @Rollback(value = false)
    public void testMember() {
        // given
        Member member = new Member();
        member.setUsername("memberA");

        // when
        Long savedId = memberRepository.save(member);
        Member findMember = memberRepository.find(savedId);

        // then
        assertThat(findMember.getId()).isEqualTo(member.getId());
        assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        assertThat(findMember).isEqualTo(member);
    }
}
  • @Transactional : 실제 디비에 접근할 수 있다. 테스트 동작 하면서 커밋, 끝나면서 롤백시켜준다. 롤백을 하고 싶지 않다면 @Rollback(false)로 설정하면 된다.
  • @SprinBootTest : 실제 서버를 돌리는 상황처럼 톰캣을 실행해서 테스트를 할 수 있도록 지원해준다.

 

쿼리 파라미터 로그 남기기

application.yml에서 적용한 org.hibernate.type 이 부분을 통해 SQL 로그를 남겨도 파라미터는 ?로 나온다.

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

다음 라이브러리를 추가하면 파라미터로 들어오는 ?도 로그에 같이 보여준다.

자세한 정보는 https://github.com/gavlyukovskiy/spring-boot-data-source-decorator 를 참고하자.

 

이 글은 김영한 님의 "실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발"을 듣고 정리한 내용입니다.

 

반응형
profile

Peony의 기록 창고 🌼

@myeongju