[Spring Data JPA] 프로젝트 환경설정

kiteB·2021년 10월 29일
0

Spring Data JPA

목록 보기
1/8
post-thumbnail

[ 프로젝트 생성 ]

실행 결과

Test 실행


[ H2 데이터베이스 세팅 ]

  • jdbc:h2:~/datajpa


[ 스프링 데이터 JPA와 DB 설정, 동작확인 ]

1. application.yml

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/datajpa
    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 
  • spring.jpa.hibernate.ddl-auto:create:
    애플리케이션 실행 시점에 테이블을 drop하고, 다시 생성한다.

2. JPA

1) 회원 엔티티

@Entity
@Getter @Setter
public class Member {

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

    protected Member() {
    }

    public Member(String username) {
        this.username = username;
    }
}

2) 회원 JPA 리포지토리

@Repository
public class MemberJpaRepository {

    @PersistenceContext
    private EntityManager em;

    public Member save(Member member) {
        em.persist(member);
        return member;
    }

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

3) 테스트

@SpringBootTest
@Transactional
@Rollback(false)
class MemberJpaRepositoryTest {

    @Autowired
    MemberJpaRepository memberJpaRepository;

    @Test
    public void testMember() {
        Member member = new Member("memberA");
        Member savedMember = memberJpaRepository.save(member);

        Member findMember = memberJpaRepository.find(savedMember.getId());

        assertThat(findMember.getId()).isEqualTo(member.getId());
        assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        assertThat(findMember).isEqualTo(member);   //findMember == member
    }
} 

실행 결과


3. Spring Data JPA

1) 스프링 데이터 JPA 리포지토리

public interface MemberRepository extends JpaRepository<Member, Long> {
}
  • JpaRepository<T, ID>
    • T: 엔티티 타입
    • ID: ID 필드 타입
      → 회원 엔티티의 idLong 타입이므로 Long!

2) 테스트

@SpringBootTest
@Transactional
@Rollback(false)
class MemberRepositoryTest {

    @Autowired
    MemberRepository memberRepository;

    @Test
    public void testMember() {
        Member member = new Member("memberA");
        Member savedMember = memberRepository.save(member);

        Member findMember = memberRepository.findById(savedMember.getId()).get();

        assertThat(findMember.getId()).isEqualTo(member.getId());
        assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        assertThat(findMember).isEqualTo(member);   //findMember == member
    }
} 

실행 결과

MemberJpaRepositoryTest와 거의 동일한 코드로 테스트를 돌려보면 잘 실행된다!

🤔 interface 밖에 없는데 이게 어떻게 동작하는거지 ❓

이것이 바로 스프링 데이터 JPA의 힘이다!
인터페이스만 만들어주면 스프링 데이터 JPA가 알아서 구현체를 만들어준다.

→ 사실 MemberJpaRepositoryMemberRepository가 거의 동일한 것!

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글