πŸƒ Spring Boot - β‘΄

Jae ChanΒ·2023λ…„ 3μ›” 21일
2

SpringBoot

λͺ©λ‘ 보기
1/2

πŸ’‘ν•™κ΅ κ°•μ˜λ₯Ό ν† λŒ€λ‘œ λ³΅μŠ΅ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.
λ‚΄μš©μ΄ κΉ”λ”ν•˜μ§€ μ•Šμ„μˆ˜ μžˆμœΌλ‹ˆ μ–‘ν•΄μ’€ ν•΄μ£Όμ„Έμš”.. πŸ™

Spring Boot πŸƒ

μŠ€ν”„λ§ λΆ€νŠΈλž€ Spring이 κ°€μ‘Œλ˜ λŠλ‚Œμ„ λ˜μ‚΄λ¦¬λ©°, μ΅œμ†Œν•œμ˜ μ„€μ •μœΌλ‘œ λ³„λ„μ˜ WAS 없이 싀행이 κ°€λŠ₯ν•œ μžλ°”μ˜ μ›Ή ν”„λ ˆμž„μ›Œν¬μ΄λ‹€.

  • μŠ€ν”„λ§ λΆ€νŠΈμ˜ μž₯점
    βœ… 자체적으둜 λ‚΄μž₯ μ›Ή μ„œλ²„λ₯Ό μ§€μ›ν•œλ‹€.
    βœ… μΏ ν‚€&μ„Έμ…˜ 처리, 인가(Authorization), 둜그인 κΈ°λŠ₯ 등을 기본적으둜 지원해쀀닀.
    βœ… κΈ°μ‘΄ μŠ€ν”„λ§μ— λΉ„ν•΄ 섀정이 κ°„λ‹¨ν•˜λ‹€.

Spring Data JPA

ν”„λ ˆμž„μ›Œν¬μ—μ„œ JPAλ₯Ό νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν• μˆ˜ μžˆλ„λ‘ μ œκ³΅ν•΄μ£ΌλŠ” μš”μ†Œλ‹€.

πŸ’‘ JPAλž€?
     ➑️ μžλ°”μ—μ„œ μ œκ³΅ν•˜λŠ” API이며 SQL을 직접 μž‘μ„±ν•˜μ§€ μ•Šκ³  JPAλ₯Ό 톡해 μ μ ˆν•œ SQL문을 μž‘μ„±ν•˜μ—¬ 객체λ₯Ό μžλ™μ μœΌλ‘œ 전달 및 맀핑해쀀닀.

이 외에 이런 μœ μš©ν•œ κΈ°λŠ₯도 μ œκ³΅ν•΄μ€€λ‹€.

⭐ CRUD 처리λ₯Ό μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€ 제곡
⭐ μΈν„°νŽ˜μ΄μŠ€λ§Œ μž‘μ„±ν•΄λ„ JPAκ°€ κ΅¬ν˜„ 객체λ₯Ό λ™μ μœΌλ‘œ μƒμ„±ν•œλ‹€.

ORM(Object Relation Mapping)

객체지ν–₯ νŒ¨λŸ¬λ‹€μž„μ„ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ— λ³΄μ‘΄ν•˜λŠ” κΈ°μˆ μ΄λ‹€.

ORM은 객체지ν–₯κ³Ό κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€κ°€ μœ μ‚¬ν•œ 점이 맀우 λ§Žλ‹€.

  • 객체지ν–₯ μ–Έμ–΄μ—μ„œμ˜ ν΄λž˜μŠ€λŠ” λ°μ΄ν„°μ˜ ꡬ쑰λ₯Ό μ„€κ³„ν•œλ‹€.
  • κ΄€κ³„ν˜• 데이터 λ² μ΄μŠ€λŠ” ν΄λž˜μŠ€λŠ” μ•„λ‹ˆμ§€λ§Œ Table을 μ„€κ³„ν•œλ‹€.

class Member {
	private String id;
    private String pw;
    private String name;
}

이렇듯 ν…Œμ΄λΈ”μ€, μ»¬λŸΌμ„ μ •μ˜ν•˜λ©° μ»¬λŸΌμ— 데이터 νƒ€μž…μ„ μ§€μ •ν•œλ‹€λŠ” μ μ—μ„œ 객체지ν–₯의 ν΄λž˜μŠ€μ™€ μœ μ‚¬ν•œ 점이 λ§Žλ‹€.

이외에도 μΈμŠ€ν„΄μŠ€ & λ ˆμ½”λ“œλ˜ν•œ μœ μ‚¬ν•œ 점이 μžˆλ‹€.

  • ν΄λž˜μŠ€λŠ” ν΄λž˜μŠ€μ—μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ—¬ μΈμŠ€ν„΄μŠ€μ— 데이터λ₯Ό λ³΄κ΄€ν•œλ‹€.
  • DBλŠ” ν•˜λ‚˜μ˜ ν–‰(Row)에 데이터λ₯Ό μ €μž₯(λ ˆμ½”λ“œ OR νŠœν”Œ)ν•œλ‹€.

