도담도담

Spring Data JPA 개념 본문

IT 공부/KH 정보교육원

Spring Data JPA 개념

Zinisang 2021. 7. 7. 22:55

ORM

  • 객체 지향 개념을 이용하여 관계형 데이터베이스에 적용(보존) 하는 기술
  • 즉, 객체지향을 관계형으로 매핑하는 개념
  • 객체지향 구조와 관계형 데이터베이스와 유사
  객체지향 관계형 데이터베이스
데이터구조  클래스 테이블
데이터  멤버변수(데이터타입) 컬럼(데이터타입)
데이터 보관 인스턴스 Row(레코드)
차이점  객체지향 (행위)메서드
데이터, 행위 데이터
결론  ORM은 객체지향과 관계형 사이의 변환 기법을 의미.

JPA 

  • ORM을 Java 언어에 맞게 사용할 수 있도록 제공되는 스펙
  • ORM이 상위 개념이고, JPA는 Java언어에 국한된 개념
  • JPA는 단순한 스펙이기 때문에 구현체(Hibernate 등)마다 프레임워크가 다를 수 있다.

 


Hinernate

  • 스프링 부트는 JPA 구현체 중 Hinernate를 이용
  • Hibernate
    • ORM을 지원하는 오픈소스 프레임워크
    • 단독으로 프로젝트에 적용이 가능한 독립된 프레임워크
  • 스프링부트 프로젝트 생성시 추가한  Spring Data JPA는 Hibernate를 쉽게 사용할 수 있도록 추가적인 API를 제공

Spring Data JPA

Spring Data JPA 를 이용하여 개발 시, 필요한 코드는 두종류

1. 엔티티 클래스 : JPA를 통하여 관리되는 객체 (엔티티객체)를 위한 클래스

2. Repository : 엔티티 객체들을 처리하는 기능을 보유한 인터페이스

 

 

Repository 인터페이스

  • Spring Data JPA 에서 제공하는 인터페이스로 설계
  • 스프링 내부에서 자동으로 객체를 생성하고, 실행하는 구조이기 때문에
  • 개발자는 단순히 인터페이스를 하나 정의 하기만 하면 된다.
  • Spring Data JPA 에는 여러 종류의 인터페이스 기능을 이용하여 JPA 관련 작업을 별도의 코드 개발 없이 처리할 수 있도록 지원한다.
  • CRUD 작업, 페이징 처리, 정렬, 검색 등의 처리도 인터페이스의 메서드를 호출하는 형태롤 처리가 되는데, 기능에 따라 상속 구조로 추가적인 기능을 제공.
Hibernate를 단독으로 사용할 경우 모든 코드 직접 작성, 트랜젝션 처리도 직접 처리..
Spring Data JPA를 이용할 경우 모든 코드가 자동으로 생성되기 때문에 CRUD 작업, 페이징 작업 개발을 하지 않아도 된다.


CrudRepository : 일반적인 CRUD 작업만 할 경우 사용
PagingAndSortRepository : 일반적인 CRUD 작업 + 페이징, 정렬 작업을 사용할 경우
JpaRepository : JPA 관련 모든 기능을 사용할 경우. (개발자가 가장 많이 사용하는 인터페이스)

 

 

JpaRepository 인터페이스

  • Spring Data JPA는 이를 상속하는 인터페이스 선언만으로 모든 작업에 대한 개발이 끝난다.
  • 실제 동작 시에는 스프링이 내부적으로 해당 인터페이스에 맞는 코드를 자동 생성한다!
  • JpaRepository를 사용할 경우에는 엔티티 타입 정보와 @id 타입 정보를 Map 형태로 지정한다.
  • Spring Data JPA는 인터페이스 선언만으로도 자동으로 스프링 빈(Bean)으로 등록한다!
    • 즉, 스프링이 내부적으로 인터페이스 타입에 맞는 객체를 생성하여 빈(Bean)으로 등록!

 


기능설명 (annotation)


@Entity : Spring Data JPA 사용시 필수
해당 클래스는 엔티티 클래스이고,
해당 클래스의 인스턴스들이 JPA로 관리되는 엔티티 객체라는 것을 의미

옵션에 따라서 자동으로 테이블을 생성할 수도 있다.
이 경우 해당 클래스의 멤버변수 설정에 따라서 자동으로 컬럼까지 생성된다.



@Table : @Entity 어노테이션과 함께 사용 가능
관계형 데이터베이스에서 엔티티 클래스를 어떤 테이블로 생성할 것인지에 대한 정보를 담기 위한 어노테이션.

예) @Table(name = "tbl_memo") 의 경우
테이블 이름이 "tbl_memo"인 테이블을 생성
옵션을 이용하면 인덱스(indexes를 이용) 설정도 가능..



