[JPA] JPA와 DB 설정, 동작 확인

코드 속의 "진돌"·2023년 11월 21일
post-thumbnail

✅ application.yml

위치 : main/resources/application.yml

spring:
	# 데이터베이스 커넥션 관련 설정
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop
    username: sa
    password:
    driver-class-name: org.h2.Driver

	# JPA 관련 설정
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        show_sql: true
        format_sql: true

# 로그 관련 설정
logging:
  level:
    org.hibernate.sql: debug
    org.hibernate.type: trace   #스프링 부트 2.x, hibernate5

✏️ 상세 설명

  • spring.datasource.url: MVCC=TRUE → H2 1.4.198 버전부터 제거

  • spring.jpa.hibernate.ddl-auto: create

    • 애플리케이션 실행 시점에 테이블을 drop 하고, 다시 생성

참고 : 모든 로그 출력은 가급적 로거를 통해 남겨야 함


  • spring.jpa.properties.hibernate.show_sql
    • System.out 에 하이버네이트 실행 SQL을 남김.
    • 개발 단계에선 사용할 수 있으나, 운영 환경에서는 사용 자제
  • logging.level.org.hibernate.sql
    • logger를 통해 하이버네이트 실행 SQL을 남김.

주의!

yml 파일은 띄어쓰기(스페이스) 2칸으로 계층을 만듬.
따라서 띄어쓰기 2칸을 필수로 적어주어야 함.


✅ 실제 동작하는 지 확인

✏️ 회원 엔티티

@Entity
@Getter @Setter
public class Member {

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

}

✏️ 회원 레포지토리

@Repository // ComponentScan 대상 -> 자동으로 bean에 저장
public class MemberRepository {

  @PersistenceContext // EntityManager 주입
  private EntityManager em;

  public Long save(Member member) {
    em.persist(member);
    return member.getId();  // 커맨드와 쿼리를 분리
  }

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

✏️ 테스트

단축키

  • 테스트 코드 생성
    • commend + shift + T
  • 변수 뽑는 단축키 (Extract → Variable)
    • commend + option + V
@RunWith(SpringRunner.class)  // Junit한테 알려주기
@SpringBootTest
public class MemberRepositoryTest {

  @Autowired MemberRepository memberRepository;  // Injection 주입

  @Test
  @Transactional  // Transaction을 주입하지 않으면 에러 발생
  @Rollback(value = false)
  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);  // JPA 엔티티 동일성 보장
    System.out.println("findMember == member : " + (findMember == member));

  }
}

intelij 단축키 만들기

  • Setting → Live Templates → custom
  • Template text
    @Test
    public void $NAME$() throws Exception {
      // given
      $END$
      // when
      
      // then
    }

주의!

  • @Test : JUnit4 → org.junit.Test

✏️ Entity, Repository 동작 확인

✏️ H2 동작 확인

  • @Rollback(value = false) 적용 시

✏️ JPA 영속성 보장 확인

Assertions.assertThat(findMember).isEqualTo(member);  // JPA 엔티티 동일성 보장
System.out.println("findMember == member : " + (findMember == member));

  • 같은 트랜잭션 안에서 저장하고 조회하면 영속성 컨텍스트가 같다.
  • 같은 영속성 컨택스트 안에서는 id 값이 같으면 같은 엔티티로 식별한다.

✏️ jar 빌드해서 동작 확인

  • 콘솔에서 빌드



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

  • 로그에 다음 추가 : SQL 실행 파라미터를 로그로 남긴다.

참고

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

profile
매일 성장하는 주니어 개발자의 기록📝

0개의 댓글