ν•œ 가지 λ‹€λ₯Έ 점이라면 객체지ν–₯μ—μ„œμ˜ κ°μ²΄λŠ” 데이터와 ν–‰μœ„(Method)둜 이루어져 μžˆμ§€λ§Œ DBμ—μ„œλŠ” 개체(Entity)κ°€ 였직 λ°μ΄ν„°λ§Œ μ‘΄μž¬ν•œλ‹€λŠ” 것이닀.

ORM은 μ΄λŸ¬ν•œ 점을 기초둜 ν•˜μ—¬ 객체지ν–₯의 μš”μ†Œλ₯Ό κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ— 맞게 μžλ™μ μœΌλ‘œ μ²˜λ¦¬ν•΄μ£ΌλŠ” κΈ°λ²•μ—μ„œ μ‹œμž‘λœ 것이닀!

πŸ’‘ 즉, 이λ₯Ό 톡해 μ•Œμˆ˜μžˆλŠ” 점은 JPA(Java Presistence API)λŠ” ORM의 ν•˜μœ„ κ°œλ…μ΄λΌ λ³Όμˆ˜μžˆλ‹€.

이 쀑 μŠ€ν”„λ§ λΆ€νŠΈλŠ” JPA의 κ΅¬ν˜„μ²΄ 쀑 Hibernate λΌλŠ” κ΅¬ν˜„μ²΄λ₯Ό μ΄μš©ν•œλ‹€.
Spring Data JPAλ₯Ό ν”„λ‘œμ νŠΈ μƒμ„±μ‹œ μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•˜κ²Œ 되면 μœ μš©ν•œ API듀을 μ œκ³΅ν•΄μ€€λ‹€.

Spring Data JPAλ₯Ό μ΄μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같이 μš©μ΄ν•˜κ²Œ DB 접근이 κ°€λŠ₯ν•˜λ‹€.
Spring Data β†’ Hibernate β†’ JDBC β†’ DB

Spring Data JPA μ‚¬μš© μ‹œ ν•„μš” 쑰건 βœ…

ν•΄λ‹Ή κΈ€μ—μ„œλŠ” 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
  • First Line : ν”„λ‘œμ νŠΈ μ‹€ν–‰ μ‹œ μžλ™μœΌλ‘œ DDL을 생성할 것인지 κ²°μ •ν•˜λŠ” 섀정이닀.
  • Second Line : μ‹€μ œ JPA의 κ΅¬ν˜„μ²΄μΈ Hibernateκ°€ λ™μž‘ν•˜λ©° λ°œμƒν•˜λŠ” SQL을 ν¬λ§·νŒ…ν•΄ 좜λ ₯ν•˜λŠ” 섀정이닀.
  • Third Line : JPA 처리 μ‹œ λ°œμƒν•˜λŠ” SQL을 보여쀄 것인지 κ²°μ •ν•œλ‹€.

ν•΄λ‹Ή μ„€μ • ν›„ ν”„λ‘œμ νŠΈλ₯Ό 싀행해보면 Hiberanteκ°€ ν„°λ―Έλ„μ—μ„œ ν…Œμ΄λΈ”μ„ μƒμ„±ν•œ SQL문을 좜λ ₯된 것이 ν™•μΈλœλ‹€.

MariaDB μ—μ„œ ν…Œμ΄λΈ” 확인

이처럼 MariaDBμ—μ„œ ν…Œμ΄λΈ”μ„ μ‚¬μš©ν•˜μ§€ μ•Šλ”λΌλ„ Classλ₯Ό 톡해 κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•œ 것을 μ•Œ 수 μžˆλ‹€!


마치며

Javaλ₯Ό μœ λ… μ’‹μ•„ν•˜λŠ” λ‚˜λ‘œμ„œ μŠ€ν”„λ§ λΆ€νŠΈ κ³΅λΆ€λŠ” 정말 μž¬λ°Œλ‹€.
λ‹€μŒ 챕터 μ—μ„œ 닀뀄볼 λ‚΄μš©μ€ JPA Repositoryλ₯Ό μ΄μš©ν•΄ CRUDλ₯Ό κ΅¬ν˜„ν•΄λ³΄λ €κ³  ν•œλ‹€.

  • μ°Έκ³  λ‚΄μš©
    πŸ“– μ½”λ“œλ‘œ λ°°μš°λŠ” μŠ€ν”„λ§ λΆ€νŠΈ μ›Ήν”„λ‘œμ νŠΈ
profile
πŸ‹

0개의 λŒ“κΈ€