[스프링 부트와 JPA 활용 1] Section 01 - 프로젝트 환경설정

Update:     Updated:

카테고리:

태그:

개발 순서 안내

일반적인 개발의 순서와 같은 방식으로 진행한다.

  1. 개발 환경 세팅
  2. 요구사항 분석
  3. 도메인 모델 설계
  4. 엔티티 설계
  5. 테이블 설계
  6. JPA로 엔티티와 테이블을 ORM 메핑
  7. 애플리케이션 아키텍처 구성
  8. 핵심 비즈니스 로직 개발

프로젝트 생성

스프링 부트 스타터를 이용하여 초기 세팅을 한다. -> https://start.spring.io/

사용 기능: web, thymeleaf, jpa, h2, lombok(반복 코드를 줄여주는 라이브러리), validation

JPA와 DB 설정

yml 파일을 이용하여 설정을 해준다.

# main/resources/application.yml

spring:
  datasource:
    url:  jdbc:h2:tcp://localhost/~/Study/springboot-jpa/jpashop
    username: sa
    password:
    driver-class-name: org.h2.Driver

  jpa:
    hibernate:
      ddl-auto: create  # 애플리케이션 실행 시점에 테이블을 drop하고, 다시 생성한다.
    properties: # hibernate와 관련된 특정한 properties를 쓸 수 있음
      hibernate:
        format_sql: true
        #show_sql: true

logging.level:
  org.hibernate.SQL: debug
  org.hibernate.type: trace

실제 동작 확인

간단한 회원 엔티티와 리포지토리를 만들고, 테스트 코드를 통해 동작을 확인해보자.

// Member.java

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.java

package jpabook.jpashop;

import org.springframework.stereotype.Repository;

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

@Repository
public class MemberRepository {

    @PersistenceContext // spring-boot가 이 어노테이션이 있으면 entity manager를 주입해준다.
    EntityManager em;

    public Long save(Member member) {
        em.persist(member); // command성이기 때문에 return값을 따로 안 만든다.
        return member.getId();  // 왜 member를 반환하지 않나: command랑 query를 분리해라..
    }

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

package jpabook.jpashop;

import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.junit.runner.RunWith;
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;


@RunWith(SpringRunner.class)    // JUnit에게 spring과 관련된 것으로 테스트를 할 것이라고 알려줌
@SpringBootTest // spring-boot로 테스트 할 거니까 추가
public class MemberRepositoryTest {

    @Autowired MemberRepository memberRepository;

    @Test
    @Transactional  // EntityManager를 통한 모든 데이터 변경은 항상 Transaction 안에서 이루어져야 함!
    // @Rollback(false)    // 기본적으로 test의 반복적 수행을 위해 한 번 수행 이후 roll back 되지만 눈으로 확인하고 싶다면 이 옵션을 사용하면 됨!
    public void testMember() {
        // given
        Member member = new Member();   // member를 생성하고
        member.setUsername("memberA");  // 이름 설정 후

        // when
        Long savedId = memberRepository.save(member);   // save한 뒤
        Member findMember = memberRepository.find(savedId); // id를 기반으로 찾아봤을 때

        // then
        Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());    // member의 id 기반 확인
        Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());    // member의 username 기반 확인

        // 같은 transaction 안에서 저장하고 조회하면 영속성 context가 똑같음. 같은 영속성 context 안에서는 id 값이 같으면 같은 엔티티로 인식
        Assertions.assertThat(findMember).isEqualTo(member);
        System.out.println("findMember == member: "+(findMember == member));
    }
}

SpringBoot-JPA 카테고리 내 다른 글 보러가기

첫 번째 글입니다 가장 최근 글입니다

댓글 남기기