π‘νκ΅ κ°μλ₯Ό ν λλ‘ λ³΅μ΅ν λ΄μ©μ λλ€.
λ΄μ©μ΄ κΉλνμ§ μμμ μμΌλ μν΄μ’ ν΄μ£ΌμΈμ.. π
μ€νλ§ λΆνΈλ Springμ΄ κ°μ‘λ λλμ λμ΄λ¦¬λ©°, μ΅μνμ μ€μ μΌλ‘ λ³λμ WAS μμ΄ μ€νμ΄ κ°λ₯ν μλ°μ μΉ νλ μμν¬μ΄λ€.
νλ μμν¬μμ JPAλ₯Ό νΈλ¦¬νκ² μ¬μ©ν μ μλλ‘ μ 곡ν΄μ£Όλ μμλ€.
π‘ JPAλ?
Β Β Β Β Β β‘οΈ μλ°μμ μ 곡νλ APIμ΄λ©° SQLμ μ§μ μμ±νμ§ μκ³ JPAλ₯Ό ν΅ν΄ μ μ ν SQLλ¬Έμ μμ±νμ¬ κ°μ²΄λ₯Ό μλμ μΌλ‘ μ λ¬ λ° λ§€νν΄μ€λ€.
μ΄ μΈμ μ΄λ° μ μ©ν κΈ°λ₯λ μ 곡ν΄μ€λ€.
β CRUD μ²λ¦¬λ₯Ό μν μΈν°νμ΄μ€ μ 곡
β μΈν°νμ΄μ€λ§ μμ±ν΄λ JPAκ° κ΅¬ν κ°μ²΄λ₯Ό λμ μΌλ‘ μμ±νλ€.
Object Relation Mapping
)κ°μ²΄μ§ν₯ ν¨λ¬λ€μμ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μ 보쑴νλ κΈ°μ μ΄λ€.
ORMμ κ°μ²΄μ§ν₯κ³Ό κ΄κ³ν λ°μ΄ν°λ² μ΄μ€κ° μ μ¬ν μ μ΄ λ§€μ° λ§λ€.
ν΄λμ€
λ λ°μ΄ν°μ ꡬ쑰λ₯Ό μ€κ³νλ€.ν΄λμ€
λ μλμ§λ§ Table
μ μ€κ³νλ€.class Member {
private String id;
private String pw;
private String name;
}
μ΄λ λ― ν μ΄λΈμ, 컬λΌμ μ μνλ©° 컬λΌμ λ°μ΄ν° νμ μ μ§μ νλ€λ μ μμ κ°μ²΄μ§ν₯μ ν΄λμ€μ μ μ¬ν μ μ΄ λ§λ€.
μ΄μΈμλ μΈμ€ν΄μ€
& λ μ½λ
λν μ μ¬ν μ μ΄ μλ€.
ν κ°μ§ λ€λ₯Έ μ μ΄λΌλ©΄ κ°μ²΄μ§ν₯μμμ κ°μ²΄λ λ°μ΄ν°μ νμ(Method)λ‘ μ΄λ£¨μ΄μ Έ μμ§λ§ DBμμλ κ°μ²΄(Entity)κ° μ€μ§ λ°μ΄ν°λ§ μ‘΄μ¬νλ€λ κ²μ΄λ€.
ORMμ μ΄λ¬ν μ μ κΈ°μ΄λ‘ νμ¬ κ°μ²΄μ§ν₯μ μμλ₯Ό κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μ λ§κ² μλμ μΌλ‘ μ²λ¦¬ν΄μ£Όλ κΈ°λ²μμ μμλ κ²μ΄λ€!
π‘ μ¦, μ΄λ₯Ό ν΅ν΄ μμμλ μ μ JPA(
Java Presistence API
)λ ORMμ νμ κ°λ μ΄λΌ λ³Όμμλ€.
μ΄ μ€ μ€νλ§ λΆνΈλ JPA
μ ꡬν체 μ€ Hibernate
λΌλ ꡬν체λ₯Ό μ΄μ©νλ€.
Spring Data JPA
λ₯Ό νλ‘μ νΈ μμ±μ μμ‘΄μ±μ μΆκ°νκ² λλ©΄ μ μ©ν APIλ€μ μ 곡ν΄μ€λ€.
Spring Data JPA
λ₯Ό μ΄μ©νλ©΄ λ€μκ³Ό κ°μ΄ μ©μ΄νκ² DB μ κ·Όμ΄ κ°λ₯νλ€.
Spring Data
β Hibernate
β JDBC
β DB
ν΄λΉ κΈμμλ Maria DB
λ₯Ό κΈ°μ€μΌλ‘ μ€λͺ
ν©λλ€.
MariaDB
μ μ°κ³νκΈ° μν΄ JDBC
λλΌμ΄λ²λ₯Ό μ€μ ν΄μΌνλ€.MariaDB
μ€μ MariaDB
μ© JDBC λλΌμ΄λ²λ Maven Repository ννμ΄μ§ μμ μ°Ύμμ μλ€.
Gradle
νλͺ©μμ κ΄λ ¨ μ€μ μ 볡μ¬νλ€.build.gradle
νμΌμ dependencies
νλͺ©μ μΆκ°νλ€.application.properties
νμΌ λ΄μ JDBC Driver
μ μ°κ²°νκΈ° μν λ΄μ©μ μΆκ°νλ€.μ£Όμ ! β οΈ
MariaDBμ λ±λ‘λ ν μ΄λΈ λͺ & μ¬μ©μ μ΄λ¦κ³Ό λΉλ°λ²νΈλ₯Ό λ±λ‘ν΄μ€μΌνλ€.
spring.datasource.driver-class-name = org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/bootex
spring.datasource.username=bootUser
spring.datasource.password=bootUser
μ΄ν νλ‘μ νΈ μ€ν μ ν°λ―Έλμ μ μμ μΌλ‘ μ€ν λλμ§ νμΈνλ€.
Entity
Spring Data JPA
μμ κ°λ°μ νμν κ²μ λ μ’
λ₯μ μ½λμ΄λ€.
JPA
λ₯Ό ν΅ν΄μ κ΄λ¦¬νκ² λλ κ°μ²΄(Entity
)λ₯Ό μν Entity
ν΄λμ€Repository
β
Repository
λ Spring data JPA
μμ μ 곡νλ μΈν°νμ΄μ€λ‘ μ€κ³νλλ° μ€νλ§ λ΄λΆμμ μλμΌλ‘ κ°μ²΄λ₯Ό μμ±νκ³ μ€ννλ ꡬ쑰λ₯Ό κ°κ³ μλ€.
Entity
ν΄λμ€ μμ±BookMarket
λΌλ ν΄λμ€λ₯Ό μμλ‘ λ§λ€λ©΄ λ€μκ³Ό κ°λ€.
μν°ν° ν΄λμ€λ λ§μΉ DB
μ ν
μ΄λΈκ³Ό κ°μ κ΅¬μ‘°λ‘ μμ±νλ€.
package springbootstudy.ch1.entity;
import jakarta.persistence.*;
import lombok.ToString;
@Entity
@Table(name="Table_BookMarket")
@ToString
public class BookMarket {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int memberNo;
}
@Entity
π‘ μν°ν° ν΄λμ€μ Spring Data JPA
μμλ @Entity
λΌλ μ΄λ
Έν
μ΄μ
μ΄ μΆκ°λΌμΌνλ€.
π‘ @Entity
λ ν΄λΉ ν΄λμ€κ° μν°ν° ν΄λμ€λ₯Ό μν ν΄λμ€μ΄λ€.
π‘ ν΄λΉ ν΄λμ€μ μΈμ€ν΄μ€λ€μ΄ JPA
λ‘ κ΄λ¦¬λλ μν°ν° κ°μ²΄μμ μλ―Ένλ€.
λν @Entity
κ° λΆμ ν΄λμ€λ μ΅μ
μ λ°λΌ μλμ μΌλ‘ ν
μ΄λΈμ μμ±ν΄μ€λ€.
μ΄λ₯Ό μ΄μ©νμ¬ ν΄λμ€ λ΄μ λ©€λ² λ³μμ λ°λΌ 컬λΌλ€λ μλμ μΌλ‘ μμ±λλ€.
@Table
π μ΄λ
Έν
μ΄μ
μ μ΄λ¦ κ·Έλλ‘ DB
μμμ μν°ν° ν΄λμ€λ₯Ό μ΄λ ν ν
μ΄λΈλ‘ μμ±ν κ²μΈμ§ μ μνλ μ΄λ
Έν
μ΄μ
μ΄λ€.
νμ¬ μ μν ν
μ΄λΈ λͺ
μ Table_BookMarket
μ΄λ€.
@Id
& GeneratedValue
π’ @Entity
κ° λΆμ ν΄λμ€λ PK
μ ν΄λΉνλ νλλ₯Ό @Id
μ΄λ
Έν
μ΄μ
μΌλ‘ μ§μ ν΄μ€μΌνλ€.
λν @Id
μ¬μ©μκ° μ
λ ₯νλ κ°μ μ¬μ©νλ κ²½μ°κ° μλλ©΄ μλμΌλ‘ μμ±λλ λ²νΈλ₯Ό μ¬μ©νλλ‘ @GeneratedValue
μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ€.
π’ μ΄λ
Έν
μ΄μ
κ΄νΈμμ λ΄κΈ΄ λ΄μ©μΈ GenerationType.IDENTITY
μ κ²½μ° PKλ₯Ό μλμΌλ‘ μμ±ν΄μ£Όλ λΆλΆμ΄λ€.
@Column
ν΄λμ€ λ΄μ μΆκ°μ μΈ νλκ° νμν κ²½μ°μλ μ΄λ
Έν
μ΄μ
μ ν΅ν΄ μμ±μ΄ κ°λ₯νλ€.
nullable
, name
, length
λ±μ μ΄μ©ν΄ μμ±μ λ€μν κ°λ€μ λΆμ¬ν μ μλ€.
package springbootstudy.ch1.entity;
import jakarta.persistence.*;
import lombok.*;
@Entity
@Table(name="Table_BookMarket")
@ToString
/* μ΄λ
Έν
μ΄μ
μΆκ° */
@Getter // Getter λ©μλλ₯Ό μμ±νλ€.
@Builder // κ°μ²΄ μμ±ν μ μκ² μ²λ¦¬ν΄μ€λ€.
/* Builder μ¬μ©μ μν΄ ArgsConstructorλ₯Ό κ°μ΄ μ²λν΄μ€μΌ μ»΄νμΌ μλ¬ λ°©μ§κ° κ°λ₯νλ€. */
@AllArgsConstructor
@NoArgsConstructor
public class BookMarket {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int memberNo;
@Column(length = 50, nullable = false) // 컬λΌμ ν¬κΈ° 150κΉμ§ & NULL κ° νμ©νμ§ μμ.
private String bookName;
}
μ¬κΈ°μ μλμΌλ‘ νμν ν
μ΄λΈμ μμ±κ³Ό JPA
λ₯Ό μ΄μ©ν λ λ°μνλ SQL
μ λ΄μ©μ ν°λ―Έλμμ νμΈνκΈ° μν΄ application.properties
λ₯Ό λ³κ²½ ν΄μ€μΌνλ€.
# λ΄μ© μΆκ°
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true
DDL
μ μμ±ν κ²μΈμ§ κ²°μ νλ μ€μ μ΄λ€.JPA
μ ꡬνμ²΄μΈ Hibernate
κ° λμνλ©° λ°μνλ SQL
μ ν¬λ§·ν
ν΄ μΆλ ₯νλ μ€μ μ΄λ€.JPA
μ²λ¦¬ μ λ°μνλ SQL
μ 보μ¬μ€ κ²μΈμ§ κ²°μ νλ€.ν΄λΉ μ€μ ν νλ‘μ νΈλ₯Ό μ€νν΄λ³΄λ©΄ Hiberante
κ° ν°λ―Έλμμ ν
μ΄λΈμ μμ±ν SQL
λ¬Έμ μΆλ ₯λ κ²μ΄ νμΈλλ€.
MariaDB
μμ ν
μ΄λΈ νμΈ
μ΄μ²λΌ MariaDB
μμ ν
μ΄λΈμ μ¬μ©νμ§ μλλΌλ Class
λ₯Ό ν΅ν΄ κ°λ¨νκ² κ΅¬νμ΄ κ°λ₯ν κ²μ μ μ μλ€!
Java
λ₯Ό μ λ
μ’μνλ λλ‘μ μ€νλ§ λΆνΈ 곡λΆλ μ λ§ μ¬λ°λ€.
λ€μ μ±ν° μμ λ€λ€λ³Ό λ΄μ©μ JPA Repository
λ₯Ό μ΄μ©ν΄ CRUD
λ₯Ό ꡬνν΄λ³΄λ €κ³ νλ€.
- μ°Έκ³ λ΄μ©
π μ½λλ‘ λ°°μ°λ μ€νλ§ λΆνΈ μΉνλ‘μ νΈ