JPA, ORM 기초 개념 정리

고영일·2021년 12월 31일
0

ORM

목록 보기
1/2

JPA 개념 잡기 (구름에듀 데어 프로그래밍 님 강의 영상 복습 공부)


사전 지식 (알듯말듯 아리까리 해서 강의내용에 나오길래 옳다구나 하고 적었다.)

API

  • Application Programming Interfafce
    • 프로그램을 만들기 위한 인터페이스
    • 만약, A, B, C 세 사람이 있는데, 셋의 서열이 A > B = C 순이라고 치자. 이때, A가
      "나한테 연락할 때는 전화하지 말고 직접 찾아와 ㅇㅅㅇ" 하는 엄포를 내려버렸다. 힘이 없는 B, C는 어쩔 수 없이 A 와 놀려면 직접 찾아가야만 하는 약속 이 생겼다. 이런게 바로 Interface 이다.

Interface 와 Protocol 의 차이

  • 둘다 기본적으로 하나의 "규약" 이라는 의미자체는 동등하나, 둘간의 차이가 조금 있다.
    • 인터페이스는 프로그램간의 상하관계가 존재하는 약속으로 볼 수 있다.(위의 A, B, C의 관계에서 A가 독단적인 절대 규칙을 잡아버린 것처럼)
    • 프로토콜은 A, B, C 상호간의 상하관계가 없이 동등한 관계로 누군가 "싫어 임마"라는 의사를 전달 할 수 있다. 대신 "약속" 이라는 것을 잡기 위해 셋이 합의하에 "카톡을 쓰자!", "이메일을 쓰자!" 와 같은 약속을 정하고 사용한다.

