JPA와 DB 설정,동작 확인

InnomDB·2022년 3월 4일
0

스프링 부트 JPA

목록 보기
5/6

1. yml 파일 생성 및 세팅

우선, SPRING BOOT 프로젝트를 생성했을 때 자동으로 생성되는 src/main/resources/application.properties 파일을 삭제하고 application.yml 파일을 생성해준다. properties를 사용해도 된다. 하지만 계층적 구조인 yml이 설정파일이 많아졌을 때 더 편리한 느낌이 있어 여기서는 yml로 대체한다.

application.yml 설정

ddl-auto: application 실행 시점에 기존의 테이블을 지우고 테이블을 새로 생성
show_sql: true -> System.out으로 sql 출력
org.hibernate.SQL: debug -> Logger로 sql 출력

설정 설명서 - 스프링 공식 홈페이지

2. 동작확인

멤버 클래스 생성(Entity)

MemberRepository 생성(Repository는 DB에 직접 접근할 때 사용)

JPA를 사용하기 때문에 Entity Manager가 필요하다.

Spirng Boot는 결국 스프링 컨테이너 위에서 동작하기 때문에 Spring Boot가 @PersistenceContext에 있으면 Entity Manager를 주입해준다.

Tip. Entity Manger를 생성하는 코드가 없는데 어떻게 사용할 수 있나요?

spring-boot-starter-data-jpa가 다 해줍니다. yml 설정 읽어서 혼자 다 해줍니다. 너무너무 편한 spring boot!!

왜 id를 반환해주나요?

CQS개념 - 이것은 추후 다른 포스팅에서 설명 예정

2-1 테스트 코드 작성

VS-CODE에서는 JAVA 테스트 파일을 따로 만들어주는 것이 없다.

Extension에서 설치해주었다.

파일만 생성되는 것에 의미를 갖고 사용하면 된다.
사용방법: 마우스 우클릭 - generate junit testFile

junit4에서는 @RunWith(SpirngRunner.class)를 사용.
junit5에서는 @ExtendWith(SpingExtension.class)를 사용

이 부분을 몰라서 한참을 헤맸다.

테스트 전체 코드

package jpabook.jpashop;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.transaction.annotation.Transactional;

@ExtendWith(SpringExtension.class)
@SpringBootTest
public class MemberRepositoryTest {

    @Autowired MemberRepository memberRepository;

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

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

        //then
        Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
        Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        System.out.println("findeMember === member: " + (findMember == member));
    }
}

검증 부분에서 사용되는 Assertions을 VS-CODE에서 활성 방법

launch.json : Visual Studio Code는 launch.json프로젝트 폴더 루트의 파일에서 시작 구성을 관리합니다

주의

Transaction을 해주지 않는다면 에러가 난다.

Entity Manager를 통한 모든 데이터 변경은 트랜잭션을 통해 이루어져야 한다.

IllegalStateException : Failed to load ApplicationContext 에러

yml파일을 읽어들이지 못할때 생기는 에러이다.
필자는 yml파일에 오타가 있어서 생겼다.

2-2 테스트 코드 실행 완료

테스트 코드를 실행하고 DB에 접속해보면 멤버 테이블이 생성된것을 확인 가능하다.

생성된 이유는 테스트 코드가 실행될때 hibernate가 생성해준다.
(yml파일에 hibernate: ddl-auto 설정을 해줬기 때문)

create table 위를 잠깐 살펴보면 테이블을 먼저 날리는 것을 알 수 있다.

주의.

기본적으로 테스트에서 Transactional을 해주게 된다면 모든 테스트가 끝나고 난 후 데이터를 Rollback한다. 테스트를 한 데이터를 남기고 싶다면 옵션 설정 필요.

테스트가 끝나도 데이터가 남아있는 것을 확인 할 수 있음.

꿀팁!

테스트 케이스 전체 코드를 보면 위와 같은 코드가 있다.
이것은 결과값은 True이다. 왜 True일까??

해답:
같은 트랜잭션안에서 저장을 하고 조회를 하면 영속성 컨텍스트(PersistenceContext)가 똑같다. 같은 영속성 컨텍스트 안에서는 id값이 같으면 같은 Entity로 식별한다.

결과값:

결과를 보면 true를 확인할 수 있고, 더 자세히 보면 select문 자체가 없는 것을 확인할 수 있다. insert query만 나갔는데 그 이유는 위에서 말한것이다. 같은 영속성 컨텍스트에 있다고 판별나서 1차 캐시에서 꺼내온다.

3. jar 빌드 확인하기

Window cmd

성공한다면 마지막에 Build Success가 뜬다.

포트가 열려있다면 에러가 날 것이므로 사용중인 포트를 닫고 실행하자.

명령어:
netstat -a -o
taskkill /f /pid 번호

4. 쿼리 파라미터 로그 남기기

yml 파일에 org.hibernate.type 추가하기.

이런 방법도 있지만 외부 라이브러리를 사용해보겠다.

P6SPY

build.gradle에 추가

실행 모습

profile
이노오오옴

0개의 댓글