Spring Boot - H2 데이터베이스 - JPA 엔티티 설정, 리파지토리 설정 (2/3)

반응형

 

  • 이전 포스팅 확인하기

https://luvris2.tistory.com/358

 

Spring Boot - H2 데이터베이스 - 설치, 프로젝트 설정, 로컬 서버 생성 (1/3)

# 해당 포스팅은 Gradle Projec로 진행되었습니다. H2 데이터베이스(Database)란? 개발용이나 소규모 프로젝트에서 사용하는 경량화 된 데이터베이스 개발에 초점을 두었기 때문에 개발이 완료되면 MySQ

luvris2.tistory.com


JPA 엔티티 설정 (Entity)

Entity란?

  • 사전적 의미로는 개체, 실체의 의미
  • 데이터베이스 논리적 구성요소
  • 유형, 무형의 개체로 현실세계에서 사람이 생각하는 개념이나 정보의 단위
  • JPA의 엔티티는 쉽게 말해 테이블, 컬럼과 같은 의미
  • 엔티티의 테이블은 엔티티로 선언한 클래스의 이름을 대문자로 구분하여 언더바로 나눔
    • 예시) DataBase(Class) > DATA_BASE(Table)

컬럼 생성 및 설정

공지사항 테이블

  •  H2dbNotice.java
    • @Getter/@Setter : Lombok 라이브러리의 getter, setter를 자동으로 해주는 애너테이션
    • @Entity : JPA 라이브러리, DB와 매핑되는 자바 클래스 지정 애너테이션
      • 해당 클래스를 JPA의 엔티티로 인식하고, Lombok을 통해 자동으로 DB에 컬럼 생성
      • 즉, 자바 코드로 데이터베이스를 제어 할 수 있음을 의미
import java.time.LocalDateTime;
import java.util.List;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
public class H2dbNotice {
    // Id : 컬럼을 기본 키(PK)로 지정하는 역할
    @Id
    // GeneratedValue : Auto Increment, 자동으로 1씩 증가
    // strategy : 고유 번호를 생성하는 옵션
    // GenerationType.IDENTITY : 독립적인 시퀀스를 생성, 기본 키 생성을 위한 설정
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    // @Column
    // 컬럼의 세부 설정을 정의 할 때 사용
    // length : 컬럼의 길이를 설정
    // columnDefinition = "TEXT" : 글자 수를 제한 할 수 없는 경우에 사용
    @Column(length = 200)
    private String subject;
    
    @Column(columnDefinition = "TEXT")
    private String content;
    
    private LocalDateTime createDate;
    
    // 1:N 설정
    // mappedBy : Many에 참조될 id 설정, ManyToOne을 사용하는 객체의 이름을 지정
    // CascadeType.REMOVE : 데이터가 삭제되면 관련된 참조하는 데이터도 함께 삭제
     @OneToMany(mappedBy = "h2dbNotice", cascade = CascadeType.REMOVE)
    private List<H2dbReply> replyList;

댓글 테이블

  •  H2dbReply.java
    • ManyToOne에는 반드시 OneToMany(참조되는 FK ID)에서 지정한 mappedBy의 값으로 지정
      • 지정하지 않을 경우 에러 출력
import java.time.LocalDateTime;

import org.springframework.data.annotation.CreatedDate;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter            
@Entity
public class H2dbReply {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(columnDefinition = "TEXT")
    private String content;
    
    @CreatedDate
    private LocalDateTime createDate;

    // 외래 키(FK) 설정, N:1 관계로 해당 데이터들에 참조되는 데이터는 한개임을 의미
    // OneToMany의 설정된 mappedBy의 id 입력
    @ManyToOne
    private H2dbNotice h2dbNotice;
}

+ 자동 Import가 되지 않을 경우 해결 방법 

  • 애너테이션(@) 코드에 마우스를 올려두면 뜨는 창에서 'Fix project setup' 클릭
  • 예시 이미지는 이미 추가한 상태이기 때문에 자동 임포트가 되는 이미지입니다 :)

 

  • 필요한 라이브러리 파일을 선택 후 OK
    • 해당 포스팅에서는 lombok이 필요

 

  • 라이브러리가 추가 확인