JPA

  • Java Persistence API 의 준말
    • Persistence(영속성)의 사전적 정의는 "데이터를 생성한 프로그램의 실행이 종료되어도 데이터의 특성이 사라지지 않음"을 의미한다.
  • RAM의 휘발성 데이터를 하드디스크에 기록하게 되면 영구적으로 데이터가 저장되는 것과 같이, 영속성이란, 어떤 하나의 데이터가 영구히 기록될 수 있도록 하는 것이다.
    • 즉, JPA는 자바에 있는 데이터를 영구히 기록할 수 있는 환경을 제공하는 API이다.
  • JPA는 ORM 기술이다. ORM에 대해 아래 후술 했으니 저걸 먼저 읽고 여기부터 다시 읽어보도록 한다.
  • 반복적인 CRUD 작업을 생략하게 해준다.
    • 지난 대학 교육과정에서 나는 JdbcTemplate, 또는 직접 getConnection() ~~ PrepareStatement와 같은 눈물의 똥꼬쇼를 하며 DAO를 만들고, 내부에 직접 SQL문을 빡세게 작성하고 하는 방식을 배워왔다. JPA는 이러한 똥꼬쇼를 어느정도 생략시켜줬다. 지난 김영한님 스프링부트 입문 강좌에서도 절실히 느꼈다.
    • JPA는 기존에 우리가 커넥션을 얻고, 전송 쿼리에 대한 응답이 있을 때 데이터를 받고 얘를 자바 Bean 객체로 만들고, 커넥션을 끊고 하는 등의 똥꼬쇼를 메소드 하나로 제공해준다.
    • 기본적인 CRUD 함수들은 거의 다 구현되어있어 식별자의 타입만 우리가 얘한테 알려주면 JPA형님께서 으랏차차 하고 알아서 만들어주시는 만렙 행님이다.
  • 영속성 컨텍스트를 가지고 있다.
    • DB와 자바 사이에 위치한다. 자바가 DB에 데이터를 저장할 때 먼저 자바는 영속성 컨텍스트에 저장하고자 하는 데이터를 전달한다. 영속성 컨텍스트가 DB에 해당 데이터를 저장시키는 구조인데, 쉽게 보면 마치 메시지 컨버터와 같이 중간다리역할을 하는 친구라고 볼 수 있다.
    • 이러한 역할을 하는게 바로 JPA의 EntityManager인데, 얘를 통해 영속성 컨텍스트에 데이터를 CRUD 할 수 있는 것이다.
  • DB와 객체지향 프로그래밍적 관점에서 불일치성을 해결하기 위한 방법론을 제공한다.
    • 기본적으로 DB에는 객체 자체를 저장할 수 없다.
    • 내가 이전에 만들던 학생 관리 페이지에서 가장 문제가 되었던 게 테이블 정규화로 인해 학생이라는 개체를 만들 때 학생의 학과코드만 보고 학과명을 바로 가져오기가 매우 난해해 이리저리 여러 컨트롤러를 거치며
      학과(학과코드, 학과명), 학생(학과코드, 학생코드, 이름)
      등의 데이터를 짬뽕시킨 자바 빈 클래스를 어거지로 만들어 겨우겨우 이를 구현하다가 때려친 적이 있는데, JPA의 ORM을 사용하면 이러한 똥꼬쇼 없이 객체지향적으로 모델링을 할 수가 있다.
      • 위의 예시로 보면 학생 테이블 내에 학과라는 오브젝트를 하나 넣어주고, 이를 ORM이 알아서 데이터베이스와 객체를 매핑시켜 내가 원하는 학생 데이터(학과명, 학생코드, 이름) 을 만들어낼 수 있는 것이다.
  • JPA는 inheritance, composition(결합), 연관관계와 같이 객체 지향적 관점에서 모델링을 할 수 있도록 한다.
    • 만약, 자동차라는 DB를 만들고 이를 자바에서, 스프링에서 써먹는다면,
      Car(S/N, carName, color, engineId),
      Engine(engineId, engineName, cc)

      처럼 DB를 먼저 만들고, 이를 스프링에서 가져올 때 join하고, 저 두개를 join한걸 담을 또다른 빈 객체를 만드는 등의 눈물의 똥꼬쇼를 하겠지만, JPA에서는 자바객체를 토대로 DB를 자동으로 만들어주는 것이기 때문에 위와 같은 동일 상황에서 아래와 같이

      car 클래스

      int serialNumberString nameString colorEngine engine
      식별자 변수객체를 속성으로 넣을 수 있게 됨.

      engine 클래스

      int engineIdString nameString engineColor
      식별자 변수
    • 위와 같은 클래스를 각각 먼저 만들고, 이를 토대로 JPA가 Car, Engine 테이블을 각각 만들어주어 EntityManager를 통해 CRUD 기능의 구현을 알아서 해준다. 즉, 객체지향적 관점에서 JPA가 알아서 테이블을 짜고, 조물조물 해준다고 볼 수 있다.
  • 방언 처리가 용이해 DB 이전, 유지보수에 용이하다.
    • JPA는 MySQL, MS-SQL, OracleSQL등 별의 별 DB를 다 지원하기때문에 추상화 객체로 DB클래스를 두고, 나중에 DB교체시 얘 연결만 바꿔주면 바로 DB교체가 된다.
  • 쉬운듯 어렵다.
    • 이 강의 말고도 김영한님 강의에서도 뭔가 깊게 가려면 JPA 자체가 공부해야 될 부분이 되게 많았다.

ORM (Object Relational Mapping)

  • 객체와 관계형 DB와 연결하는 방법론과 같은 역할.
    • 만약 건물을 짓는다면, 2D 설계도를 토대로 3D의 건물을 모델링하게 된다.
      이와 마찬가지로 생각 해본다면 우리가 DB 테이블 내 속성, 데이터 타입들을 토대로 Java Bean으로 만들텐데, ORM은 반대로 자바 빈을 토대로 지가 알아서 테이블을 만들고, 데이터를 넣고 빼고 하게 하는 기초적인 기술의 토대가 된다. 이러한 기능을 구현할 때는 JPA가 가진 인터페이스를 상속함으로써 실질적으로 코드를 작성해 진행하게 된다. (JpaRepository<bean 클래스, 식별자 타입> 처럼)
profile
4년차 잡부 개발자의 대환장 코딩 다큐멘터리

0개의 댓글