π‘νκ΅ κ°μλ₯Ό ν λλ‘ λ³΅μ΅ν λ΄μ©μ λλ€.
λ΄μ©μ΄ κΉλνμ§ μμμ μμΌλ μν΄μ’ ν΄μ£ΌμΈμ.. π

μ€νλ§ λΆνΈλ 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
μ΄ν νλ‘μ νΈ μ€ν μ ν°λ―Έλμ μ μμ μΌλ‘ μ€ν λλμ§ νμΈνλ€.

EntitySpring 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λ₯Ό ꡬνν΄λ³΄λ €κ³ νλ€.
- μ°Έκ³ λ΄μ©
π μ½λλ‘ λ°°μ°λ μ€νλ§ λΆνΈ μΉνλ‘μ νΈ