백엔드/Spring Boot

6. 블로그 기획하고 API 만들기 - (2) 블로그 개발을 위한 엔티티 구성하기

두개의 문 2023. 7. 26. 22:26

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