spring boot๋ฅผ ์ด์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ํ๊ฒ ๋์๋๋ฐ
MySQL์ ์ฒ์ ์ฐ๋ํด๋ณด๋ฉด์ ๊ธฐ๋ก์ ๋จ๊ฒจ๋ณด๊ฒ ์ต๋๋ค...
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.mysql:mysql-connector-j'
์ฐ์ build.gradle์ ์ 2๊ฐ์ ์์กด์ฑ์ ์ถ๊ฐํด์ค๋ค
๐implementation ๊ณผ runtimeOnly ์ ์ฐจ์ด๋ ๋ญ๊น ๊ถ๊ธ์ฆ์ด ๋ค์๋ค!
=> runtimeOnly๋ ์ปดํ์ผ ์์ ์๋ ํ์์์ง๋ง ์คํ ์์ ์๋ ๊ผญ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กด์ฑ์ ์ถ๊ฐํ ๋ ์ฌ์ฉํ๋ค๊ณ ํ๋ค
DB ์ฐ๋์ ์ํด์๋ resources ๋๋ ํ ๋ฆฌ ์์ ์๋ application.properties๋ฅผ ์ค์ ํด์ค์ผ ํ๋๋ฐ
url์ jdbc:mysql:// [๋ฐ์ดํฐ๋ฒ ์ด์ค URL] : [ํฌํธ ๋ฒํธ] / [๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ]?serverTimezone=UTC ๋ก ์
๋ ฅํด์ค๋ค
๋ฐ์ ์ค์ ๋ค์ ๊ฒฝ์ฐ ์ฐจ๋ก๋ก
1. spring.jpa.properties.hibernate.show_sql=true
=> Hibernate๊ฐ ์คํํ๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์ฝ์์ ์ถ๋ ฅํ๋๋ก ํด์ค
(์ฟผ๋ฆฌ์ ์คํ ๋ด์ฉ์ ํ์ธํ ๋ ์ ์ฉ)
2. spring.jpa.properties.hibernate.format_sql=true
=> ์ถ๋ ฅ๋๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์ฝ๊ธฐ ์ฝ๊ฒ ํฌ๋งทํ
ํจ
(show_sql ์ต์
๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ถ๋ ฅ๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์ ํฌ๋งทํ์ฌ ๊ฐ๋
์ฑ์ ๋์ฌ์ค)
3. spring.jpa.hibernate.ddl-auto=update
=> ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋ Hibernate๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ๊ฒฐ์ ํจ
- create: ๊ธฐ์กด ํ
์ด๋ธ์ ์ญ์ ํ๊ณ ์๋ก ์์ฑ
=> ๊ฐ๋ฐ ํ๊ฒฝ์์ ์์ฃผ ์ฌ์ฉํ์ง๋ง ์ด์ ํ๊ฒฝ์์๋ ๋ฐ์ดํฐ ์์ค ๋ฐฉ์ง๋ฅผ ์ํด ๋ค๋ฅธ ๊ฐ์ ์ฌ์ฉํ๋๊ฒ ์ข์ - update: ๊ธฐ์กด ํ
์ด๋ธ์ ์ ์งํ๋ฉด์ ํ์ํ ๊ฒฝ์ฐ ํ
์ด๋ธ์ ์
๋ฐ์ดํธ
=> ์๋ฒ ์คํ์ ๋ณ๊ฒฝ์ฌํญ ์์ผ๋ฉด ์คํ, ํ ์ด๋ธ ์์ผ๋ฉด ์๋ ์์ฑ - create-drop: create์ ๋์ผํ์ง๋ง ์ ํ๋ฆฌ์ผ์ด์
์ด ์ข
๋ฃ๋ ๋ ํ
์ด๋ธ์ ์ญ์
- validate: ํ
์ด๋ธ์ด ์กด์ฌํ๊ณ ์คํค๋ง๊ฐ ์ํฐํฐ์ ์ผ์นํ๋์ง ํ์ธ
=> ์ผ์นํ์ง ์์ผ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํด - none: ์คํค๋ง๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ฑฐ๋ ๋ณ๊ฒฝํ์ง ์์
4. spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
=> Hibernate๊ฐ ์ฌ์ฉํ SQL ๋ฐฉ์ธ(Dialect)์ ์ง์ ํ๋๋ฐ MySQL์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ MySQLDialect๋ฅผ ์ ์ด์ค
(Hibernate๊ฐ SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํน์ฑ์ ๋ง๊ฒ ์ต์ ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ)
MySQL 8.0.1์ด์์์๋ MySQLDialect๋ก ์ฌ์ฉ (๋ฒ์ ๋ฐ๋ก ํ๊ธฐ X)
SQL ํ์ค๊ณผ ๋ค๋ฅด๊ฑฐ๋ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง์ ๊ณ ์ ๊ธฐ๋ฅ์ JPA์์๋ ๋ฐฉ์ธ(Dialect) ์ด๋ผ๊ณ ํจ
๊ฐ๋ฐํ ๋ JPA๊ฐ ์ ๊ณตํ๋ ํ์ค ๋ฌธ๋ฒ์ ๋ง์ถฐ ์ฌ์ฉํ๋ฉด ๋๊ธฐ ๋๋ฌธ์
ํน์ DB์ ์์กด์ ์ธ SQL์ Dialect๊ฐ ์ฒ๋ฆฌํด์ค๋ค.
=> DB๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ํ์์์ด Dialect๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋จ
ํ์ธ์ ์ํด ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค
@RequiredArgsConstructor์ ๊ฒฝ์ฐ final ํ๋์ @NonNull์ด ๋ถ์ ํ๋๋ฅผ ํฌํจํ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํด์ฃผ๋๋ฐ
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class Example {
private final String finalField;
private final int finalIntField;
@NonNull
private String nonNullField;
}
์ ์ฝ๋์์ @RequiredArgsConstructor๋
public Example(String finalField, int finalIntField, @NonNull String nonNullField) {
this.finalField = finalField;
this.finalIntField = finalIntField;
if (nonNullField == null) {
throw new NullPointerException("nonNullField is marked non-null but is null");
}
this.nonNullField = nonNullField;
}
์ด ์ฝ๋๋ฅผ ์๋ ์์ฑ ํด์ค๋ค!
=> ์ด ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ์์ฑ์ ์ฃผ์ ์ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ผ ์ ์๋ค!
์ด๋ ๊ฒ ์ ์ ์ฅ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค!
'๐ซ Backend > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Boot์์ Supabase ์ฌ์ฉํ๊ธฐ (Kotlin) (0) | 2025.02.25 |
---|---|
Spring boot ์์ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉํ๊ธฐ (Kotlin) (0) | 2025.02.20 |
JPA ํบ์๋ณด๊ธฐ (0) | 2025.02.16 |
[Spring Boot] Docker๋ฅผ ์ด์ฉํด EC2์ ๋ฐฐํฌํด๋ณด๊ธฐ (4) | 2024.08.27 |
[Spring Boot] Custom Exception ์ค์ (0) | 2024.08.19 |