Post

[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๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
p6spySQL ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋กœ๊ทธ๋กœ ํ™•์ธ
extends๋งŒ์ƒ์†๋งŒ์œผ๋กœ CRUD ์‚ฌ์šฉ

Spring Data JPA์˜ ๋งค๋ ฅ์€ โ€œ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋งŒ ํ•˜๋ฉด CRUD๊ฐ€ ๋โ€์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋ณต์ ์ธ Repository ์ฝ”๋“œ๋ฅผ ์—†์• ์ฃผ๋‹ˆ, ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.