티스토리 뷰

ORM과 JPA

 

ORM : 객체지향 개념을 이용하여 관계형 데이터베이스에 적용(보존)하는 기술..

즉, 객체지향 을 관계형으로 매핑하는 개념..

 

객체지향 구조와 관계형 데이터베이스와 유사

 

객체지향 

데이터구조 => 클래스

데이터 => 멤버변수(데이터타입)

데이터 보관 => 인스턴스

 

관계형 데이터베이스 

데이터구조 => 테이블

데이터 => 컬럼(데이터타입)

데이터 보관 => Row(레코드)

 

객체지향과 관계형데이터베이스의 차이점 : 객체지향 (행위)메서드

객체지향 : 데이터, 행위

관계형데이터베이스 : 데이터

 

결론 : ORM은 객체지향과 관계형 사이의 변환 기법을 의미...

---------------------------------------------------------------------

 

JPA : ORM을 Java 언어에 맞게 사용할 수 있도록 제공되는 스펙

 

ORM이 상위 개념이고, JPA는 Java언어에 국한된 개념

 

JPA는 단순한 스펙이기 때문에 구현체(Hibernate 등)마다 프레임워크가 다를 수 있다...

----------------------------------------------------------------------

 

Spring Data JPA 와 JPA

 

1. 스프링 부트는 JPA 구현체 중 Hibernate를 이용..

 

Hibernate

ORM을 지원하는 오픈소스 프레임워크

단독으로 프로젝트에 적용이 가능한 독립된 프레임워크

 

스프링 부트 프로젝트 생성시 추가한

Spring Data JPA은 Hibernate를 쉽게 사용할 수 있도록 추가적인 API를 제공....

-----------------------------------------------------------------------

 

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

 

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

 

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

 

Repository 인터페이스

Spring Data JPA에서 제공하는 인터페이스로 설계

스프링 내부에서 자동으로 객체를 생성하고, 실행하는 구조이기 때문에..

개발자는 단순히 인터페이스를 하나 정의 하기만 하면 된다...

 

Hibernate를 단독으로 사용할 경우 : 모든 코드 직접 작성, 트랜잭션 처리도 직접 처리..

 

Spring Data JPA를 이용할 경우 : 모든 코드가 자동으로 생성되기 때문에..

CRUD 작업, 페이징 작업 개발을 하지 않아도 된다!!!

 

---------------------------------------------------------------------------

엔티티 클래스 선언

 

src/main/java => com.~~.~~ => 패키지 추가 : entity => 추가 패키지 내부 : Memo.java

com.~~.~~

       entity 

               Memo.java

-------------------------------------------------

@Entity

@Table(name = "tbl_memo")

@ToString

public class Memo {

 

    @Id

    private Long mno;

}

============================

 

@Entity : Spring Data JPA 사용시 필수 

해당 클래스는 엔티티 클래스이고,

해당 클래스의 인스턴스들이 JPA로 괸리되는 엔티티 객체라는 것을 의미..

 

옵션에 따라서 지동으로 테이블을 생성할 수도 있다..

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

 

-----------------------------------------------------------------

@Table : @Entity 어노테이션과 함께 사용 가능

관계형 데이터베이스에서 엔티티 클래스를 어떤 테이블로 생성할 것인지에 대한 정보를 담기위한 어노테이션.

 

예) @Table(name = "tbl_memo") 의 경우

테이블 이름이 "tbl_memo"인 테이블을 생성

옵션을 인용하면 인덱스(indexes을 이용) 설정도 가능..

 

----------------------------------------------------------------

@Id : @Entity 가 붙은 클래스 내에는 반드시 Primary Key(PK)에 해당하는 특정 멤버변수를 @Id로 설정해야 한다.

만약 @Id 가 붙은 멤버변수에 입력되는 값이 사용자 입력이 아니라면

자동으로 생성되는 번호를 사용하기 위해서 @GeneratedValue 어노테이션을 사용한다.

 

예) @GeneratedValue(strategy = GeneratoionType.IDENTITY)

     PK를 자동으로 생성할 때 사용(이것을 키 생성전략이라고 부름)

 

@GeneratedValue(strategy = GeneratoionType.IDENTITY)

만약

연결되는 데이터 베이스가 오라클일 경우 : 별도의 번호 저장을 위한 테이블이 자동 생성

연결되는 데이터 베이스가 MySQL, MairaDB일 경우 : auto increment를 이용...

 

strategy 설정 값

GeneratoionType.AUTO : 기본값으로 JPA 구현체(Hibernate)가 생성 방식을 결정

GeneratoionType.IDENTITY : 사용하는 데이터베이스가 키 생성을 결정

GeneratoionType.SEQUENCE : 데이터베이스의 시퀀스를 이용하여 키를 생성. @SequenceGenerator 와 함께 사용

GeneratoionType.TABLE : 키 생성 전용 테이블을 생성하여 키 생성. @TableGenerator 와 함께 사용

 

