이 글은 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스' 책을 참고하여 작성되었습니다.
JPA는 관계형 데이터베이스를 이용하는 프로젝트에서 객체지향 프로그래밍을 가능케한 java의 표준 ORM 기술이다. 현대의 웹 어플리케이션에서는 관계형 데이터 베이스가 빠질 수 없는데, 오히려 이것이 애플리케이션 코드보다 많아졌다. 그래서 중간에서 패러다임 일치를 위해 등장하여 SQL에 종속된 개발에서 해방 시켜주었다.
Spring Data JPA는 JPA를 구현한 Hibernate를 한번 더 구현한 형태이다. 이를 통해 나중에 Hibernate가 수명을 다 하더라도 쉽게 구현체와 저장소를 의존성 교체를 통해 바꿀 수 있다.
다음 코드를 build.gradle에 입력하여 의존성을 등록한다.
dependencies {
...
implementation('org.springframework.boot:spring-boot-starter-data-jpa')
implementation('com.h2database:h2')
...
}
h2
: 인메모리 관계형 데이터베이스이며 재시작 시마다 초기화되어 테스트용도로 사용된다.먼저 domain 패키지를 생성한다. 도메인은 소프트웨어에 대한 요구사항 혹은 문제 영역이라고 한다. 쿼리를 와 그 결과를 함께 담는다고 한다.
@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;
}
public void update(String title, String content) {
this.title = title;
this.content = content;
}
}
@Entity
: JPA의 annotation이다. 테이블과 링크될 클래스임을 나타낸다.@Id
: 해당 테이블의 PK 필드를 나타낸다.@GeneratedValue
: PK의 생성 규칙을 나타내며 Generation.IDENTITY 옵션을 추가하면 auto_increment가 된다.@Column
: 테이블의 칼럼을 나타낸다. 기본적으로 해당 클래스의 모든 필드는 칼럼이며 기본 값외 추가로 변경이 필요한 옵션이 있으면 사용한다. 문자열의 기본값은 VARCHAR(255)이다.@NoArgsConstructor
: 기본생성자를 자동추가한다.@Getter
: 모든 필드 getter 메서드 자동추가한다.@Builder
: 해당 클래스의 빌더 패턴 클래스를 생성한다. 생성자에 선언시 해당 생성자의 필드만 포함한다.setter 메서드를 만들지 않음
@Builder
로 빌더 클래스 사용
Exmaple.builder()
.a(a)
.b(b)
.build();