๐Ÿ› ๏ธ JPA์™€ MySQL ์ ‘์† + ํ…Œ์ด๋ธ”(Entity) ๋งŒ๋“ค๊ธฐ

EthAnalogยท2025๋…„ 8์›” 22์ผ

Spring Boot

๋ชฉ๋ก ๋ณด๊ธฐ
7/16
post-thumbnail

โœ… ์–ด๋–ค ๊ธฐ๋Šฅ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ธ๊ฐ€?

  • JPA + MySQL(or PostgreSQL) ์—ฐ๊ฒฐ ์„ค์ •
  • application.properties ๋กœ DB ์ ‘์† ์ •๋ณด ๋“ฑ๋ก
  • @Entity ํด๋ž˜์Šค๋กœ ์ž๋™ ํ…Œ์ด๋ธ” ์ƒ์„ฑ
  • ์ปฌ๋Ÿผ ์ œ์•ฝ ์กฐ๊ฑด ์„ค์ • ๋ฐ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…

๐Ÿ‘‰ ์™œ ์ด๊ฑธ ๋ฐฐ์›Œ์•ผ ํ•˜์ง€?

  • ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ(DB) ์—ฐ๊ฒฐ์€ ํ•„์ˆ˜
  • SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์ž๋ฐ” ์ฝ”๋“œ(Entity)๋กœ DB ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • ์‹ค๋ฌด์—์„  ๋Œ€๋ถ€๋ถ„ JPA/Hibernate ๊ธฐ๋ฐ˜ ORM์„ ํ™œ์šฉ โ†’ ์ƒ์‚ฐ์„ฑโ†‘, ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด

๐Ÿ“š ๊ฐœ๋… ์ •๋ฆฌ

๊ฐœ๋…์„ค๋ช…
JPAJava Persistence API. ์ž๋ฐ” ์ง„์˜์˜ ORM ํ‘œ์ค€ ๋ฌธ๋ฒ•
HibernateJPA ๊ตฌํ˜„์ฒด. ์‚ฌ์‹ค์ƒ ์—…๊ณ„ ํ‘œ์ค€ ORM
Entity@Entity ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ ์ผ๋Œ€์ผ๋กœ ๋งคํ•‘๋˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด
@Id๊ธฐ๋ณธ ํ‚ค(Primary Key) ์ง€์ •
@GeneratedValue์ž๋™ ์ฆ๊ฐ€ ๊ฐ’ ๋ถ€์—ฌ (auto increment)
@Column์ œ์•ฝ ์กฐ๊ฑด ๋ถ€์—ฌ (๊ธธ์ด, null ์—ฌ๋ถ€, unique ๋“ฑ)
runtimeOnly๋Ÿฐํƒ€์ž„ ์‹œ์—๋งŒ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (ex: DB ๋“œ๋ผ์ด๋ฒ„)

โš™๏ธ ๊ตฌํ˜„ ํ๋ฆ„ ๋ฐ ์ฝ”๋“œ

1) ์˜์กด์„ฑ ์ถ”๊ฐ€ (build.gradle)

dependencies {
  runtimeOnly 'com.mysql:mysql-connector-j'
  implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

(PostgreSQL ์‚ฌ์šฉ ์‹œ)

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

2) DB ์ ‘์† ์„ค์ • (application.properties)

spring.datasource.url=jdbc:mysql://์—”๋“œํฌ์ธํŠธ์ฃผ์†Œ:3306/๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ช…
spring.datasource.username=DB์•„์ด๋””
spring.datasource.password=DB๋น„๋ฒˆ
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.hibernate.ddl-auto=update
  • ddl-auto=update โ†’ ํ…Œ์ด๋ธ” ์ž๋™ ์ƒ์„ฑ/์ˆ˜์ • ๋ฐ˜์˜
  • ์šด์˜ํ™˜๊ฒฝ์—์„  none ๊ถŒ์žฅ

3) Entity ํด๋ž˜์Šค ์ƒ์„ฑ

import jakarta.persistence.*;

@Entity
public class Item {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer id;

    @Column(length = 200, nullable = false, unique = true)
    public String title;

    public Integer price;
}
  • ํด๋ž˜์Šค๋ช… = ํ…Œ์ด๋ธ”๋ช…
  • ๋ณ€์ˆ˜ = ์ปฌ๋Ÿผ
  • @Id + @GeneratedValue = ์ž๋™ ์ฆ๊ฐ€ PK

4) ๋ฐ์ดํ„ฐ ์‚ฝ์ž… (DBeaver or SQL)

insert into item values (1, '์…”์ธ ', 7000);
insert into item values (2, '๋ฐ”์ง€', 5000);
insert into item values (3, '์ž์ผ“', 6000);

๐Ÿ’ก ์ด๋Ÿฐ ๊ณณ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”

  • ์‡ผํ•‘๋ชฐ ์ƒํ’ˆ ํ…Œ์ด๋ธ”
  • ํšŒ์› ์ •๋ณด ์ €์žฅ (์•„์ด๋””, ์ด๋ฉ”์ผ, ๋น„๋ฐ€๋ฒˆํ˜ธ)
  • ๊ฒŒ์‹œํŒ ๊ธ€ ์ €์žฅ
  • ์ฃผ๋ฌธ ๊ธฐ๋ก ๊ด€๋ฆฌ

โœ๏ธ ๊ฐœ์ธ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ 

  • ํ•ต์‹ฌ์€ @Entity : ํด๋ž˜์Šค = ํ…Œ์ด๋ธ”
  • SQL์„ ์ง์ ‘ ์งœ๋Š” ๋Œ€์‹  ์ž๋ฐ” ์ฝ”๋“œ๋กœ DB ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • JPA/Hibernate๋Š” ์‰ฝ๊ณ  ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๊ธฐ๋ณธ SQL๋„ ์•Œ์•„์•ผ ๋””๋ฒ„๊น…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ”‘ ์˜ค๋Š˜ ๋ฐฐ์šด ํ•ต์‹ฌ 3์ค„ ์š”์•ฝ

  1. build.gradle์— JPA + DB ๋“œ๋ผ์ด๋ฒ„ ์˜์กด์„ฑ ์ถ”๊ฐ€
  2. application.properties์— ์ ‘์† ์ •๋ณด ์ž…๋ ฅ
  3. @Entity ํด๋ž˜์Šค๋กœ ํ…Œ์ด๋ธ” ์ž๋™ ์ƒ์„ฑ + ์ œ์•ฝ์กฐ๊ฑด @Column์œผ๋กœ ๋ถ€์—ฌ

0๊ฐœ์˜ ๋Œ“๊ธ€