본문 바로가기
JPA Tutorial

[스프링 부트와 JPA 활용 1] JPA와 DB 설정

by 미소5 2023. 9. 6.
  • main/resources/application.yml
spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop
    username: sa
    password:
    driver-class-name: org.h2.Driver

  jpa:
    hibernate:
      ddl-auto: create
      #이 옵션은 애플리케이션 실행 시점에 테이블을 drop하고, 다시 생성

    properties:
      hibernate:
        #show_sql: true   	#System.out에 실행SQL 남김
        format_sql: true


logging.level:
  org.hibernate.SQL: debug		#logger를 통해 실행SQL 남김

  #org.hibernate.type: trace    #SQL 실행 파라미터를 로그로 남긴다
  • yml 파일은 띄어쓰기(스페이스) 2칸으로 계층을 만든다. 따라서 띄어쓰기 2칸을 필수로 적어야 한다.
    •  datasource 는  spring: 하위에 있고 앞에 띄어쓰기 2칸이 있으므로  spring.datasource 가 된다.

 

 


  • 모든 로그 출력은 가급적 logger를 통해 남겨야 한다.
    • show_sql  옵션은  System.out에 하이버네이트 실행 SQL을 남긴다.
    • org.hibernate.SQL 옵션은  logger를 통해 하이버네이트 실행 SQL을 남긴다.

 

 


  • JPA와 DB설정  실제 동작하는지 확인해보자
/**회원 엔티티*/

@Entity
@Getter @Setter
public class Member {

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

}
/**회원 리포지토리*/

@Repository
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);
    }

}

 


  • 테스트 통과!
@RunWith(SpringRunner.class)
@SpringBootTest
public class MemberRepositoryTest {

    @Autowired MemberRepository memberRepository;

    @Test
    @Transactional  //JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다.
    //@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.getUsername());
        
        //JPA 엔티티 동일성 보장: 식별자(id)값이 같으면, 같은 엔티티로 인식
        Assertions.assertThat(findMember).isEqualTo(member); 	//findMember==member
    }

}

 


테스트 실행 결과, 매핑한 정보들이 다 생성되었다.

 

 


  •  @Rollback(false)  추가

Commit 된다!

 

 

→ 스프링 부트를 통해 복잡한 설정이 다 자동화 되었다! (persistence.xml 도 없고, LocalContainerEntityManagerFactoryBean 도 없다.)

 

 

[Spring 입문9] 스프링 DB 접근 기술: H2 데이터베이스 설치 (tistory.com)

 

[Spring 입문9] 스프링 DB 접근 기술: H2 데이터베이스 설치

h2 데이터베이스 1.4.200 버전을 설치 https://www.h2database.com/html/download-archive.html Archive Downloads www.h2database.com h2.bat 실행 최초 한번 연결 후(jdbc:h2:~/test), ~/test.mv.db 파일 생성 확인 이후부터는 jdbc:h2:tcp:

joly156.tistory.com

 


  • 쿼리 파라미터 로그 남기기
  • application.yml
org.hibernate.type: trace    #SQL 실행 파라미터를 로그로 남긴다
  • build.gradle
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'

 


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

 



[Spring 입문13] 스프링 DB 접근 기술: JPA (tistory.com)

 

[Spring 입문13] 스프링 DB 접근 기술: JPA

JPA 반복 코드는 물론이고, 기본적인 SQL도 JPA가 (자동으로)직접 만들어서 실행해준다. SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다. →개발 생산성을 크게 높일

joly156.tistory.com

[Spring 입문4] -스프링 빈과 의존관계: 컴포넌트 스캔과 자동 의존관계 설정 (tistory.com)

 

[Spring 입문4] -스프링 빈과 의존관계: 컴포넌트 스캔과 자동 의존관계 설정

스프링 빈을 등록하는 2가지 방법 컴포넌트 스캔과 자동 의존관계 설정 자바 코드로 직접 스프링 빈 등록하기 컴포넌트 스캔과 자동 의존관계 설정 회원 컨트롤러가 회원서비스와 회원 리포지

joly156.tistory.com

 

728x90
반응형