----------------------------------------------------------------------------------------

 

@Column : 추가적인 필드(컬럼) 가 필요할 경우에 사용

이 어노테이션은 다양한 설정을 위한 옵션을 제공

name ="컬럼몀"

nullable = "NULL값 허용여부(ture/false)"

length = 크기(20)

 

columnDefinition 을 이용하여 기본값을 설정할 수도 있다..

예) MySQL, MariaDB일 경우 : columnDefinition = "varchar(255) default 'YES'"

    오라클 경우 :  columnDefinition = "varchar2(255) default 'YES'"

 

--------------------------------------------------------------------------------------

 

만약 값을 사용자로부터 입력받지만, 테이블에 저장을 하지 않을 경우에는

해당 멤버변수 위에 @Transient 를 이용하여 제외 시킬 수 있다...

 

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

 

JPA 어노테이션 : import javax.persistence.*;

 

==============================================

 

Lombok이 지원하는 주요 어노테이션 : import lombok.*;

 

@ToString : toString메서드를 재정의 

@Getter : private 변수에 대한 getter 메서드 자동 생성

@Setter : private 변수에 대한 setter 메서드 자동 생성

 

@Builder : 해당 클래스에 대한 객체 생성 처리 (실제 사용시엔 클래스명.builder() 를 이용)

단, 이 어노테이션을 사용할 경우에는 반드시

@AllArgsConstrutor / @NoArgsConstrutor 를 함게 설정해야한다..

그렇지 않을 경우 컴파일 시 오류 발생!!!!!!!!!!!

-------------------------------------------------------------------------------

 

===========================================

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

 

-------------------------------------------------------------------------------

서버 포트번호 변경

 

server.port=새로운 포트번호

새로운 포트번호는 1000 이후 번호를 사용 ( 이하 번호는 운영체제에서 기본으로 사용하는 번호가 다수있슴)

 

-------------------------------------------------------------------------------

데이터베이스(DataSource) 설정

 

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

 

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

MySQL, MaridDB 일 경우 : 데이터베이스 접속 주소/데이터베이스명

오라클일 경우 : 데이터베이스 접속 주소

 

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에 대한 가독성을 높일 경우에 설정....

 

-------------------------------------------------------------------------------

 

Repository 인터페이스

 

Spring Data JPA에는 여러 종류의 인터페이스 기능을 이용하여

JPA 관련 작업을 별도의 코드 개발 없이 처리할 수 있도록 지원한다!!!

 

CRUD 작업, 페이징 처리, 정렬, 검색 등의 처리도 인터페이스의 메서드를 호출하는 형태로 처리가 되는데,

기능에 따라 상속 구조로 추가적인 기능을 제공..

 

CrudRepository : 일반적인 CRUD 작업만 할 경우 사용

 

PagingAndSortRepository : 일반적인 CRUD 작업 + 페이징, 정렬 작업을 사용할 경우...

 

JpaRepository : JPA 관련 모든 기능을 사용할 경우... (개발자가 가장 많이 사용하는 인터페이스)

 

-------------------------------------------------------------------------------

JpaRepository 인터페이스

 

Spring Data JPA는 이를 상속하는 인터페이스 선언만으로 모든 작업에 대한 개발이 끝난다!!!!!

 

실제 동작 시에는 

스프링이 내부적으로 해당 인터페이스에 맞는 코드를 자동 생성한다!!!!!

 

JpaRepository 를 사용할 경우에는 엔티티 타입 정보와 @id 타입 정보를 Map형태로 지정한다..

 

Spring Data JPA는 인터페이스 선언만으로도 

자동으로 스프링 빈(Bean)으로 등록한다!!!!!!!!

즉, 스프링이 내부적으로 인터페이스 타입에 맞는 객체를 생성하여 빈(Bean)으로 등록!!!!!!

 

------------------------------------------------------------------

 

src/main/java => com.~~.~~ => 패키지 추가 : repository =>  내부에 MemoRepository 인터페이스 생성

 

com.~~.~~

       entity 

               Memo (엔티티 클래스)

 

       repository

               MemoRepository (JpaRepository를 상속받은 인터페이스 :  <Memo, Long>

 

=======================================================

 

테스트 코드를 이용하여 CRUD 및 페이징 작업 테스트

 

1. MemoRepository를 이용하여 작성된 테이블에 SQL 없이 CRUD 작업 테스트

 

   CRUD 작업 지원 메서드 (JpaRepository)

 

        insert 작업 : save(엔테테 객체)

        select 작업 : findById(키 타입) / getOne(키 타입) <= getOne()은 현재까지 지원하지만 향후 사라질 예정인 메서드

        update 작업 : save(엔티티 객체)

        delete 작업 : deleteById(키 타입) / delete(엔티티 객체)

 

insert 작업과 update 작업 : save(엔티티 객체)

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

 

src/main/test => com.~~.~~ => 패키지 추가 : repository => 내부 MemoRepositoryTests 클래스 추가  

 

Comments