https://blog.naver.com/drv982/222919833769
JPA
์ฐ๋ฆฌ๊ฐ ๋ง๋ค SBB๋ ์ง๋ฌธ ๋ต๋ณ ๊ฒ์ํ์ด๋ค. ์ง๋ฌธ์ด๋ ๋ต๋ณ์ ์์ฑํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ฐ์ด...
blog.naver.com
- 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
์ํฐํฐ : DB ํ ์ด๋ธ์ ๋์ํ๋ ํด๋์ค
๊ทธ๋ ๋ค๋ฉด ์ง๋ฌธ๊ณผ ๋ต๋ณ ์ํฐํฐ์๋ ์ด๋ค ์์ฑ๋ค์ด ํ์ํ์ง ๋จผ์ ์๊ฐํด ๋ณด์. ์ง๋ฌธ(Question) ์ํฐํฐ์๋ ...
blog.naver.com
๋ต๋ณ ํ ์ด๋ธ๋ ์์ฑํ๋ค

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 ํ ์คํธ (1) | 2023.11.08 |
| ์คํ๋ง๋ถํธ ํ๋ก์ ํธ์ ๊ตฌ์กฐ, port๋ฒํธ ์ค์ ๋ฐ context-path ์ค์ (1) | 2023.11.07 |
| ์ค์ ์ถ๊ฐ +(lombok) (0) | 2023.11.07 |
| STS4 ์ค์น ๋ฐ ์ค์ -> ํ ์คํธ (0) | 2023.11.07 |