반응형
목적
JPA 개념정리 및 사용법
정리하게된 계기
기존에는 Mybatis 를 사용하였는데 새프로젝트에서 JPA 를 사용하게되어 정리
JPA (Java Persistence API)
자바 ORM 을 위한 표준기술로 Hibernate, Spring JPA 와 같은 구현체가 있고 이것의 표준인터페이스
장점으로는 Mybatis 프로젝트와 비교하면 코드량이 줄고 객체위주 코드가 작성됨으로 가독성이 좋아지고
특정 데이터베이스에 종속되지 않는다.
단점으로는 복잡한 쿼리처리,성능저하위험,학습시간등 이있는데 복잡한 쿼리는 QueryDSL로 처리가 가능한거 같다.
개발환경 | |
OS | 윈도우10 |
Jdk | 1.8 |
Framework | Spring Boot 2.7.0 |
DB | mysql 8.0 |
패키지 구조
의존성추가
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
|
cs |
application.properties (Mysql 없이 H2를 이용하여 진행하여도 무관)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#JMX
spring.jmx.enabled=false
#mysql
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/dev
spring.datasource.username=lhj
spring.datasource.password=aaaa
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.hibernate.ddl-auto=update
|
cs |
Member Entity (여기서는 Lombok을 활용하였음)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package com.healthofficer.domain.member;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Comment;
import org.springframework.util.Assert;
import javax.persistence.*;
@Entity
@Getter
@NoArgsConstructor
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@Builder
public Member(int id,String name){
Assert.notNull(name, "name must not be null");
this.id = id;
this.name = name;
}
}
|
cs |
@Builder : JPA를 이용하면 Entity는 BUilder 기반으로 생성하는게 안전한 객체를 생성하는 방법
MemberRepository
1
2
3
4
5
|
import com.healthofficer.domain.member.Member;
import org.springframework.data.jpa.repository.JpaRepository;
public interface MemberRepository extends JpaRepository<Member, Integer> {
}
|
cs |
JpaRepository를 상속하여 Spring Data Jpa 에서 제공하는 JPA 구현을 위한 인터페이스이며
사전에 정의된 여러메소드를 통해 CRUD 쿼리를 수행
DataJpaTest
테스트코드 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
package com.healthofficer;
import com.healthofficer.dao.MemberRepository;
import com.healthofficer.domain.member.Member;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.annotation.Commit;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.List;
@ExtendWith(SpringExtension.class)
@DataJpaTest
@Commit
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class 맴버등록_TEST {
@Autowired
MemberRepository memberRepository;
@BeforeEach
void 맴버등록(){
for(int i = 0; i < 5; i++){
Member m = Member.builder().name("name_"+i).build();
memberRepository.save(m);
}
}
@Test
void 맴버확인(){
List<Member> result = memberRepository.findAll();
assertEquals(result.size(), 5);
}
//@AfterEach
//void 맴버삭제(){
// memberRepository.deleteAll();
//}
}
|
cs |
반응형
'Spring' 카테고리의 다른 글
Spring Boot zip END header not found (0) | 2022.11.02 |
---|---|
Spring Boot Connection Pool 설정 (0) | 2022.11.01 |
Spring Data Redis 로 Redis 연동 (0) | 2022.09.20 |
Intellij Spring boot Jmx RMI remote objects have benn exported (0) | 2022.09.13 |
Spring + Mssql + Mybatis 연동 (0) | 2019.12.03 |
댓글