스프링부트 공부기록(19) - MariaDB 설치, JPARepository 인터페이스 사용, 테스트 코드 CRUD 연습
my code archive
article thumbnail
반응형

🤍MariaDB 설치와 데이터베이스 생성

  • MariaDB는 MySQL과 거의 동일한 기능을 제공하면서 완전한 오픈 소스라는 장점이 있다.
  • MariaDB를 통해 상용화된 서비스를 개발하고 운영하여도 라이센스 비용 걱정X, AWS와 연동 시에도 최소한의 비용으로 운영이 가능함.

 

1. 먼저 MariaDB를 설치해 준다. 나는 이미 설치되어 있어서 이 과정은 생략했다.

 

2. ROOT 계정 패스워드 기억하기, UTF-8 세팅 중요!!

 

3. HeidiSQL 프로그램을 실행해서 ROOT 계정 정보를 입력 후 접속

 

4.신규 데이터베이스를 bootex라는 이름으로 생성한다. 

 

5. 사용자 인증 및 권한 관리를 선택 후, bootuser라는 이름으로 계정을 생성하고 해당 데이터베이스에 모든 권한을 추가하고 저장한다.


🤍Spring Data JPA를 이용하는 프로젝트 생성

 

1. 의존성 4가지 추가

 

2. MariaDB 관련 드라이버를 build.gradle 파일의 dependencies 항목에 추가

 // https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client
    implementation group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '2.7.0'

 

3. application.properties 파일 수정

 

💡ORM과 JPA

  • ORM(Object Relational Mapping)은 객체 지향과 관련이 있음. 간단히 말하자면 객체지향 패러다임을 관계형 데이터베이스에 보존하는 기술. 관계형 데이터베이스는 테이블 사이의 관계를 통해 구조적 데이터를 표현한다면, 객체지향에서는 '참조'를 통해 어떤 객체가 다른 객체들과 어떤 관계를 맺고 있는지를 표현함.
  • JPA(Java Persistence API)은 ORM을 Java 언어에 맞게 사용하는 스펙임. ORM이 좀더 상위 개념이고, JPA는 Java에 국한된 개념으로 볼 수 있음.
  • 스프링부트는 JPA의 구현체 중에서 'Hibernate'라는 구현체를 이용함. (오픈소스로서 ORM을 지원하는 프레임워크)

 

4. 엔티티(Entity) 클래스 작성

import lombok.*;

import javax.persistence.*;

@Entity //해당 클래스가 엔티티를 위한 클래스이며, 해당 클래스의 인스턴스들이 JPA로 관리되는 엔티티 객체라는 것을 의미함.
@Table(name = "tbl_memo")   //데이터베이스상에서 엔티티 클래스를 어떠한 테이블로 생성할 것인지에 대한 정보를 담음.
@ToString
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Memo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long mno;

    @Column(length = 200, nullable = false)
    private String memoText;

}

 

5. 프로젝트를 실행하면 엔티티 클래스의 @Table의 name 속성과 동일하게 테이블 이름이 지정된 것을 확인할 수 있다.

 

6. 데이터베이스에서도 테이블이 생성되었음을 확인할 수 있다.


🤍테스트 코드를 통한 CRUD 연습

  • JpaRepository : 인터페이스, Spring Data JPA는 이를 상속하는 인터페이스를 선언하는 것만으로 모든 처리가 간단하게 끝난다.

1. MemoRepository 인터페이스 생성

public interface MemoRepository extends JpaRepository<Memo, Long> {
}

 

  • insert : save(엔티티 객체)
  • select : findById(키 타입), getOne(키 타입)
  • update : save(엔티티 객체)
  • delete : deleteById(키 타입), delete(엔티티 객체)

=>insert와 update 작업에 사용하는 메서드가 동일하게 save를 이용하는 것은 JPA의 구현체가 메모리상에서 객체를 비교하고 없다면 insert, 존재한다면 update를 동작시키는 방식으로 동작하기 때문이다.

 

