📕 Chapter - Hello, Spring Data JPA

✏️ JDBC란?

  • JDBC(Java Database Connectivity)는 Java 기반 애플리케이션의 코드 레벨에서 사용하는 데이터를 데이터베이스에 저장 및 업데이트하거나 반대로 데이터베이스에 저장된 데이터를 Java 코드 레벨에서 사용할 수 있도록 해주는 Java에서 제공하는 표준 API이다.
  • JDBC의 구체적인 API 사용법을 알 필요는 없지만 JDBC의 동작 흐름을 알면 Spring에서 지원하는 데이터 액세스 기술을 사용하는데 도움이 된다.
  • 데이터베이스 Connection 객체를 미리 만들어서 보관하고 애플리케이션이 필요할 때 이 Connection을 제공해 주는 역할을 하는 Connection 관리자를 바로 Connection Pool이라고 한다.
  • Spring Boot 2.0부터 HikariCP가 기본 DBCP로 채택되었다.

✏️ [기본] Spring Data JPA란?

JPA 스펙을 구현한 구현체의 API를 조금 더 쉽게 사용할 수 있도록 해주는 모듈

✏️ [기본] Hello Spring Data JPA로 이해하는 Spring Data JPA (1)

  • 데이터 액세스 기술의 유형은 크게 SQL 중심의 기술과 객체(Object) 중심의 기술로 나눌 수 있다.

  • SQL 중심의 기술에는 mybatis, Spring JDBC 등이 있다.

  • 객체(Object) 중심의 기술에는 JPA, Spring Data JDBC 등이 있다.

  • JPA 같은 객체(Object) 중심의 기술을 ORM(Object-Relational Mapping) 기술이라고 한다.

  • 인메모리(In-memory) DB는 애플리케이션이 실행된 상태에서만 데이터를 저장하고 애플리케이션 실행이 중지되면 인메모리 DB 역시 실행이 중지되어 저장된 데이터가 사라진다.

✏️ [기본] Hello Spring Data JPA로 이해하는 Spring Data JPA (2)

📌 Spring Data JPA 적용 순서

  1. build.gradle에 사용할 데이터베이스를 위한 의존 라이브러리를 추가합니다.

  2. application.yml 파일에 사용할 데이터베이스에 대한 설정을 합니다.

  3. 데이터베이스의 테이블과 매핑할 엔티티(Entity) 클래스를 작성합니다.

  4. 작성한 엔티티 클래스를 기반으로 데이터베이스의 작업을 처리할 Repository 인터페이스를 작성합니다.

  5. 작성된 Repository 인터페이스를 서비스 클래스에서 사용할 수 있도록 DI 합니다.

  6. DI 된 Repository의 메서드를 사용해서 서비스 클래스에서 데이터베이스에 CRUD 작업을 수행합니다.

👉 핵심 포인트

  • Spring에서 지원하는 JpaRepository 인터페이스는 CRUD에 대한 기본적인 메서드를 정의하고 있기 때문에 별도의 CRUD 기능을 개발자가 직접 구현할 필요가 없다.

  • application.properties 또는 application.yml 파일의 설정 정보 등록을 통해 데이터베이스 설정, 데이터베이스의 초기화 설정 등의 다양한 설정을 할 수 있다.

  • application.yml 방식은 중복되는 프로퍼티의 입력을 줄여주기 때문에 application.properties 방식보다 더 선호되는 추세이다.

  • 엔티티(Entity) 클래스에 @Entity 애너테이션을 추가하면 같은 이름의 데이터베이스 테이블에 매핑되고, 엔티티 클래스 각각의 멤버 변수는 데이터베이스 테이블의 컬럼(Column)에 매핑된다.

  • 엔티티 클래스의 멤버 변수에 @Id 애너테이션을 추가하면 데이터베이스 테이블의 기본키(Primary key) 열과 매핑된다.

📕 Chapter - JPA(Java Persistence API) 개요

✏️ JPA(Java Persistence API)란?

  • JPA(Java Persistence API)는 Java 진영에서 사용하는 ORM(Object-Relational Mapping) 기술의 표준 사양(또는 명세, Specification)이다.
  • Hibernate ORM은 JPA에서 정의해 둔 인터페이스를 구현한 구현체로써 JPA에서 지원하는 기능 이외에 Hibernate 자체적으로 사용할 수 있는 API 역시 지원하고 있다.
  • JPA에서는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트(Persistence Context)에 보관해서 애플리케이션 내에서 오래 지속되도록 한다.
  • 영속성 컨텍스트 관련 JPA API
    1) em.persist()를 사용해서 엔티티 객체를 영속성 컨텍스트에 저장할 수 있다.
    2) 엔티티 객체의 setter 메서드를 사용해서 영속성 컨텍스트에 저장된 엔티티 객체의 정보를 업데이트할 수 있다.
    3) em.remove()를 사용해서 엔티티 객체를 영속성 컨텍스트에서 제거할 수 있다.
    4) em.flush()를 사용해서 영속성 컨텍스트의 변경 사항을 테이블에 반영할 수 있다.
    5) tx.commit()을 호출하면 내부적으로 em.flush()가 호출된다.

📕 Chapter - JPA 엔티티(Entity) 매핑과 연관 관계 매핑

