JPA(Java Persistence API) 란?
자바 진영의 ORM 기술표준으로, 인터페이스의 모음이다. ※ 출처참조
환경
IntelliJ IDEA Ultimate 2021. 3. 2
Gradle 7.4.1
MySQL 5.7
Build.gradle 의존성 추가
dependencies {
implementation 'mysql:mysql-connector-java'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
application.properties에 DB 정보 입력
# MySQL 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# DB Source URL
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/Schema?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul
#DB Username
spring.datasource.username=<username>
#DB Password
spring.datasource.password=<password>
#true 설정시 JPA 쿼리문 확인 가능
spring.jpa.show-sql=true
#DDL(Create, Alter, Drop) 정의시 DB의 고유 기능을 사용할 수 있다.
spring.jpa.hibernate.ddl-auto=update
# JPA의 구현체인 Hibernate가 동작하면서 발생한 SQL의 가독성을 높여준다.
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=[]
- create : 기존 테이블을 삭제하고 새로 생성 [ Drop + Create ]
- create-drop : Create 속성에 추가로 어플리케이션을 종료할 때 생성한 DDL을 제거 [ Drop + Create + Drop]
- update : DB 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정 [ 테이블이 없을 경우 Create ]
- validate : DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 어플리케이션을 실행하지 않음
- none : 자동 생성 기능을 사용하지 않음
JPA Entity 생성?
@ToString
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table (name ="tbl_memo") // 클래스명과 테이블명이 다를때 매핑시켜주기위해 사용
@Entity
public class Memo {
@Id
@GeveratedValue(strategy = GenerationType.IDENTITY) //MySQL의 Auto_INCREMENT를 사용
private Long id;
@Column(length =200, nullable =false)
private String memoText;
}
사용 어노테이션 정리
- @Entity : DB의 테이블을 뜻함 [ Spring Data JPA 에서는 반드시 @Entity 어노테이션을 추가해야함]
- @Table : DB 테이블의 이름을 명시 [ 테이블 명과 클래스 명이 동일한 경우 생략가능 ]
- @Getter : Lombok의 Getter를 이용해 Getter 메소드를 생성하고 @Builder를 이용해서 객체를 생성할 수 있게처리한다.
- @Builder를 이용하기 위해 @AllArgsContructor 와 @NoArgsContructor를 같이 처리해야 컴파일 에러가 발생하지 않음
- @Id : Privary Key를 뜻함
- @HeneratedValue : Primary Key의 키 생성 전략(Strategy)을 설정하고자 할 때 사용
- GenerationType.IDENTITY : MySQL의 AUTO_INCREMENT 방식을 이용
- GenerationType.AUTO(default: JPA구현체(Hibernate)가 생성 방식을 결정
- GenerationType.SEQUENCE: DB의 SEQUENCE를 이용해서 키를 생성 . @SequenceGenerator와 같이 사용
- GenerationType.TABLE: 키 생성 전용 테이블을 생성해서 키 생성. @TableGenerator와 함께 사용
- @Column : DB Column을 명시
- @Transient : @Column과 반대로 테이블에 컬럼으로 생성되지 않은 필드의 경우에 사용한다.
JPA Repository 생성
Spring Data JPA는 JPA의 구현체인 Hibernate를 이용하기 위한 여러 API를 제공합니다.
그 중에서 가장 많이 사용되는 것이 JPA Repository라는 인터페이스입니다.
public interface MemoReporisotry extends JpaRepository<Memo, Long> {
}
작성된 MemoRepository는 JpaRepository를 상속하는 것만으로 모든작업이 끝납니다.
- MemoRepository를 이용해서 작성된 테이블에 SQL문 없이 CRUD 작업을 할 수 있게 됩니다.
- JpaRepository의 제네릭 타입으로는 <Entity, PK의 타입>을 지정해주면 Spring Data JPA는 자동으로 스프링의 빈(bean)으로 등록됩니다.
- Spring이 내부적으로 인터페이스 타입에 맞는 객체를 생성해서 bean으로 등록
테스트를 통한 CURD 기능 확인
1.1 Create 테스트
Insert를 할 때 Repository 객체의 save()메소드를 사용합니다.
@SpringBootTest
pulbic class MemoRepositoryTest{
@Autowired
MemoRepository memoRepository;
@Test
public void InsertDummies() {
IntStream.rangeClosed(1, 10).forEach( i -> {
Memo memo = Memo.builder()
.memoText("Sample...." + i)
.build();
//Create!
memoRepository.save(memo);
});
}
}
1.2 Read 테스트
Select를 할 때 Repository 객체의 findById() 메소드를 사용합니다.
findById()를 통해 기본키를 넣어주면, 해당하는 객체를 Optional 타입으로 반환해줍니다.
@SpringBootTest
pulbic class MemoRepositoryTest{
@Autowired
MemoRepository memoRepository;
@Test
public void SelectDummies() {
Long id = 10L;
Optionam<Memo> result = memoRepository.findById(id);
System.out.println("------------------------------------------";
if(result.isPresned()){
Memo memo = result.get();
System.out.println(memo);
}
}
}
1.3 Update 테스트
수정 작업과 등록작업은 동일하게 save()를 이용해서 처리합니다.
내부적으로 해당 엔티티의 @Id값이 일치하는지를 확인해서 Insert 혹은 Update작업을 처리합니다.
@SpringBootTest
pulbic class MemoRepositoryTest{
@Autowired
MemoRepository memoRepository;
@Test
public void UpdateDummies() {
Memo memo = Memo.builder()
.id(10L)
.memoText("Update Text")
.build();
memoRepository.save(memo);
}
}
1.4 Delete 테스트
삭제 작업도 수정 작업과 동일한 개념으로 삭제하려는 엔티티 객체가 있는지 먼저 확인하고, 삭제합니다
@SpringBootTest
pulbic class MemoRepositoryTest{
@Autowired
MemoRepository memoRepository;
@Test
public void DeleteDummies() {
Long id = 10L;
memoRepository.deleteById(id);
}
}
출처
https://dev-coco.tistory.com/85
감사합니다.
'BackEnd > Java' 카테고리의 다른 글
[Spring] Spring Security + jwt 사용 (0) | 2022.07.23 |
---|---|
[Thymeleaf] layout-dialect 사용하기 (0) | 2022.07.22 |
[IntelliJ] Lombok 설치 및 Lombok Annotation 정리 (0) | 2022.03.16 |
JAVA 버전이 변경 안될때 체크사항 (0) | 2022.03.16 |
IntelliJ 설치 (0) | 2022.03.15 |