Spring Data JPA ์ฒซ ๋จ์ถ
์๋ก
Spring Data JPA๋ฅผ ๋ฐฐ์ฐ๊ธฐ์ ์์ ์์์ผ ํ ๋ด์ฉ๋ค์ด ๋ง๋ค.
- JDBC
- ORM
- JPA
- Hibernate(JPA ๊ตฌํ์ฒด)
- Spring Framework
- ํธ๋์ญ์ ์ ์ดํด
- Spring Data JPA ๊ตฌ์กฐ์ ์ฃผ์ ์ธํฐํ์ด์ค
ํด๋น ๋ด์ฉ๋ค์ ์์ผ๋ก ํ๋์ฉ ํฌ์คํ ํด๊ฐ๋ฉฐ ์ดํดํ ์์ ์ด๋ค. ์์ํ๊ธฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ Spring Boot๊ฐ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง์ ๋ํด ์์๋ณด์. ์ฌ์ค ๊ด๋ จ ๋ด์ฉ Dockerize๋ฅผ ํตํด ๋ค์ ์ด๋ฏธ ์ธ๊ธํ ๋ฐ ์๋ค. https://1000sang-dev.tistory.com/72
์ค์ต๊ณผ ๊ณต๋ถ์ ์์ ๋น์ทํ ๋ด์ฉ์ ์์ฑํด๋ณผ ์์ ์ด๋ค. ๐ ํ๋ฒ ๋ ๋ณต์ตํ๋ ๊ฒ๋ ๋์์ง ์์ ๊ฒ ๊ฐ๋ค.
1๏ธโฃ ๋ก์ปฌ ๋ด Docker๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ ๊ตฌ๋ - PostgreSQL
- ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ๋ฐ๋ก ๊ตฌ๋์ด ๊ฐ๋ฑํ๋ค | ๋์ปค ๋ด ํฌํธ๋ 5432์ด์ง๋ง, ๋ก์ปฌ ๋ ธ์ถ ํฌํธ๋ 54322
docker run --name postgresql-container \
-e POSTGRES_USER=asac \
-e POSTGRES_PASSWORD=**** \
-e POSTGRES_DB=example \
-p 54322:5432 -d postgres:15
- `docker ps` ๋ช ๋ น์ด๋ฅผ ํตํด ์ปจํ ์ด๋๊ฐ ๊ตฌ๋๋๊ณ ์๋์ง ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
- ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ์ปจํ ์ด๋ ๋ด ์ ์ํ์ฌ, ์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ ๋ฐ ์ฟผ๋ฆฌ ์ํ์ด ๊ฐ๋ฅํ๋ค.
docker exec -it postgresql-container bash
- PostgresQL DBMS ์ ์: MySQl๊ณผ ๋ฌ๋ฆฌ ์ ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ํํ๋ค
psql -U asac -d example
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ธ: `\l` ํ ์ด๋ธํ์ธ: `\dt`
- ์ปจํ ์ด๋ ์ค์ง, ์์, ์ฌ์์
# PostgresQL Docker ์ปจํ
์ด๋ ์ค์ง
docker stop postgresql-container
# PostgresQL Docker ์ปจํ
์ด๋ ์์
docker start postgresql-container
# PostgresQL Docker ์ปจํ
์ด๋ ์ฌ์์
docker restart postgresql-container
2๏ธโฃ Spring Boot์์ ์ ๋์ปค ์ปจํ ์ด๋๋ก ๋์๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์
1. Gradle ์ค์ ํ์ผ์ Driver์ JPA 2๊ฐ์ ๋ํ๋์๋ฅผ ์ถ๊ฐํ๋ค.
dependencies {
runtimeOnly 'org.postgresql:postgresql'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
...
}
2. Spring Data JPA ์ฌ์ฉ์ใน ์ํ Spring ์ค์ ํ์ผ์ ์์ ํ๋ค.
- `application.properties`
# ORM
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
# PostgresQL - CREATE USER user PASSWORD '!@#' SUPERUSER;
spring.datasource.url=jdbc:postgresql://localhost:54322/example?useSSL=false
spring.datasource.username=asac
spring.datasource.password=****
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
3. JPA๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฟผ๋ฆฌ ์คํ ์ ์์ฝ์ด ์ฌ์ฉ ๋ฌธ์ ํด๊ฒฐ์ ์ํ ์ถ๊ฐ ์ค์
Entity ํด๋์ค ์ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด ํ ์ด๋ธ์ ์์ฑํ๋ Auto DDL ์ด๋ ์ค์ DML ์ฟผ๋ฆฌ ์ํ ์ ์์ฝ์ด(Reserved Words)๊ฐ ํฌํจ๋์ด์๋ ๊ฒฝ์ฐ Spring์์ ์๋ฌ ๋ก๊ทธ์ ํจ๊ป ๋ฌธ๋ฒ ์ค๋ฅ๋ฅผ ๋ฐ์ ์ํจ๋ค.
ํด๊ฒฐ๋ฐฉ๋ฒ:
- ๋งค๋ฒ ์ํํ ์ฟผ๋ฆฌ ๋ด ์กด์ฌํ๋ ์์ฝ์ด์ ๋ํด double-quote(`"`)๋ก ๊ฐ์ธ์ฃผ์ด์ผํ๋ค.
- ๋งค๋ฒ ๋ถ์ฌ์ฃผ๊ธฐ ๊ท์ฐฎ๊ธฐ๋๋ฌธ์ JPA ์ค์ ์ผ๋ก JPA๊ฐ ์์ฑํ๋ ๋ชจ๋ ์ฟผ๋ฆฌ์ double-quote(`"`) ์ ์ฉ
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
4. Auto DDL ํตํด ๊ฐ๋ฐ์๊ฐ ์ ์ํ Entity ํด๋์ค๊ฐ ์ ์์ ์ผ๋ก ํ ์ด๋ธ๋ก ์์ฑ๋๋์ง ํ์ธ
- User ํด๋์ค
@Getter
@Entity
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString
public class User {
/**
* JPA ํตํ Database ์ฌ์ฉ ์ @GeneratedValue ์ ๋ต์ ๋ํด ์กฐ๊ธ ์์ธํ ์ ํ์๊ฐ ์๋ค.
* - AUTO : ID ์์ฑ ์ฑ
์์ด JPA ์๊ฒ ์๋ค (JPA ๋ hibernate_sequence ๋ผ๋ sequence ํ
์ด๋ธ์ ๋ง๋ค์ด ํ์ฉ, nextval ํธ์ถ)
* - IDENTITY : ID ์์ฑ ์ฑ
์์ Database ์๊ฒ ์์ํ๋ค. (PostgresQL ์ Primary Key ์ ๋ํด SERIAL ๋ก ์ ์ ๋ฐ DB ์์ฒด์ ์ผ๋ก Sequence ์์ฑ)
* > MySQL ๋ผ๋ฉด AUTO_INCREMENT ์ฌ์ฉํ ๊ฒ์ด๊ณ ,
* > PostgresQL ์ด๋ผ๋ฉด SERIAL + Sequence ์ฌ์ฉ (sequence name ํ์์ {tablename}_{columnname}_seq), currval ํธ์ถ)
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Setter
private Integer id;
private String name;
private Integer age;
private String job;
private String specialty;
private LocalDateTime createdAt;
}
- Gradle ๋ฐ Spring ์ค์ ์ ๋ชจ๋ ๋ง์น ๋ค ์คํ๋ง ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋ํ ๊ฒฝ์ฐ Auto DDL์ด ๋์ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ฐ.
- ์ ๋ก๊ทธ๋ฅผ ํตํด ์ค์ ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ด ์ ์์ฑ๋์๋์ง ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
- ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ํ ์ด๋ธ์ด ์ ์์ ์ผ๋ก ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
โน๏ธ ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
'๐ปDEV-STUDY > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] Spring JDBC (0) | 2024.12.22 |
---|---|
[Spring] ์ค๋ฌด์์์ Best Practices #2 (0) | 2024.10.07 |
[Spring] ์ค๋ฌด์์์ Best Practices #1 (0) | 2024.10.07 |
[Spring] Spring Boot ์ฅ์ ๋ฐ ๋์ (0) | 2024.10.06 |
[Spring] Spring ์์ฒญ๊ฐ ์ฒ๋ฆฌ ๋ฐฉ์ (0) | 2024.10.06 |