프로그래밍/spring boot

[스프링부트] 실전! 스프링 부트와 JPA 활용1 #1-5 JPA와 DB 설정, 동작확인

aSpring 2023. 10. 25. 15:19
728x90
728x90
※ 본 포스팅은 김영한 강사님의 인프런 '실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발' 강의를 들으며 작성한 수강일지 입니다.

| 프로젝트 환경설정

1. 프로젝트 생성
2. 라이브러리 살펴보기
3. View 환경설정
4. H2 데이터베이스 설치
5. JPA와 DB 설정, 동작 확인

5. JPA와 DB 설정, 동작 확인

1. application.yml 파일 만들기(기존 application.properties는 삭제)

- yml 파일이 라이브러리가 늘어나고 했을 때 더 깔끔하다 생각하신다고!

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop; # MVCC=TRUE 여러개 한번에 접근했을 때 좀 더 빠르게 처리되므로 권장 -> 더이상 사용 ㅌ
    username: sa
    password:
    driver-class-name: org.h2.Driver # DB connection과 관련된 data source 설정이 완료 됨

  jpa:
    hibernate:
      ddl-auto: create # 자동으로 table을 만들어주는 모드(애플리케이션 실행 시점에 내가 가지고 있는 엔티티 정보를 보고 다 지운 후 다시 생성)
    properties:
      hibernate:
#          show_sql: true # system.out에 출력 -> 운영 환경에서는 system.out에 찍으면 안됨, 전부 log에 찍어야 함
        format_sql: true

logging:
  level:
    org.hibernate.SQL: debug # JPA나 Hibernate가 생성하는 SQL이 모두 보이게 됨 -> log에 출력

 

2. 엔티티, Repository를 만들어 동작 확인

- Member

// src/main/java/jpabook.jpashop/Member

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;
}

- MemberRepository

// src/main/java/jpabook.jpashop/MemberRepository

package jpabook.jpashop;

import org.springframework.stereotype.Repository;

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

@Repository // component scan의 대상이 됨
public class MemberRepository {

    @PersistenceContext // spring boot가 entity manager를 주입해 줌
    private EntityManager em;

    // 저장하는 코드
    public Long save(Member member) {
        em.persist(member);
        return member.getId(); // 저장 후에는 가급적이면 아이디 정도만 조회(전체를 return 하지말고)
    }

    // 하나 조회
    public Member find(Long id) {
        return em.find(Member.class, id);
    }
}

- Repository : Entity 같은 것을 찾아주는 건데, DAO와 비슷한 것이라고 알고있기

 

3. 테스트 케이스 만들기

- Command + Shift + T : 누르면 테스트 케이스를 생성한다

// src/test/java/jpabook.jpashop/MemberRepositoryTest

package jpabook.jpashop;

import org.assertj.core.api.Assertions;
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.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

//import static org.junit.Assert.*;

//@RunWith(SpringRunner.class) // JUnit 5로 오면서 필요없어짐
@SpringBootTest
public class MemberRepositoryTest {

    @Autowired
    MemberRepository memberRepository;

    @Test
    @Transactional // 2가지 중에 spring framework 걸로 하는 것을 권장
    @Rollback(false) // 테스트 후 db rollback 하지않음. 테스트 케이스지만 rollback 하지않고 commit 해버리는 것
    public void testMember() throws Exception {
        //given
        Member member = new Member();
        member.setUsername("memberA");

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

        //then
        Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
        Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        Assertions.assertThat(findMember).isEqualTo(member); // == 비교라고 보면 됨, 저장 한 것과 조회한 것이 같을까? --> true
        System.out.println("findMember == member : " + (findMember == member)); // 영속성 컨텍스트에서 식별자가 같으면 같은 엔터티로 인식한다고 보면 됨
        // 1차 캐시라고 불리는 곳에서도 기존에 관리하던 것이 나온 것 -> 다시 SELECT 쿼리도 때리지않음
    }
}

- JUnit4, 5 차이 때문에 에러가 났었지만 구글링도 해보고 찾아본 결과 위 코드로 정상 작동하는 것을 확인할 수 있었다.

- H2에도 확인을 해보면, 자동으로 MEMBER 테이블을 만들어 주고 데이터도 우리가 적어준 대로 추가된 것을 확인할 수 있다.

- 원래라면 @Rollback(false)을 빼고, 반복적인 테스트를 위해 테스트 시 마다 테이블을 삭제하고 다시 생성한 뒤에 데이터를 rollback을 해버려서 테이블만 남아있고 데이터는 보이지 않는게 정상이지만 assert만 가지고 내 코드를 믿을 수 없을 때, rollback하지않고 commit 하도록 @Rollback(false)을 넣어주었기 때문에 위처럼 데이터가 남아있는 것을 볼 수가 있다.

 

4. jar 빌드해서 동작 확인

# 경로는 사람마다 다르니 주의
cd /Users/spring/Desktop/study/jpashop

ll

# clean build -> 캐시들을 지웠다가 다시 빌드 해줌
./gradlew clean build

# 해당 위치에 jar 파일 생성
cd build/libs

ll

# 실행
java -jar jpashop-0.0.1-SNAPSHOT.jar

- intelliJ가 아닌 terminal에서 실행한 것

- 실행했으니 localhost:8080에서 확인 해보기

- 실행이 잘 되고 있는 것을 확인할 수 있다

 

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

방법1. yml에 org.hibernate.type: trace 설정 주기

org.hibernate.type: trace

- 여전히 ? 로 뜨지만 로그에 해당 파라미터들이 뭔지 표시를 해준다

 

방법2. 외부 라이브러리(P6Spy) 사용하기

https://github.com/gavlyukovskiy/spring-boot-data-source-decorator

강의에서는 1.5.6 버전을 사용

상단에는 원래처럼 ? 로 나오는 파라미터, 하단에는 해당 파라미터가 뭔지를 분명하게 보여준다.

어떤 식으로 로그를 찍을지 설정도 가능함

 

※ 이런 라이브러리들은 운영 단계에서는 사용할지 말지 성능 테스트를 꼭 해보아야 함!! 운영 시에 성능 이슈가 생길 수도 있음

728x90
728x90