03장 정리
1. JPA와 데이터베이스
- 서비스 기업: Spring Boot & JPA 가 전사 표준
- SI 기업: Spring & MyBatis
RDB와 OOP는 패러다임이 불일치하므로, 이 경우 중간에서 패러다임을 일치시켜주는 JPA가 유용합니다.
개발자가 객체지향적 프로그래밍을 하면, JPA는 이를 SQL로 바꾸어 실행해줍니다.
결론적으로 생산성이 향상되고, 유지보수하기 용이해집니다.
Spring Data JPA
JPA는 사실 인터페이스이기 때문에 구현체가 필요합니다. 대표적인 구현체로는 Hibernate가 있는데, 이 구현체를 쉽게 갈아끼우도록 스프링 진영에선 Spring Data 프로젝트의 일환으로 Spring Data JPA라는 모듈을 만들었습니다. 뿐만 아니라 Spring Data 프로젝트는 차후 트래픽 규모가 증가하여 MongoDB와 같은 NoSQL로의 전환이 필요할 시 Spring Data JPA를 Spring Data MongoDB로 변경하는 저장소 교체 용도에도 유용합니다.
HOW???
Spring Data의 하위 프로젝트는 모두 기본 CRUD 인터페이스가 같기 때문입니다. 호환이 잘 되니 갈아끼우기도 쉽습니다.
2. Spring Data JPA 적용하기
디펜던시 추가
build.gradle에 디펜던시를 추가로 등록합니다. 다쓰고 Gradle Sync 하는거 잊지 마세요.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.h2database:h2'
}
spring-boot-starter-data-jpa
- 스프링 부트 버전에 맞추어 자동으로 JPA 라이브러리 버전 관리
h2
- 인메모리 관계형 데이터베이스
- 별도 설치 필요 없이 디펜던시 만으로 관리 가능
- 메모리에서 실행? -> 앱 재시작하면 싹 초기화 -> 테스트 용도로 좋겠군!
패키지 및 클래스 추가
main
> java
> ... 의 하위에 domain 패키지를 생성하고,
domain 패키지 하위에 posts
패키지, 그 안에 Posts
클래스를 생성합니다.
도메인이란?
게시글, 댓글, 회원, 정산, 결제 등 SW 요구사항 또는 문제 영역
- 더 자세히 알아보고 싶으면 DDD Start 라는 서적을 추천
엔티티 생성
Posts 클래스에 다음의 코드를 작성합니다.
package com.hellspring.domain.posts;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Getter
@NoArgsConstructor
@Entity
public class Posts {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 500, nullable = false)
private String title;
@Column(columnDefinition = "TEXT", nullable = false)
private String content;
private String author;
@Builder
public Posts(String title, String content, String author) {
this.title = title;
this.content = content;
this.author = author;
}
}
Posts 클래스는 실제 DB 테이블과 매칭되는 클래스이며, Entity 클래스라고도 합니다.
@Entity
- 테이블과 매칭될 클래스임을 나타냄
@Id
- 해당 테이블의 PK 필드
@GeneratedValue
- PK 생성 규칙
@Column
- 테이블의 컬럼
- 선언 안해도 해당 클래스의 필드는 모두 자동으로 컬럼이 되나, 기본 외 옵션이 필요한 경우 작성
롬복 어노테이션을 위에 따로 놓는 스타일은 후에 코틀린 등으로 전환해서 더이상 롬복이 필요없어질 때 삭제하기 편하다고 합니다.
@NoArgsConstructor
- 기본 생성자 자동 추가
@Getter
- 클래스 내 모든 필드의 Getter 자동 생성
@Builder
- 해당 클래스의 빌더 패턴 클래스 생성
- 생성자 상단에 작성 시 생성자에 포함된 필드만 빌더에 포함됨
필드 값 변경 시엔 그 목적이 코드에 명확히 드러나야 하기 때문에 애매한 Setter는 생성하지 않습니다.