Java Persistance
의 약자로Persistance
은 영속성 이라는 의미인데,
자바에 있는 데이터를 영구히 기록할수 있는 환경을 제공하는API
를 의미한다.
즉, 데이터를 생성한 프로그램의 실행이 종료 되더라도 사라지지 않는 데이터의 특성이다.
시작하기에 앞서 어플리케이션이 데이터베이스를 직접 다룰 때에 문제점이 있는데 이를 정리하면...
만약 아래와 같은 데이터를 다루고 DB 에 저장해서 관리한다면
java class User { private int id; private String name; private int age; private long salary; ... }
만약 테이블에 변경이 있어 추가하고 새로 받아와야 한다면
class User { private int id; private String name; private int age; private long salary; // 추가됨! private int weight;
이처럼 유저의 정보가 하나 추가 되었을 뿐인데 해야할 과정이 너무 많다.
이러한 환경을 ORM 이 없는 환경이라고 하는데 이러한 경우에는 백엔드 개발자가 비즈니스 로직 개발보다 SQL 작성에 더 많은 시간을 들여야 했다.
ORM 이란?
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결) 해주는 것을 말한다.참고 링크 : https://hanamon.kr/orm%EC%9D%B4%EB%9E%80-nodejs-lib-sequelize-%EC%86%8C%EA%B0%9C/
자바 스프링 서버와 관계형 데이터 베이스 모두 함께 사용하는 상황에 두 모델에서의 패러다임의 불일치가 발생한다.
패러다임 이란?
프로그래밍 스타일을 의미하며 전체적인 프로그래밍 방식을 말한다.
대표적으로 절차적, 객체지향, 함수형이 프로그래밍이 존재한다.이를 설명하자면, 객체는 속성(field), 기능(method) 을 가진다.
이 안에서 추상화, 상속, 다형성 같은 개념이 있다.하지만, DB 에서는 추상화, 상속, 다형성 같은 개념들이 없기 때문에 서로가 지향하는 목적이 다르므로 둘의 기능과 표현 방법도 다르다.
이것을 객체와 관계형 DB 의 패러다임 불일치 라고 한다.
위 같은 문제들로 인해서 ORM, JPA 가 등장하게 되었다.
여기서 알아볼 JPA 가 해주는 일
h2 Databse
를 붙여도, mySql
, oracle
뭘 붙여도 코드의 변경이 없다.DB
이자 표준을 준수한 SQL
을 지원한다면, JPA
가 방언들도 알아서 처리해줍니다.아래의 코드는 실제 JPA 가 적용된 엔티티 클래스이다.
@Entity // DB 테이블 역할을 합니다.
public class User {
// ID가 자동으로 생성 및 증가합니다.
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
// nullable: null 허용 여부
// unique: 중복 허용 여부 (false 일때 중복 허용)
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false, unique = true)
private String email;
@Column(nullable = false)
@Enumerated(value = EnumType.STRING)
private UserRoleEnum role;
@Column(unique = true)
private Long kakaoId;
}
연관 관계 고민
JPA
의 경우는Enitity
클래스의 필드 위에 연관관계 어노테이션(@)
을 설정해 주는 것만으로 연관관계가 형성됩니다!
관련 링크 : https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods