[스프링 부트와 JPA 활용 1] Section 01 - 프로젝트 환경설정
카테고리: SpringBoot-JPA
태그: spring boot java
개발 순서 안내
일반적인 개발의 순서와 같은 방식으로 진행한다.
- 개발 환경 세팅
- 요구사항 분석
- 도메인 모델 설계
- 엔티티 설계
- 테이블 설계
- JPA로 엔티티와 테이블을 ORM 메핑
- 애플리케이션 아키텍처 구성
- 핵심 비즈니스 로직 개발
프로젝트 생성
스프링 부트 스타터를 이용하여 초기 세팅을 한다. -> 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));
}
}
댓글 남기기