Notice
Recent Posts
Recent Comments
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
10-10 22:21
Archives
Today
Total
관리 메뉴

Developer_Neo

[Spring 입문] - JPA 본문

Spring

[Spring 입문] - JPA

_Neo_ 2022. 8. 5. 21:54
반응형

JPA란?

Java Persistence API로
자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음

 반복적인 CRUD SQL을 처리해준다
SQL과 데이터 중심의 설계에서 객체 중심의 설계로 페러다임을 전환을 할 수 있다.
JPA는 인터페이스만 제공되는 것이고 이것의 구현체로 Hibernate를 쓴다.

객체를 자바에서의 List인 메모리에 넣는 것처럼 JPA에 집어 넣으면, JPA가 중간에서 데이터베이스로 SQL날리고, 데이터베이스에서 데이터 가져오는걸 다 해준다.

장점

  • SQL문이 아닌 Method를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있음.
    (내부적으로는 쿼리를 생성하여 DB를 조작함. 하지만 개발자가 이를 신경 쓰지 않아도됨)
  • 매핑하는 정보가 Class로 명시 되어  ERD를 보는 의존도를 낮출 수 있고 유지보수 및 리팩토링에 유리
  • 기존 방식에서 MySQL 에서 PostgreSQL로 변환한다고 하면, 새로 쿼리를 짜야하는 경우가 생김. 이런 경우에 ORM을 사용한다면 쿼리를 수정할 필요가 없음

단점

  • 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제 생김
  • 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야할 수도 있음

 

 

ORM(Object-Relational Mapping)

애플리케이션 Class와 RDB(Relational DataBase)의 테이블을 매핑(연결)한다는 뜻이며, 기술적으로는 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것

 

 

build.gradle에 있어야하는 코드

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

 

 

application.properties 파일에 추가할 코드

# jpa가 던지는 sql을 볼 수 있다
spring.jpa.show-sql=true

# jpa가 코드로 작성된 객체를 보고 테이블을 다 만든다. 하지만 우리는 테이블이 다 만들어져있기 때문에 none으로 한다.
spring.jpa.hibernate.ddl-auto=none

초기설정은 이걸로 끝이다.

 

이후 jpa가 인식할 수 있도록 Entity로써 mapping해주어야한다. -> @Entity 사용

1. 데이터베이스의 객체로써 사용할 클래스상단에 @Entity 어노테이션을 이용해 적어준다.

2. PK를 Mapping시켜준다. -> @Id

   2-1. 만약 PK가 자동으로 생성되는 Auto_Increment로써 설정이 되어 있다면, DB가 PK를 자동으로 생성하는 것이다. 

          이런 것을 IDENTITY라고 하며, @GeneratedValue와 함께 안의 인자로 strategy = GenerationType.IDENTITY 를

          추가해야한다.

3. PK말고, 데이터베이스안의 해당 테이블의 열들을 이름과 코드에 작성한 이름이 다르면, 해당 열들을 등록하면 된다.

    @Column 어노테이션을 이용해서 테이블에 등록되어 있는 이름을 적어주면 된다.

     ex) 스키마 -> member(id,username)인 경우 

@Column(name="username")
private String name;

          

실제 나의 데이터베이스에 작성된 member 테이블은 열로 id와 name을 가진다.

결과

 

JPA기반 memeber 리포지토리 클래스를 구현해보자

 

1. EntityManager 주입!

EntityManager?

JPA는 EntityManager라는 것으로 모든 것이 동작이 된다.
build.gradle에 jpa에 해당하는 것을 implementaion했다면, 스프링 부트가 알아서 EntityManager를 스프링 빈으로 생성해 스프링 컨테이너에 가지고 있다.

이것이 데이터베이스와 연결해 위의 객체의 틀로써 다 만들어준다. 그리고 만들어진 것을 injection만 해주면 된다.

2. 각 코드 작성

save 코드

위처럼 매우 간단하다. JDBCTEMPLATE을 이용해서 한 과정을 JPA는 단 두줄만에 해결해준다.

 

나머지 코드들

 

 

반응형
Comments