본문 바로가기

좋아하는 것_매직IT/1.spring

18.Spring, 스프링 데이터 JPA(Java Persistence API)에 대해서 알아 볼께요.

반응형

JPA(Java Persistence API) 란 무엇일까요?

  • JPA는 Java Persistence API의 약자로, 자바표준 ORM(Object Relational Mapping) 기술 인터페이스 or 명세서
  • 그럼, ORM 이란?
    • 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말함.
      • 객체 지향 프로그래밍은 클래스 사용 <-> 관계형 데이터베이스는 테이블을 사용
        • 즉, 객체 모델 / 관계형 모델 간 불일치가 존재함,
    • ORM을 통해서 객체간의 관계를 바탕으로 SQL을 자동 생성하여 불일치를 해결함.
  • 여기서 잠깐!
    • 보통 SI 환경에서는 Spring & MyBatis(iBatis)를 많이 사용함.
      • 참고로, 제가 담당하고 있는 네이트온에서도 MyBatis 를 사용하고 있음.
      • 해당 MyBatis 는 ORM이 아니고, 보통 SQL 매퍼(Mapper) 라고 부름
      • 즉, ORM 은 객체를 매핑하는 것이고, SQL Mapper 는 쿼리를 매핑함.
      • 다시말해서 차이점이 있으니, 잘 알고 가야함.
    • MyBatis 를 사용하면, 실제로 개발하는 시간보다 SQL을 직접 다뤄야 하기때문에, SQL 다루는 시간이 더 소요됨.
      • 이 상황에서는, 객체 모델링 보다는 테이블 모델링에만 집중할 수 밖에없음.
      • 그러므로, 요즘에는 추세가 MyBatis 보다는 JPA 로 넘어가는 추세임.
        • 단, SI 나 네이트온같이 오래된 서비스를 제공하는 곳에서는 MyBatis 를 사용하므로, 해당 SQL Mapper 도 공부해 둬야함. 
          • 즉 모두 알고 있어야 MyBatis -> JPA 로 변경하는 업무가 주어진다면 당황하지 않고, 버그없이 잘 마이그레이션 할 수 있기때문에..
      • 잠시 정리하자면,
        • JPA라는 기술은 기존 데이터 모델링에 집중하는 것을 지양하고, 개발자는 오직 객체지향적으로 프로그래밍을하고, JPA가 이를 관계형 데이터베이스에 맞게 SQL를 대신 생성해서 실행해 주는 역할을 한다고 정리하면됨.
          • 장점은, 객체 중심으로 개발을 하게되니, 생산성향상은 물론 유지보수하기가 편해지는 장점이 있음.
  • 그럼, JPA 의 구현체를 알아보면 아래와 같음.

그럼, Spring Data JPA 란 무엇일까요?

  • 위에서 JPA 는 자바표준 ORM(Object Relational Mapping) 기술 인터페이스 or 명세서 라고 했는데,
    • 즉, 개발자라면 아래와 같은 생각을 할 것 이다.
      • 인터페이스? 그럼 구현체가 필요하겠구만!  ^^
  • 다시말해서, 인터페이스이기 때문에 반드시 구현체가 필요함.
    • 대표적으로 Hibernate 가 있는데, Spring 에서는 JPA를 사용할 때, 해당 구현체를 직접 다루지 않음.
  • 정리하자면,
    • Spring Data JPA 는 해당 구현체를 좀 더 쉽게 사용하고자 추상화 시킨 모듈임.
      • 아래와 같이 생각하면 됨.
        •  

    • 참고 URI
      • https://spring.io/projects/spring-data
      • Overview

        • Spring Data JPA, part of the larger Spring Data family, makes it easy to easily implement JPA based repositories. This module deals with enhanced support for JPA based data access layers. It makes it easier to build Spring-powered applications that use data access technologies.

        • Implementing a data access layer of an application has been cumbersome for quite a while. Too much boilerplate code has to be written to execute simple queries as well as perform pagination, and auditing. Spring Data JPA aims to significantly improve the implementation of data access layers by reducing the effort to the amount that’s actually needed. As a developer you write your repository interfaces, including custom finder methods, and Spring will provide the implementation automatically.

      • feature

        • Sophisticated support to build repositories based on Spring and JPA

        • Support for Querydsl predicates and thus type-safe JPA queries

        • Transparent auditing of domain class

        • Pagination support, dynamic query execution, ability to integrate custom data access code

        • Validation of @Query annotated queries at bootstrap time

        • Support for XML based entity mapping

        • JavaConfig based repository configuration by introducing @EnableJpaRepositories.

  • 그럼, Hibernate or Spring Data JPA 를 쓰는 것 사이에는 차이가 있을까?
    • 정답
      • 큰 차이는 없음.
        • but, Spring 진영에서는 Spring Data JPA를 개발했고, 이를 사용하도록 권장하고 있음. 
    • 그럼, 왜 Spring 진영에서는 Spring Data JPA 를 사용하도록 권장할까?
      • 정답
      • 즉, 소위말해서, 한단계 더 감싸놓은 Spring Data JPA 가 등장한 이유는 아래 2가지임.
      • 첫째, 구현체 교체의 용이성
        • 만약, Hibernate 에 대해서 더이상 업데이트가 되지 않거나 또다른 이유로 수명이 다했다고 가정한다면, Hibernate 외에 다른 새로운 구현체로 쉽게 교체하기 위함.
        • 즉, Spring Data JPA 내부에서 구현체 매핑을 지원해 줌
          • 예를 들면,
          • Redis 클라이언트가 기존 Jedis -> Lettuce 로 대세가 넘어갈 때, 
          • 만약, Spring Data Redis를 사용했으면, 아주 쉽게 교체가 가능했을 것.
          • 구글링을 해보니 
          • Jedis Vs Lettuce 의 테스트 결과를 비교해 둔 블로그가 있는데, 
          • 상대적으로 Lettuce 의 성능이 우수했음을 확인할 수 있음.
          • 출처 
      • 둘째, 저장소 교체의 용이성
      • 관계형 데이터베이스 외에 다른 저장소로 쉽게 교체 가능함.
      • 즉, 요즘은 빅데이터 시대, 만약 아래와 같이 교체가 필요하다면 ?
        • AS-IS 
          • 관계형 데이터 베이스
        • TO-BE
          • MongoDB 
        • 정답
          • 개발자는 아래와 같이 의존성만, 교체 하면됨.
            • AS-IS
              • Spring Data JPA
            • TO-BE
              • Spring Data MongoDB
        • 왜냐하면,
        • 다시말해서, Spring Data 의 하위 프로젝트들은 기본적인 CRUD의 인터페이스가 같기 때문에 가능함.
        • 즉, Spring Data JPA / Spring Data Redis / Spring Data MongoDB 등등 Spring Data 의 하위 프로젝트들은 아래의 인터페이스를 가지고 있음
        • 예를들면,
          • save()
          • findAll()
          • findOne()
          • 기타 등등
      • 다시 정리하자면,
      • 위에서 알아본 장점때문에, Spring 진영에서는 Spring Data 프로젝트를 권장하고 있음.