✏️ [기본] 엔티티 매핑

  • @Entity 애너테이션을 클래스 레벨에 추가하면 JPA의 관리대상 엔티티가 된다.
  • @Table 애너테이션은 엔티티와 매핑할 테이블을 지정한다.
  • @Entity 애너테이션과 @Id 애너테이션은 필수로 추가해야 한다.
  • JPA는 IDENTITY, SEQUENCE, TABLE, AUTO 전략 같은 다양한 기본키 생성 전략을 지원한다.
    1) IDENTITY 전략
    기본키 생성을 데이터베이스에 위임하는 전략이다.
    2) SEQUENCE 전략
    데이터베이스에서 제공하는 시퀀스를 사용해서 기본키를 생성하는 전략이다.
    3) TABLE 전략
    별도의 키 생성 테이블을 사용하는 전략이다.
    4) AUTO 전략
    JPA가 데이터베이스의 Dialect에 따라서 적절한 전략을 자동으로 선택한다.
  • Java의 원시 타입 필드에서 @Column 애너테이션이 없거나 @Column 애너테이션이 있지만 애트리뷰트를 생략한 경우, 최소한 nullable=false는 설정하는 것이 에러를 미연에 방지하는 길이다.
  • java.util.Date, java.util.Calendar 타입으로 매핑하기 위해서는 @Temporal 애너테이션을 추가해야 하지만 LocalDate, LocalDateTime 타입일 경우, @Temporal 애너테이션은 생략 가능하다.
  • @Transient 애너테이션을 필드에 추가하면 JPA가 테이블 열과 매핑하지 않겠다는 의미로 인식한다.
  • 테이블에 이미 저장되어 있는 enum 순서 번호와 enum에 정의되어 있는 순서가 일치하지 않게 되는 문제가 발생하지 않도록 EnumType.STRING을 사용하는 것이 좋다.

✏️ [기본] 엔티티 간의 연관 관계 매핑

  • JPA는 엔티티 간에 단방향과 양방향 매핑을 모두 지원한다.
  • JPA는 엔티티 간에 일대다, 다대일, 다대다, 일대일 연관 관계 매핑을 지원한다.
  • 일대다 관계는 외래키를 가지고 있어야 할 엔티티에 외래키 역할을 하는 객체 참조가 없기 때문에 가급적 사용하지 않는 것이 좋다.
  • 다대일 매핑(@ManyToOne)은 다대일에서 ‘다’에 해당하는 엔티티에서 사용한다.
    1) @JoinColumn 애너테이션은 다대일 매핑(@ManyToOne)에 사용한다.
    2) @JoinColumn 애너테이션의 name 애트리뷰트 값에는 테이블 조인 시 사용되는 외래키가 저장되는 열 이름을 지정한다.
  • 일대다(@OneToMany) 양방향 매핑은 다대일에서 ‘일’에 해당하는 엔티티에서 사용한다.
    1) @OneToMany의 mappedBy 애트리뷰트의 값으로 외래키 역할을 하는 객체의 필드이름을 지정한다.
  • 다대다 연관 관계 매핑은 두 개의 다대일 단방향 매핑을 적용하고, 필요한 경우 양방향 매핑을 적용한다.
  • 일대일 연관 관계 매핑 방식은 @OneToOne 애너테이션을 사용한다는 것 외에 @ManyToOne 단방향 방식, 양방향 방식과 동일하다.

📕 Chapter - Spring Data JPA

✏️ [기본] Spring Data JPA를 통한 데이터 액세스 계층 구현

  • Spring Data JPA는 Spring Data 패밀리 기술 중 하나로써, JPA 기반의 데이터 액세스 기술을 좀 더 쉽게 사용할 수 있게 해 준다.
  • JPA는 엔터프라이즈 Java 애플리케이션에서 관계형 데이터베이스를 사용하기 위해 정해 놓은 표준 스펙(사양 또는 명세, Specification)이다.
  • Hibernate ORM은 JPA라는 표준 스펙을 구현한 구현체이다.
  • Spring Data JPA는 JPA 스펙을 구현한 구현체의 API(일반적으로 Hibernate ORM)를 조금 더 쉽게 사용할 수 있도록 해주는 모듈이다.
  • Spring에서는 애플리케이션이 특정 기술에 강하게 결합되지 않도록 Spring이 추구하는 PSA(일관된 서비스 추상화)를 통해 개발자는 일관된 코드 구현 방식을 유지하도록 하고, 기술의 변경이 필요할 때 최소한의 변경만을 하도록 지원한다.
  • JpaRepository를 상속하면 CrudRepository 기능을 포함한 JPA에 특화된 확장 기능들을 사용할 수 있다.
  • JPQL은 JPA에서 지원하는 객체 지향 쿼리로써 데이터베이스의 테이블을 대상으로 조회 작업을 진행하는 것이 아니라 엔티티 클래스의 객체를 대상으로 객체를 조회한다.
  • JPQL의 문법을 사용해서 객체를 조회하면 JPA가 내부적으로 JPQL을 분석해서 적절한 SQL을 만든 후에 데이터베이스를 조회하고, 조회한 결과를 엔티티 객체로 매핑한 뒤에 반환한다.
profile
인자약velog

0개의 댓글

Powered by GraphCDN, the GraphQL CDN