Skip to content

JPA Section1

SH-Seol edited this page May 18, 2024 · 1 revision

JPA와 DB 설정, 동작확인

@GetMapping("hello")
    public String hello(Model model){
        model.addAttribute("data", "hello!");
        return "hello";
    }
  • model에다 data를 실어서 보내는 것

[application.properties](http://application.properties) → application.yml

  • 양이 많아지면 yml이 더 관리하기 쉽다.
spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop//;MVCC=TRUE
    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
    
  • 이 것을 쓰는 방법은 [docs.spring.io/spring-boot/docs/버전/reference/html/](http://docs.spring.io/spring-boot/docs/버전/reference/html/) 에서 배우면 된다!
  • logging에서 hibernate.sql : debug로 해놓으면, hibernate가 남기는 모든 로그를 디버그 모드에서 볼 수 있다.
  • show_sql:true와 차이점은 show는 system.out으로 출력, 후자는 로거
  • ddl-auto:create는 기존에 가지고 있던 entity들을 지우고 새로 생성한다를 의미
  • MVCC는 생략해야 돌아간다! H2 업데이트 이후 생략해도 된다고 한다.
  • hibernate.type을 trace로 하면, 로그에 값이 들어간다.
@Test
    @Transactional
    @Rollback(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.getId());
    }
  • 여기서 Transactional이 없으면 에러가 난다.
    • 그 이유는 EntityManager를 통한 모든 데이터 변경은 항상 Transaction을 통해서만 이루어지기 때문이다.
    • Transactional annotation은 Spring v, Jakarta v가 있는데 Spring을 추천한다.
  • @RunWith는 Junit5부터는 생략가능하다.
  • @Rollback을 이용하면 H2에 데이터가 사라지지 않고 memberA가 남게 된다.

쿼리 parameter 로그 남기기

쿼리 파라미터 로그 남기는 것은 시스템 자원을 사용하므로 개발 단계에서는 편히 사용해도 되지만,

운영시스템에 적용하려면 성능 테스트가 필요하다.

Clone this wiki locally