반응형
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)을 설정하고자 할 때 사용
  1. GenerationType.IDENTITY : MySQL의 AUTO_INCREMENT 방식을 이용
  2. GenerationType.AUTO(default: JPA구현체(Hibernate)가 생성 방식을 결정
  3. GenerationType.SEQUENCE: DB의 SEQUENCE를 이용해서 키를 생성 . @SequenceGenerator와 같이 사용
  4. 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

 

[Spring Boot] MySQL & JPA 연동 및 테스트 (Gradle 프로젝트)

SpringBoot에서 MySQL 그리고 Spring Data JPA를 연동하는 방법에 대해 알아보도록 하겠습니다. 1. 프로젝트에 의존성 추가하기 build.gradle에 의존성을 아래와 같이 추가해줍니다. dependencies { implementatio..

dev-coco.tistory.com

 

 

감사합니다.

 

반응형

+ Recent posts