jdbc:h2:~/datajpa
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
하고, 다시 생성한다.JPA
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
protected Member() {
}
public Member(String username) {
this.username = username;
}
}
@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);
}
}
@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
}
}
Spring Data JPA
public interface MemberRepository extends JpaRepository<Member, Long> {
}
JpaRepository<T, ID>
T
: 엔티티 타입ID
: ID 필드 타입id
는 Long
타입이므로 Long
!@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가 알아서 구현체를 만들어준다.
→ 사실 MemberJpaRepository
와 MemberRepository
가 거의 동일한 것!