월루를 꿈꾸는 대학생

[Spring Boot] 데이터 베이스 세팅 JPA 본문

Programing/Spring Boot

[Spring Boot] 데이터 베이스 세팅 JPA

하즈시 2022. 12. 15. 19:35
728x90

서버에서 데이터 처리할 때 sql문 사용을 하는데 

이걸 코드 안에서 쿼리문 봐아악 작성하면 머 긴 경우는 한 페이지 정도로 길어진다고 함 ... 

그런 코드는 보기도 싫을 뿐더로 봐도 이해하기 힘들다 

 

ORM을 사용하면 자바 코드 만으로도 CRUD가 가능하다고 함 

즉 sql 문법 필요없이 코드로 DB를 관리할 수가 있음 ! 

 

엔티티 

- 데이터 관리용 ORM클래스 

 

JPA

- 자바 쪽에서 사용하는 ORM 기술 표준


H2

- 간편하게 사용할 경량 DB

 

그래들에 파일 추가 

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-web'
   compileOnly 'org.projectlombok:lombok'
   developmentOnly 'org.springframework.boot:spring-boot-devtools'
   annotationProcessor 'org.projectlombok:lombok'
   runtimeOnly 'com.h2database:h2'
   testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

/resource/application.properties 

- db 사용하기 위한 설정 파일 

 

# DATABASE
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:~/local
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=user
spring.datasource.password=

 

홈디렉토리에다가 local.mv.db 파일 만들기 

 

 

 


h2-console 경로에 들어간 후 로그인 하기 
경로는 test를 local 로 바꿔야함 

 

gradle 파일에 jpa 위한 라이브러리 추가 

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

 

마찬가지로 applpication.properties 에 코드 추가

# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update

엔티티 

- 테이블과 매핑되는 자바클래스 ! 

- 보통 엔티티 생성할 때는 setter를 안씀 -> 데이터 변경이 용이할수록 안전 x 

- 생성할 때는 lombok의 @builder 데이터변경에는 엔티티에 메서드 추가해서 쓴다고 함 

 

package com.example.sbb;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.List;

@Getter
@Setter
// Controller 처럼 Entity 적용시켜야 이게 엔티티인지 앎
@Entity
public class Question {
    //기본키 지정
    @Id
    //따로 저장 안해도 디비가 자동으로 세팅해줌
    // strategy = 고유 번호 생성
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    //엔티티 속성 = 컬럼명
    // @Column 없어도 인식은 함 다만 세부설정하기 위함
    @Column(length = 200)
    private String subject;

    // 글자수 제한 없는 경우
    @Column(columnDefinition = "TEXT")
    private String content;

    private LocalDateTime createDate;
    // 실제 디비에선 카멜케이스가 아니라 스네이크 형식으로 컬럼들이 만들어짐

    //질문과 답변은 1:n
    //question 하나에 answer 여러개니까 List구성
    //질문 삭제시 답변도 다 같이 삭제 cascade remove 
    @OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
    private List<Answer> answerList;

}

 

package com.example.sbb;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.time.LocalDateTime;

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

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

    private LocalDateTime createDate;

    // 질문 엔티티와 연결된 속성이라는 걸 표시해야함
    // 하나의 질문에 답변 여러개 달림 - 외래키 형성됨
    @ManyToOne
    private Question question;
}

 

생성확인 

 

 

 

출처

https://wikidocs.net/161165

 

728x90