@Id : @Entity 가 붙은 클래스 내에는 반드시 Primary Key(PK)에 해당하는 특정 멤버변수를 @Id로 설정해야 한다.
만약 @Id 가 붙은 멤버변수에 입력되는 값이 사용자 입력이 아니라면
자동으로 생성되는 번호를 사용하기 위해서 @GeneratedValue 어노테이션을 사용한다.

예) @GeneratedValue(stratrgy = GenerationType.IDENTITY)
PK를 자동으로 생성할 때 사용 (이것을 키 생성전략 이라고 부름)



@GeneratedValue(stratrgy = GenerationType.IDENTITY)
만약,
연결되는 데이터베이스가 오라클일 경우 : 별도의 번호 저장을 위한 테이블이 자동 생성
연결되는 데이터베이스가 MySQL, MariaDB일 경우 : auto increment를 이용..


stratrgy 설정 값
GeneratoionType.AUTO : 기본값으로 JPA 구현체(Hinernate)가 생성 방식을 결정
GenerationType.IDENTITY : 사용하는 데이터베이스가 키 생성을 결정
GenerationType.SEQUENCE : 데이터베이스의 시퀀스를 이용하여 키를 생성. @SequenceGenerator 와 같이 사용
GenerationType.TABLE : 키 생성 전용 테이블을 생성하여 키 생성. @TableGenerator 와 함께 하용



@Column : 추가적인 필드(컬럼)가 필요한 경우에 사용
이 어노테이션은 다양한 설정을 위한 옵션을 제공
name ="컬럼명"
nullable = "NULL값 허용여부(true/false)"
length = 크기(20)

columnDefinition 을 이용하여 기본값을 설정할 수도 있다.
예) 
MySQL, MariaDB일 경우 : columnDefinition = "varchar(255) default 'YES'"
오라클일 경우 : columnDefinition = "varchar2(255) default 'YES'"



만약 값을 사용자로부터 입력 받지만, 테이블에 저장을 하지 않을 경우에는
해당 멤버변수 위에 @Transient 를 이용하여 제외 시킬 수 있다. 


그 외에 JPA는 다양한 어노테이션이 있음.


Lombok이 지원하는 주요 어노테이션 

( import lombok.*; )

@ToString : toString 메서드를 재정의
@Getter : private 변수에 대한 getter 메서드 자동 생성
@Setter : private 변수에 대한 setter 메서드 자동 생성

@Builder : 해당 클래스에 대한 객체 생성 처리 (실제 사용시엔 클래스명.builder()를 이용)
단, 어노테이션을 사용할 경우에는 반드시
@AllArgsConstructor / @NoArgsConstructor 를 함께 설정해야 한다.
그렇지 않을 경우 컴파일 시 오류 발생!

 

각종 대표 설정파일 : application.properties

 


데이터베이스(DataSource) 설정

spring.datasource.driver-class-name=접속데이터베이스 드라이버 이름

spring.datasource.url=데이터베이스 접속 주소

  • ( MySQL, MariaDB일 경우 : 데이터베이스 접속주소 / 데이터베이스명 )
  • ( 오라클일 경우 : 데이터베이스 접속 주소 )

spring.datasource.username=사용자(접속)계정
spring.datasource.password=계정 접속 비밀번호


Spring Data JPA를 위한 설정

spring.jpa.hibernate.ddl-auto=프로젝트 실행시 자동으로 DDl을 생성 할 것인지 결정
create : 매번 테이블을 새롭게 생성
update : 변경이 필요할 경우에만 alter 되고, 테이블이 없을 경우에는 create
create-drop : 매번 테이블을 생성하고, 작업 종료 직전 생성된 테이블을 삭제
validate : 테이블에 유효성 검사

spring.jpa.show-sql=true/false
실제 JPA 구현체인 Hibernate가 처리 시에 발생하는 SQL을 보여줄 것인지 여부

spring.jpa.properties.hibernate.format-sql=true/false
실제 JPA 구현체인 Hibernate가 동작하면서 발생하는 SQL을 포맷팅(들여쓰기 등..)하여 출력
실행되는 SQL에 대한 가독성을 높일 경우에 설정


CRUD 및 페이징 작업 

CRUD 작업 지원 메서드 (JpaRepository)
inset 작업 : save(엔티티 객체)
select 작업 : findById(키 타입) / getOne(키 타입) <=getOne은 향후 사라질 예정
update 작업 : save(엔티티 객체)
delete 작업 : deleteById(키 타입) / delete(엔티티 객체)


JPA의 구현체가 메모리상에서 객체를 비교하고 없으면 insert 존재하면 update를 동작

Comments