ORM, JPA, Spring Data Jpa

ORM이란

Obect - Relational Mapping의 약자로 객체와 관계형 데이터베이스의 데이터를 자동으로 연결 해주는 것을 말한다. 객체 지향 프로그래밍은 class를 사용하고 관계형 데이터베이스는 table을 사용하기 때문에 객체 모델과 관계형 모델간의 불일치가 발생한다. ORM은 이러한 불일치를 SQL 자동생성을 통해 해결해주는 통역사 역할을 한다.

대표적인 예로 JPA, Hibernate등이 있다.

장점

  • 객체 지향적인 코드로 인해 비지니스 로직에 더 집중할 수 있게 도와준다.
  • SQL Query가 아닌 직관적인 코드를 통해 데이터를 조작할수 있어 편리하다. 또한 선언문, 할당, 종료같은 부수적인 코드를 작성하지 않아도 된다.
  • 재사용 및 유지보수가 쉽다.
  • 객체간의 관계를 바탕으로 SQL을 자동으로 생성하기 때문에 관계형 데이터베이스의 데이터 구조와 객체지향 모델 사이의 간격을 좁힐 수 있다.

단점

  • ORM만으로 완벽한 서비스를 구현하기 어렵다.
  • 사용하기는 쉽지만 설계를 신중하게 해야한다.
  • 프로젝트의 복잡성이 커질경우 난이도가 올라갈 수 있다.

JPA란

Java Persistence API 로 자바 ORM 기술에 대한 표준 명세를 말한다. 즉 JAVA 진영에서 사용하는 ORM이라고 이해하면 쉽다. 자바 어플리케이션에서 관계형데이터베이스를 사용하는 방식을 정의한 인터페이스이다. 즉 JAVA의 class와 관계형데이터베이싀 DB테이블을 매핑해준다.

JPA 사용예시

@Entity // DB 테이블 역할을 합니다.
public class User {
		// ID가 자동으로 생성 및 증가합니다.
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    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가 없으면 직접 SQL문을 작성해서 사용하면된다. 하지만 SQL문은 단순하고 반복되는 코드가 많은 반면에 실수하기는 쉽기 때문에 작성에 신중을 기해야 한다. 또한 아직도 JPA 없이 웹 서버를 개발한 기업이 많다. 하지만 앞으로의 추세는 JPA 사용빈도가 점점 높아지고 있다.

HIBERNATE란 JPA는 표준 명세일뿐이고, 이를 실제로 구현한 프레임 워크를 말한다. 사실상 표준이다. 스프링 부트에서는 기본적으로 하이버네이트를 사용중이다.

Spring Data JPA란

JPA를 편리하게 사용하기 위해 스프링에서 JPA를 Wrapping 한것을 말한다. 스프링 개발자들이 JPA를 사용할 때 필수적으로 생성해야 하나, 예상 가능하고 반보적인 코드들을 미리 만들어놔 Spring Data JPA가 대신 작성하게 해준다. 사용방법은 Repository 에 JPA 인터페이스만 상속하면 나머지 필요한 구현은 Spring이 알아서 해준다.

상품 Entity 선언

@Entity
public class Product extends Timestamped {
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;
    private Long userId;
    private String title;
    private String image;
    private String link;
    private int lprice;
    private int myprice;
}

Spring Data Jpa 상품 repository 생성

public interface ProductRepository extends JpaRepository<Product, Long> {
}

Product는 클래스, Long은 PK의 타입

Spring Data Jpa가 제공해주는 기본 기능

// 1. 상품 생성
Product product = new Product(...);
productRepository.save(product);

// 2. 상품 전체 조회
List<Product> products = productRepository.findAll();

// 3. 상품 전체 개수 조회
long count = productRepository.count();

// 4. 상품 삭제
productRepository.delete(product);

ID외의 필드에 대한 추가 기능은 interface 만 선언해주면 끝난다.

public interface ProductRepository extends JpaRepository<Product, Long> {
    // (1) 회원 ID 로 등록된 상품들 조회
    List<Product> findAllByUserId(Long userId);

    // (2) 상품명이 title 인 관심상품 1개 조회
		Product findByTitle(String title);

		// (3) 상품명에 word 가 포함된 모든 상품들 조회
		List<Product> findAllByTitleContaining(String word);

		// (4) 최저가가 fromPrice ~ toPrice 인 모든 상품들을 조회
    List<Product> findAllByLpriceBetween(int fromPrice, int toPrice);
}

ORM, JPA, Spring JPA 에 대해 알아봤다. 개념을 헷갈리지 않게 조심해야겠다.

좋은 웹페이지 즐겨찾기