StudyRepository
article thumbnail
Published 2023. 7. 12. 13:52
JPA Spring
728x90

 

 

 

JPA(Java Persistence API)
  • Java 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스 모음
  • 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
  • 인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현함

 

 

 

왜 JPA를 사용해야 할까?

JPA는 반복적인 CRUD SQL을 처리해준다. JPA는 매핑된 관계를 이용해서 SQL을 생성하고 실행하는데, 개발자는 어떤 SQL이 실행될지 생각만하면 되고, 예측도 쉽게 할 수 있다. 추가적으로 JPA는 네이티브 SQL이란 기능을 제공해주는데 관계 매핑이 어렵거나 성능에 대한 이슈가 우려되는 경우 SQL을 직접 작성하여 사용할 수 있다.

JPA를 사용하여 얻을 수 있는 가장 큰 것은 SQL아닌 객체 중심으로 개발할 수 있다는 것이다. 이에 따라 당연히 생산성이 좋아지고 유지보수도 수월하다. 또한 JPA는 패러다임의 불일치도해결하였다. 예를 들면 JAVA에서는 부모클래스 자식클래스의 관계 즉, 상속관계가 존재하는데 데이터베이스에서는 이러한 객체의 상속관계를 지원하지 않는다(상속 기능을 지원하는 DB도 있지만 객체 상속과는 다름). 이런 상속관계를 JPA는 아래와 같은 방식으로 해결하였다.

 

 

 

@Entity

JPA가 사용하는 객체라는 뜻이다. 이 에노테이션이 있어야 JPA가 인식할 수 있다.

이렇게 @Entity 가 붙은 객체를 JPA에서는 엔티티라 한다.

 

@Id

테이블의 PK와 해당 필드를 매핑한다.

 

 

@GeneratedValue(strategy = GenerationType.IDENTITY)

PK 생성 값을 데이터베이스에서 생성하는 IDENTITY 방식을 사용한다.

) MySQL auto increment

 

 

@Column

객체의 필드를 테이블의 컬럼과 매핑한다.

name = "item_name" : 객체는 itemName 이지만 테이블의 컬럼은 item_name 이므로 이렇게 매핑했다.


length = 10 : JPA의 매핑 정보로 DDL( create table )도 생성할 수 있는데, 그때 컬럼의 길이 값으로 활용된다. ( varchar 10 )


@Column 을 생략할 경우 필드의 이름을 테이블 컬럼 이름으로 사용한다.

 

스프링 부트와 통합해서 사용하면 필드 이름을 테이블 컬럼 명으로 변경할 때 객체 필드의 카멜 케이스를 테이블 컬럼의 언더스코어로 자동으로 변환해준다.

 

itemName item_name , 따라서 위 예제의 @Column(name = "item_name") 를 생략해도 된다.

 

JPApublic 또는 protected 의 기본 생성자가 필수이다. 기본 생성자를 꼭 넣어주자

 

 

 

 

JPA는 수정 메소드를 제공하지 않는다.

하지만 당연히 수정은 필요하기 때문에 JPA는 데이터 수정시, 매핑된 객체(테이블 데이터)를 조회해서 값을 변경 후 커밋하면 DB 서버에 UPDATE 문을  전송하여 UPDATE를 실행한다.

JPA는 일반적인 SQL Mapper를 사용하는 방식보다 디테일한 작업을 못하지 않을까? 라는 생각이 들기도 했지만 아래의 글을 읽고 이젠 그렇지도 않은것 같다는 생각이 들었다.

 

 

 

반복적인 CRUD SQL을 작성하고 객체를 SQL에 매핑하는데 시간을 보내기에는 우리의 시간이 너무아깝다. 이미 많은 자바 개발자들이 오랫동안 비슷한 고민을 해왔고 문제를 해결하려고 많은 노력을 기울여왔다. 그리고 그 노력의 결정체가 바로 JPA다. JPA는 표준 명세만 570페이지에 달하고, JPA를 구현한 하이버네이트는 이미 10년 이상 지속해서 개발되고 있으며, 핵심 모듈의 코드 수가 이미 십만 라인을 넘어섰다. 귀찮은 문제들은 이제 JPA에게 맡기고 더 좋은 객체 모델링과 더 많은 테스트를 작성하는데 우리의 시간을 보내자. 개발자는 SQL Mapper가 아니다.

-출처: 자바 ORM 표준 JPA 프로그래밍 / 저자: 김영한 -

 

 

추가적으로 알아둬야 할 것은, 스프링에서 흔히 사용하는 것으로 알고있는 JPA는, JPA를 이용하는 spring-data-jpa 프레임워크이지 JPA는 아니다.

 

 

 

 

 

 

 

 

728x90

'Spring' 카테고리의 다른 글

Getter, Setter (심화)  (0) 2023.07.24
트랜잭션 AOP 주의 사항 - 프록시 내부 호출  (0) 2023.07.18
[JUnit5] 기본 Annotation  (0) 2023.07.11
JDBC & JPA  (0) 2023.07.10
DAO, DTO, VO  (0) 2023.07.02
profile

StudyRepository

@Minseo26262

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