[Spring Data JPA] Spring Data Jpa์ ์ฌ์ฉ๋ฒ
๐ ๋ค์ด๊ฐ๋ฉฐ
์ด๋ฒ ๊ธ์์๋ Spring Data JPA์ ๊ฐ๋ ๊ณผ ๊ธฐ๋ณธ ์ค์ ยท์ฌ์ฉ๋ฒ์ ์ ๋ฆฌํ๋ค.
Spring Data JPA๋? ๊ธฐ์กด JPA๋ฅผ ์ธํฐํ์ด์ค๋ง์ผ๋ก ์กฐ์ํ๊ฒ ํด, ๋ ํธํ๊ฒ ์ธ ์ ์๋๋ก ๋ง๋ ๊ฒ. ์คํ๋ง ๋ฐ์ดํฐ์
PagingAndSortingRepository๋ฅผ ์์ํดJpaRepository์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
1. ํ๊ฒฝ ์ค์
build.gradle โ ๊ณต๋ถ์ฉ์ด๋ผ ๊ฐ๋ฒผ์ด H2 DB๋ฅผ ์ฌ์ฉํ๋ค.
1
2
3
4
5
6
7
8
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
}
๐ก p6spy๋ ์คํ ์ insert๋ฌธ ๋ฑ์์
?๋ก ๊ฐ๋ ค์ง๋ ์ค์ ์ ๋ ฅ๊ฐ์ ๋ก๊ทธ์์ ๋ณด์ด๊ฒ ํด์ค๋ค.
application.yml:
1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/datajpa
username: sa
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
format_sql: true
logging.level:
org.hibernate.SQL: debug
2. ์ฝ๋ โ ์ํฐํฐ + Repository
Member.java (์ํฐํฐ):
1
2
3
4
5
6
7
8
9
10
@Entity
@Getter
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
public Member(String username) { this.username = username; }
public Member() {}
}
MemberRepository.java โ ์ฌ๊ธฐ๊ฐ ํต์ฌ์ด๋ค.
1
2
public interface MemberRepository extends JpaRepository<Member, Long> {
}
๐ก ๋ด์ฉ์ด ๋น์ด ์๋๋ฐ? ๋ง๋ค. ํ์ํ ๋ฉ์๋(
save,findById๋ฑ)๋ ์ด๋ฏธJpaRepository์ ์์ผ๋ฏ๋ก, ์์๋ง ๋ฐ์ผ๋ฉด(์ธํฐํ์ด์ค๋ผ๋ฆฌ๋extends) ๋ฐ๋ก ์ธ ์ ์๋ค.
3. ํ ์คํธ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@SpringBootTest
@Transactional
@Rollback(value = false) // ๋ฐ์ดํฐ ์ฝ์
์ ๋์ผ๋ก ํ์ธ
class MemberRepositoryTest {
@Autowired MemberRepository memberRepository;
@Test
public void testMember() {
Member member = new Member("memberB");
Member savedMember = memberRepository.save(member); // ์ ์ฅ
Member findMember = memberRepository.findById(savedMember.getId()).get();
assertThat(findMember.getId()).isEqualTo(member.getId());
assertThat(findMember).isEqualTo(member);
}
}
| ์ด๋ ธํ ์ด์ | ์ญํ |
|---|---|
@SpringBootTest | ํตํฉ ํ ์คํธ |
@Transactional | ํ ์คํธ ํ ๋กค๋ฐฑ |
@Rollback(false) | ๋กค๋ฐฑ ๋๊ธฐ(๋ฐ์ดํฐ ํ์ธ์ฉ) |
๐ ์ ๋ฆฌ
1
2
3
4
5
Spring Data JPA ์์
โโ ๊ฐ๋
JPA๋ฅผ ์ธํฐํ์ด์ค๋ง์ผ๋ก ์ฌ์ฉ (JpaRepository)
โโ ์ค์ build.gradle + application.yml (H2, p6spy)
โโ ์ฝ๋ ์ํฐํฐ + JpaRepository ์์๋ง
โโ ํ
์คํธ @SpringBootTest + @Transactional
| ๊ฐ๋ | ํ ์ค ์ ์ |
|---|---|
| JpaRepository | ๊ธฐ๋ณธ CRUD๋ฅผ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค |
| p6spy | SQL ํ๋ผ๋ฏธํฐ๋ฅผ ๋ก๊ทธ๋ก ํ์ธ |
| extends๋ง | ์์๋ง์ผ๋ก CRUD ์ฌ์ฉ |
Spring Data JPA์ ๋งค๋ ฅ์ โ์ธํฐํ์ด์ค๋ฅผ ์์๋ง ํ๋ฉด CRUD๊ฐ ๋โ์ด๋ผ๋ ๊ฒ์ด๋ค. ๋ฐ๋ณต์ ์ธ Repository ์ฝ๋๋ฅผ ์์ ์ฃผ๋, ๊ฐ๋ฐ์๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ์ ์๋ค.
Comments powered by Disqus.