JPA

Cloudman·2022년 11월 26일
0

항해99 스프링 공부

목록 보기
8/15

JPA 란?

Java Persistance 의 약자로 Persistance 은 영속성 이라는 의미인데,
자바에 있는 데이터를 영구히 기록할수 있는 환경을 제공하는 API 를 의미한다.
즉, 데이터를 생성한 프로그램의 실행이 종료 되더라도 사라지지 않는 데이터의 특성이다.

시작하기에 앞서 어플리케이션이 데이터베이스를 직접 다룰 때에 문제점이 있는데 이를 정리하면...

1. 번거롭다

만약 아래와 같은 데이터를 다루고 DB 에 저장해서 관리한다면

java
class User {
	private int id;
	private String name;
	private int age;
	private long salary;
	...
}
  • 1) 데이터 베이슬 테이블을 만들어야 한다.
    지난번 강의에서 했듯이 직접 DB 에 접속해 sql 쿼리문을 만들어야 한다.
  • 2) 어플에서 직접 쿼리를 만들고
  • 3) jdbc api 를 통해 직접 실행한다.
  • 4) 쿼리 결과로 해당 객체도 직접 만들어줘야 한다.



2. SQL 의존적이라 변경에 취약

만약 테이블에 변경이 있어 추가하고 새로 받아와야 한다면

class User {
	private int id;
	private String name;
	private int age;
	private long salary;

	// 추가됨!
	private int weight;
  • 1) 쿼리문도 직접 또 수정해 줘야 한다.
  • 2) 받아오는 즉 값 넣어주는 부분에도 추가를 해줘야 한다.



결론

이처럼 유저의 정보가 하나 추가 되었을 뿐인데 해야할 과정이 너무 많다.
이러한 환경을 ORM 이 없는 환경이라고 하는데 이러한 경우에는 백엔드 개발자가 비즈니스 로직 개발보다 SQL 작성에 더 많은 시간을 들여야 했다.

ORM 이란?
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결) 해주는 것을 말한다.

참고 링크 : https://hanamon.kr/orm%EC%9D%B4%EB%9E%80-nodejs-lib-sequelize-%EC%86%8C%EA%B0%9C/




3. 패러다임의 불일치 발생

자바 스프링 서버와 관계형 데이터 베이스 모두 함께 사용하는 상황에 두 모델에서의 패러다임의 불일치가 발생한다.

패러다임 이란?
프로그래밍 스타일을 의미하며 전체적인 프로그래밍 방식을 말한다.
대표적으로 절차적, 객체지향, 함수형이 프로그래밍이 존재한다.

이를 설명하자면, 객체는 속성(field), 기능(method) 을 가진다.
이 안에서 추상화, 상속, 다형성 같은 개념이 있다.

하지만, DB 에서는 추상화, 상속, 다형성 같은 개념들이 없기 때문에 서로가 지향하는 목적이 다르므로 둘의 기능과 표현 방법도 다르다.

이것을 객체와 관계형 DB 의 패러다임 불일치 라고 한다.

참고 링크 : https://velog.io/@nyong_i/JPA-%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84%EC%9D%98-%EB%B6%88%EC%9D%BC%EC%B9%98


위 같은 문제들로 인해서 ORM, JPA 가 등장하게 되었다.

여기서 알아볼 JPA 가 해주는 일

  1. 쿼리를 자동으로 만든다.
  2. 어플리케이션 계층에서 sql 의존성을 줄여서 번거로운 작업의 단축
  3. 패러다임의 불일치를 해결해 준다.(가장 큰 목적)
  4. 그간 최적화 작업을 통해 성능도 괜찮다.
  5. 방언도 지원한다. 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;
}




DB 의 연관관계 이해

연관 관계 고민

  • 고객이 음식 주문 시, 주문 정보는 어느 테이블에 들어가야 할까요?
  • 고객 테이블? 음식 테이블??
  • Tip) 테이블 설계 시 실제 값을 넣어보면 짐작하기 조금 더 쉽습니다.
  • 시도1) "고객 테이블" 에 주문 정보를 넣어 볼까요?




JPA 연관관계

JPA 의 경우는 Enitity 클래스의 필드 위에 연관관계 어노테이션 (@) 을 설정해 주는 것만으로 연관관계가 형성됩니다!


관련 링크 : https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods

profile
코린이

0개의 댓글