그럼, JPA를 사용하려면 어떻게 해야 할까?

  • JPA를 잘 사용하려면, 객체지향 프로그래밍과 관계형 데이터베이스를 둘 다 잘 이해하고 있어야함.

그럼, JPA를 사용했을때 장점은 무엇이 있을까?

  • 첫째, 직접 CRUD 쿼리를 작성할 필요가 없음.
  • 둘째, 부모-자식 관계표현 / 1:N 관계표현 / 상태와 행위를 한곳에서 관리하는 등 객체지향 프로그래밍을 쉽게 할 수 있음.
  • 셋째, 네이티브 쿼리만큼의 성능을 낼 수 있음.
    • 즉, JPA는 성능상 이슈해결책들을 이미 준비해 놓은 상태이기때문에 가능함.

결론

  • JPA(Java Persistence API)는 자바표준 ORM(Object Relational Mapping) 기술 인터페이스 or 명세서
  • Spring Data JPA 는 JPA구현체를 좀 더 쉽게 사용하고자 추상화 시킨 모듈임.
  • Spring Data JPA를 사용하면, 아래와 같은 장점이 있음.
    • 첫째, 구현체 교체의 용이성
    • 둘째, 저장소 교체의 용이성
  • 오늘도 JPA에 대한 지식 마술(?) 한가지 획득완료! 감사합니다. ^^

  • 오늘의 명언 한마디
    • 기본적으로 우리는 우리가 시장에 제공하는 가치에 대해 돈을 받는다. 이때의 가치는 다음 4가지이다.
      • 상품
      • 서비스
      • 지식
      • 아이디어
    • 이 가운데 당신은 어떤 가치를 통해 돈을 벌고 있는가?
    • 어떻게 자신의 지식을 상품화할 수 있는가?
    • 어떻게 하면 아이디어가 돈이 될까?
    • 당신은 어떤 상품을 팔 수 있는가?
    • 당신 삶에 스며드는 돈은 모두 당신의 수입이 된다는 말을 잘 음미해 보자.
    • 보도 섀퍼지음, "돈" 중에서..

  • 오늘의 영어 한마디
    • The mice used the simple trial-and-error method of finding cheese.
      • 쥐들은 사용했다 / 단순하게 시행착오를 겪는 방법을 / 치즈를 찾을 때
    • 해설
      • 예문에서, trial-and-error 은 시행착오를 의미함.
        • 영영사전에서는
          • a way of achieving an aim or solving a problem by trying a number of different methods and learning from the mistakes that you made" 
          • 라고 설명되어 있음.
            • 정리하자면,
              • 어떤 목적을 달성하거나 문제를 해결하고자 할때, 다양한 방법을 사용하여 실수를 통해 배우는 방법임.

  • 오늘의 민법 한마디(for real estates)
    • 제1편 총칙 / 제 5장 법률행위 / 제3절 대리
      • 제124조(자기계약, 쌍방대리)
        • 대리인은 본인의 허락이 없으면, 본인을 위하여 자기와 법률행위를 하거나 동일한 법률행위에 관하여 당사자쌍방을 대리하지 못한다.그러나 채무의 이행은 할 수 있다.

  • 나의 목표 및 다짐을 항상 내곁에 두기.(계속 29)
    • 목표
      • 나의 강점을 바탕으로 나의 일을 잘해냄으로써 타인과 사회를 아릅답게 만든다.
        • 현재 내가 가진 능력으로 누군가에 도움이 될 수 있을까? 에 대해서 항상 생각하기
    • 목표를 이루기 위한 실천방안
      • 꾸준한 블로깅/기록법/독서법으로 넘버원이 아닌 온리원이 되보자.
      • 천사불여일행(千思不如一行)을 항상생각하며 체화 및 각인시키자.
        • "천번 생각하는것보다 한번 행동하는 것이 더 중요하다."
      • 기기일약 불능십보(騏驥一躍 不能十步) / 노마십가 공재불사(駑馬十駕 功在不舍)
        • 천리마도 한번에 열걸음을 뛸 수 없고, 느리고 둔한말이라도 열흘이면 하룻길을 간다.
300x250