2. 블로그 개발을 위한 엔티티 구성하기
◉ 가장 먼저 엔티티를 구성하고, 구성한 엔티티를 사용하기 위한 리포지터리를 추가해보자
- 엔티티 : 데이터베이스의 테이블과 매핑되는 객체로, 데이터베이스의 테이블과 직접 연결
1) 프로젝트 준비하기
▪︎ Dynamic Web Project 생성 - 'BlogV1'
- build.gradle 및 application.yml 설정 추가 ( Snippet 이용 )
2) 엔티티 구성하기
◉ 엔티티 구성
- 생성할 엔티티와 매핑되는 테이블 구조 정리
컬럼명 | 자료형 | null 허용 | 키 | 설명 |
id | BIGINT | N | 기본키 | 일련번호, 기본키 |
title | VARCHAR(255) | N | 게시물의 제목 | |
content | VARCHAR(255) | N | 내용 |
◎ domain 패키지 생성 후, Article.java 생성
⇒ src/main/java/domain : Entity
▪︎ Article.java
package org.choongang.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Entity // 엔티티로 지정
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Article {
@Id // id 필드를 기본키로 지정
@GeneratedValue(strategy = GenerationType.IDENTITY) // 기본키 자동으로 1씩 증가
@Column(name = "id", updatable = false)
// id - bigint - pk - not null
private Long id;
@Column(name="title", nullable=false) // 'title'이라는 not null 컬럼과 매핑
// title - varchar2 - not null
private String title;
@Column(name = "content", nullable = false)
// content - varchar2 - not null
private String content;
@Builder // 빌더 패턴으로 객체 생성
// 생성자 위에 @Builder -> Article.java의 생성자에서 빌더 패턴 이용 가능
// 생성자를 호출하는 함수로 결과적으로 생성자가 만든 객체를 반환하는 것과 동일
public Article(String title, String content) {
this.title = title;
this.content = content;
}
}
▪︎ Id
- JPA 엔티티 객체의 식별자로 사용할 필드에 적용
- Long 타입의 id 필드를 테이블의 기본키로 지정
▪︎ @GeneratedValue
- 기본키의 생성 방식을 결정
• AUTO : 선택한 데이터베이스 방언(dialect)에 따라 방식을 자동으로 선택(기본값)
• IDENTITY : 기본 키 생성을 데이터베이스에 위임
→ id값을 null로 하면 DB가 알아서 AUTO_INCREMENT 해줌
• SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당하는 방법 → 오라클에서 주로 사용 ( 아래 내용 참고 )
• TABLE : 키 생성 테이블 사용
▪︎ @Column
- 데이터베이스의 컬럼과 필드를 매핑해주는 역할
- 속성
속성 | 기능 | 기본값 |
name | 필드와 매핑할 컬럼 이름 설정하지 않으면, 필드 이름으로 지정함 * Java - 카멜표기법 권장 / DB - 스네이크표기법 권장 ⇒ name 속성으로 매핑 |
객체의 필드 이름 |
nullable | DDL 생성 시 null 값의 허용 여부를 설정함 false로 설정하면 Not null 제약조건이 붙음 |
true |
updatable | 엔티티 수정 시 이 필드도 같이 수정함 false로 설정하면 데이터베이스에 수정하지 않음 false 옵션은 읽기 전용일 때 사용함 |
true |
unique | 컬럼의 유일한 값 여부 설정하지 않으면 false |
false |
columnDefinition | 컬럼 정보 설정 default값을 줄 수 있음 |
자바 필드의 타입과 데이터베이스 방언 설정 정보를 사용해 적절히 생성 |
▪︎ 롬복에서 제공하는 애너테이션
• @Getter
- 클래스 내 모든 필드의 Getter 메서드 자동 생성
• @NoArgsConstructor
- 기본 생성자 자동 생성
- access = AccessLevel.PROTECTED : 접근제어자를 'protected'로 지정
• @Builder
- 생성자 위에 '@Builder' 입력 시, 빌더 패턴 방식으로 객체 생성 가능
- 빌더 패턴 사용 시, 객체를 유연하고 직관적으로 생성 가능 → 개발자들이 많이 사용하는 디자인 패턴 중 하나
• 빌더 패턴 사용하지 않았을 때
new Article("abc", "def");
• 빌더 패턴 사용했을 때
Article.builder()
.title("abc")
.content("def")
.build();
⇒ 빌더 패턴 사용 시, 어느 필드에 어떤 값이 들어가는지 명시적으로 파악 가능 / 가독성 향상
★ 오라클의 경우 기본키 생성방식이 다름 ★
@Id
// * Sequence 객체 생성
@SequenceGenerator(
name = "ARTICLE_SEQUENCE_GEN",
sequenceName = "article_seq",
initialValue = 1,
allocationSize = 1 )
// 오라클 DBMS에 'article_seq'라는 이름의 시퀀스 객체 생성
// → 초기값은 1이고, 1씩 증가시킨다는 의미
// 이 때, name으로 지정된 'ARTICLE_SEQUENCE_GEN'의 경우,
// @GeneratedValue에서 일련번호를 생성하는 객체를 가르키는 별명으로 사용됨
// * 오라클의 경우, GenerationType.SEQUENCE를 택함
@GeneratedValue(
strategy=GenerationType.SEQUENCE,
generator = "ARTICLE_SEQUENCE_GEN")
◎ 오라클의 경우, 자동 증가 방식이 Sequence 객체를 사용하여 관리함
- @GeneratedValue( strategy = GenerationType.SEQUENCE
⇒ Sequence 객체를 생성하려면, @SequenceGenerator 필요
- @SequenceGenerator의 속성
속성 | 설명 | 기본값 |
name | 식별자 생성기 이름 | 필수 |
sequenceName | 데이터베이스에 등록되어 있는 시퀀스 이름 | hibernate_sequence |
initialValue | DDL 생성 시에만 사용됨. 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정함. | 1 |
allocationSize | 시퀀스 한 번 호출에 증가하는 수 ( 성능 최적화에 사용됨. 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면, 이 값을 반드시 1로 설정해야 함 ) |
50 |
catalog, schema | 데이터베이스 catalog, schema 이름 |
3) 리포지터리 만들기
◎ repository 패키지 생성 후, BlogRepository.java 생성
- 리포지터리 : 엔티티에 있는 데이터들을 조회하거나 저장, 변경, 삭제를 할 때 사용하는 인터페이스
스프링 데이터 JPA에서 제공하는 인터페이스인 JpaRepository 클래스를 상속받아 간단하게 구현 가능
- 단순히 BlogRepository 인터페이스 생성 후, JpaRepository< Entity 클래스, PK 타입 > 를 상속하면 기본적인 CRUD 메서드가 자동 생성됨
→ 이 레포지토리 사용 시, JpaRepository에서 제공하는 여러 메서드 사용 가능
package org.choongang.repository;
import org.choongang.domain.Article;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface BlogRepository extends JpaRepository<Article, Long> {
}
[ 5장 내용 참고 ] https://daheelee.tistory.com/92
'백엔드 > Spring Boot' 카테고리의 다른 글
6. 블로그 기획하고 API 만들기 (3) - 블로그 글 작성을 위한 API 구현❷ (0) | 2023.07.27 |
---|---|
6. 블로그 기획하고 API 만들기 (3) - 블로그 글 작성을 위한 API 구현❶ (0) | 2023.07.26 |
JSP에 CSS 및 Javascript 연결 (0) | 2023.07.25 |
6. 블로그 기획하고 API 만들기 (1) - API와 REST API (0) | 2023.07.24 |
5. 데이터베이스 조작이 편해지는 ORM (2) - JPA와 하이버네이트, 스프링 데이터와 스프링 데이터 JPA (0) | 2023.07.18 |