DB 데이터 확인

  • 프로젝트 우클릭 - Run As - Spring Boot App

 

  • 테이블과 컬럼 생성 확인
    • localhost:8080/h2 (application.properties에서 설정한 url)
  • 아직 테이블과 컬럼만 생성했을 뿐, 데이터는 존재하지 않음


리파지토리 설정

리파지토리란? (Repository)

  • 엔티티에 의해 생성된 데이터베이스 테이블에 접근하는 메서드들을 사용하기 위한 인터페이스
  • 데이터 처리를 위해 테이블에 어떤 값을 넣거나 조회하는 등(CRUD)의 처리를 정의하는 계층

리파지토리 인터페이스 설정

  • 리파지토리는 기본적으로 해당 엔티티(테이블)에 대해 다음의 두가지를 기본 제공
    • findAll : 모든 데이터 조회 (=select * from Entity)
    • findById : 해당 Id(Identity, Index)의 데이터 조회 (=select * from Entity where id='n')
    • 그 외의 정보를 조회하기 위해서는 findBy 뒤에 컬럼을 입력하여 메소드를 정의
      • 컬럼 조회 정의 : 엔티티 findBy+컬럼 (데이터타입 값)
        • 데이터타입은 해당 컬럼의 속성을 따라감
          • 문자열을 조회하려면 문자열이 필요하기 때문
        • 예시) 'a' 엔티티의 'b'컬럼 값 조회
          • a findByB(String strValue);
  • 인터페이스 파일 생성
    (아래의 파일 이름은 포스팅에서 진행 할 파일의 이름입니다.)
    • H2dbNoticeRepository.java
    • H2dbReplyRepository.java
  • JpaRepository 상속
    • 컬럼의 정보가 존재하는 자바 클래스(엔티티, Entity) 연결 (H2dbNotice.java, H2dbReply.java)
    • 해당 엔티티 기본 키의 데이터 타입과 함께 지정
// H2dbNoticeRepository.java
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.demo.H2dbNotice;

public interface H2dbNoticeRepository extends JpaRepository<H2dbNotice, Integer> {
    // findAll과 findById 메소드 외에 다른 컬럼의 데이터를 접근하려면 새로 메소드를 정의해야 함
    // findBy + 엔티티 속성명(컬럼) 메소드 : 해당 속성의 값으로 데이터 조회 
    // findBy + 엔티티 속성명(컬럼) Like : 특정 문자열로 해당 속성의 데이터 조회
    H2dbNotice findBySubject(String subject);
    H2dbNotice findByContent(String content);
    List<H2dbNotice> findBySubjectLike(String subject);
}
// H2dbReplyRepository.java
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.demo.H2dbReply;

public interface H2dbReplyRepository extends JpaRepository <H2dbReply, Integer>{
   H2dbReply findByContent(String content);
}

현재까지의 프로젝트 디렉토리 구조

 

리파지토리의 사용은 다음 포스팅에서 다룹니다.

https://luvris2.tistory.com/396

 

Spring Boot - H2 데이터베이스 - CRUD 코드 작성, 테스트 (3/3)

해당 포스팅은 'JUnit Test'를 이용하여 DB CRUD 테스트를 진행합니다. 테스트 설정 테스트 파일 생성 테스트를 위해서는 테스트 파일이 필요 테스트 파일은 'src/test/java' 경로에서 생성 'src/main/java'의

luvris2.tistory.com


참고

  • 위키독스 - 점프 투 스프링부트 - JPA, 엔티티

https://wikidocs.net/161164

 

2-03 JPA

* `[완성 소스]` : [https://github.com/pahkey/sbb3/tree/2-03](https://github.com/pahkey/sbb3/tree/2-03) …

wikidocs.net

 

  • 네이버 지식백과 - Entity

https://terms.naver.com/entry.naver?docId=3476073&cid=58439&categoryId=58439 

 

Entity

① [데이터베이스] 데이터베이스 논리적 구성요소로서, 데이터베이스에 표현하려는 유형, 무형의 개체로 현실세계에서 사람이 생각하는 개념이나 정보의 단위이다.즉, 데이터베이스에 표현하

terms.naver.com

 

반응형