2. 등록(Insert) 테스트

  • 100개의 새로운 Memo 객체를 생성하고 MemoRepository를 이용해서 insert 하는 방식.
  • Memo의 memoText 는 Not Null 조건이므로 반드시 데이터를 넣어주고 테스트를 진행해야함.

 

DB를 조회해서 테스트 최종 결과를 확인할 수 있음.

 

3. 조회(Select) 테스트

 

  • findById 사용 : 실행 결과를 보면 findById를 실행한 순간에 이미 SQL은 처리가 되었고 === 부분은 SQL 처리 이후 실행된 것을 볼 수 있다.

  • getOne 사용 : getOne를 호출한 이후에 ===부분이 먼저 실행되고 System.Out.Println이 실행되면서 실제 객체를 사용하는 순간에 SQL이 동작하는 것을 확인할 수 있다.

 

4. 수정(Update) 테스트

 

실행 결과를 보면 내부적으로 select 쿼리로 해당 번호의 Memo 객체를 확인하고 이를 update함.

 

5. 삭제(Delete) 테스트

 

삭제하려는 번호(mno)의 엔티티 객체가 있는지 먼저 확인 후 delete 진행


🤍페이징 / 정렬 처리하기

 

💡Pageable 인터페이스

  • 페이지 처리에 필요한 정보를 전달하는 용도의 타입, 실제 객체를 생성 시에는 org.springframework.data.domain.PageRequest.라는 클래스를 사용함.
  • PageRequest 클래스 생성자는 protected로 선언되어 new를 이용할 수 없으며 of()를 이용해서 처리해야 함.
  • of(int page, int size) : 0부터 시작하는 페이지 번호와 개수(size), 정렬이 지정되지 않음
  • of(int page, int size, Sort.Direction direction, String ...props) : 0부터 시작하는 페이지 번호와 개수, 정렬의 방향과 정렬 기준 필드들
  • of(int page, int size, Sort sort) : 페이지 번호와 개수, 정렬 관련 정보

 

1. 페이징 처리

  • Spring Data JPA를 이용한 페이지 처리는 '0'부터 시작함!! 중요!!

 

MariaDB에서 페이징 처리에 사용하는 limit 구문이 사용됨, 두 번째 쿼리에서는 count()를 이용해서 전체 개수를 처리함.

 

2. 정렬 조건 추가하기


🤍쿼리 메서드(Query Methods) 기능과 @Query

  • 쿼리 메서드 : 메서드의 이름 자체가 쿼리의 구문으로 처리되는 기능
  • @Query : SQL과 유사하게 엔티티 클래스의 정보를 이용해서 쿼리를 작성하는 기능

 

1. mno 값이 70부터 80 사이의 객체들을 구하고 mno의 역순으로 정렬하고 싶을 때

public interface MemoRepository extends JpaRepository<Memo, Long> {

    //mno값이 70부터 80 사이의 객체들을 구하고 mno의 역순으로 정렬하고 싶다면
    List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to);
}

 

2. 테스트 코드 작성

 

메서드 이름이 쿼리 구문으로 처리됨,

 

2. 쿼리 메서드 + Pageable 결합

public interface MemoRepository extends JpaRepository<Memo, Long> {

    //mno값이 70부터 80 사이의 객체들을 구하고 mno의 역순으로 정렬하고 싶다면
    List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to);

    Page<Memo> findByMnoBetween(Long from, Long to, Pageable pageable);
}

 

 

3. deleteBY로 시작하는 삭제 처리 : 메모의 번호(mno)가 10보다 작은 데이터를 삭제하고 싶을 때

public interface MemoRepository extends JpaRepository<Memo, Long> {
    //mno가 10보다 작은 데이터를 삭제한다면
    void deleteMemoByMnoLessThan(Long num);
}

 

4. 테스트 코드 작성

 

5. 한 번에 삭제되는 것이 아니라 각 엔티티 객체를 하나씩 삭제하기 때문에 실제 개발에서는 잘 사용되지 않음.

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형