https://blog.naver.com/drv982/222919833769
- MyBatis과 같이 많이 사용하는 것이 JPA임
- JPA는 JAVA를 사용해서 작업할 때 사용하고,
SQL에 중점적으로 사용할 때 사용할 때는 MyBatis 를 사용함
복잡한 sql은 JPA로 해결못하기 떄문에 MyBatis가 나음
H2데이터베이스
개발 시 DB프로그램이 정해지지 않았을 수도 있음 (MyBatis , oracle) 이럴 경우에 H2데이터베이스를 사용하고 이후에 정해지면 연결하면됨
JPA를 사용하기 전에 데이터를 저장할 데이터베이스를 설치해 보자. 개발시에는 Oracle, MSSQL 등의 굵직한 데이터베이스 보다는 설치도 쉽고 사용도 편리한 H2 데이터베이스를 많이 사용한다.
설정 추가해주기
pom에서 확인 가능
scope가 runtime임
-> 실행중에만 사용 가능
application.properties에서 추가적인 설정이 필요하다
# 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=sa
spring.datasource.password=
사용자-> admin
spring.datasource.url=jdbc:h2:~/test
해당 폴더 안에 test.mv.db파일 생성
connect
DB 연결됨
JPA 환경 설정
메이븐 업데이트
# JPA LOG -> SQL문 실행될 때 로그 출력
spring.jpa.show-sql=true
# JPA -> 자동으로 테이블을 변경한다.
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
MyBatis에서는 mapper를 만들었음
jpa에서는 Entity를 만듬
VO/DTO는 값을 전달하는 클래스이지만
JPA는 클래스 자체가 테이블이 된다.
예제)
질문 테이블
entity
d
package com.mysite.sbb;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Entity
public class Question {
@Id //기본키 설정
@GeneratedValue(strategy = GenerationType.IDENTITY) //자동증가
private Integer id; //기본키, 자동증가(.IDENTITY: AI)
@Column(length = 200) //200자까지 사용가능
private String subject;
@Column(columnDefinition = "TEXT") //문자열을 많이 넣을 수 있음.
private String content;
private LocalDateTime createDate; //생성날짜
}
엔티티로 만들기 위해 Question 클래스에 @Entity 애너테이션을 적용했다. @Entity 애너테이션을 적용해야 JPA가 엔티티로 인식한다. 그리고 Getter, Setter 메서드를 자동으로 생성하기 위해 롬복의 @Getter, @Setter 애너테이션을 적용했다.
컨트롤러에 @Controller 애너테이션을 적용하는 것과 마찬가지로 엔티티는 @Entity 애너테이션을 적용해야 한다.
그리고 엔티티의 속성으로 고유번호(id), 제목(subject), 내용(content), 작성일시(createDate)를 추가했다. 각 속성에는 Id, GeneratedValue, Column과 같은 애너테이션이 적용되어 있는데 그것들에 대해서 하나씩 알아보자.
@Id
고유 번호 id 속성에 적용한 @Id 애너테이션은 id 속성을 기본 키로 지정한다. 기본 키로 지정하면 이제 id 속성의 값은 데이터베이스에 저장할 때 동일한 값으로 저장할 수 없다. 고유 번호를 기본 키로 한 이유는 고유 번호는 엔티티에서 각 데이터를 구분하는 유효한 값으로 중복되면 안 되기 때문이다.
데이터베이스에서는 id와 같은 특징을 가진 속성을 기본 키(primary key)라고 한다.
@GeneratedValue
@GeneratedValue 애너테이션을 적용하면 데이터를 저장할 때 해당 속성에 값을 따로 세팅하지 않아도 1씩 자동으로 증가하여 저장된다. strategy는 고유번호를 생성하는 옵션으로 GenerationType.IDENTITY는 해당 컬럼만의 독립적인 시퀀스를 생성하여 번호를 증가시킬 때 사용한다.
strategy 옵션을 생략할 경우에 @GeneratedValue 애너테이션이 지정된 컬럼들이 모두 동일한 시퀀스로 번호를 생성하기 때문에 일정한 순서의 고유번호를 가질수 없게 된다. 이러한 이유로 보통 GenerationType.IDENTITY를 많이 사용한다.
@Column
엔티티의 속성은 테이블의 컬럼명과 일치하는데 컬럼의 세부 설정을 위해 @Column 애너테이션을 사용한다. length는 컬럼의 길이를 설정할때 사용하고 columnDefinition은 컬럼의 속성을 정의할 때 사용한다. columnDefinition = "TEXT"은 "내용"처럼 글자 수를 제한할 수 없는 경우에 사용한다.
엔티티의 속성은 @Column 애너테이션을 사용하지 않더라도 테이블 컬럼으로 인식한다. 테이블 컬럼으로 인식하고 싶지 않은 경우에만 @Transient 애너테이션을 사용한다.
테이블의 컬럼명
위의 Question 엔티티에서 작성일시에 해당하는 createDate 속성의 실제 테이블의 컬럼명은 create_date가 된다. 즉 createDate처럼 대소문자 형태의 카멜케이스(Camel Case) 이름은 create_date 처럼 모두 소문자로 변경되고 언더바(_)로 단어가 구분되어 실제 테이블 컬럼명이 된다.
|
https://blog.naver.com/drv982/222920242966
답변 테이블도 생성한다
package com.mysite.sbb;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Entity
public class Answer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(columnDefinition = "TEXT")
private String content;
private LocalDateTime createDate;
}
테스트하기
실행
http://localhost:8080/h2-console
connect누르면 생성한 테이블들이 들어가 있는것이 확인 가능하다.
ctrl+ enter하면 결과 나옴
질문 테이블과 답변 테이블의 관계
질문에 해당 답변이 있음
@ManyToOne
answer기준으로 봤을 때
답변 여러 개가 한개의 질문에 해당한다.
그럼 반대로
질문 하나에는 여러개의 답변이 달리니까
Question클래스에는 이렇게 작성된다.
테이블 확인하기
ANSWER을 보면 QUESTION_ID 를 참조한게 확인 가능하다
'BACKEND > SpringBoot' 카테고리의 다른 글
답변 AnswerRepository 생성 및 데이터 저장 ,검색 (0) | 2023.11.08 |
---|---|
Repository , JUnit 테스트 (0) | 2023.11.08 |
스프링부트 프로젝트의 구조, port번호 설정 및 context-path 설정 (0) | 2023.11.07 |
설정 추가 +(lombok) (0) | 2023.11.07 |
STS4 설치 및 설정 -> 테스트 (0) | 2023.11.07 |