์น ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ณ ์ด์ํ๋ค ๋ณด๋ฉด ํผํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃจ๋ ์ผ์
iBatis์ ๊ฐ์ SQL ๋งคํผ๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํจ
๊ทธ๋ฌ๋ค ๋ณด๋ ์ค์ ๋ก ๊ฐ๋ฐํ๋ ์๊ฐ๋ณด๋ค SQL์ ๋ค๋ฃจ๋ ์๊ฐ์ด ๋ ๋ง์์ก์
์ด๋ฌ๋ค๋ณด๋ ๊ฐ์ฒด ๋ชจ๋ธ๋ง๋ณด๋ค๋ ํ ์ด๋ธ ๋ชจ๋ธ๋ง์๋ง ์ง์คํ๊ณ , ๊ฐ์ฒด๋ฅผ ๋จ์ํ ํ ์ด๋ธ์ ๋ง์ถ์ด ๋ฐ์ดํฐ ์ ๋ฌ ์ญํ ๋ง ํ๋ ๊ฐ๋ฐ์ ๋ถ๋ช ๊ธฐํ์ ์ธ ํํ์
์ด๋ฏ๊ฒ ํ๋ฉด ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด์ฉํ๋ ํ๋ก์ ํธ์์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์์๊น ๊ณ ๋ฏผํจ
๊ทธ๋ฌ๋ ์ค, ์ด๋ฏธ ๊ธฐ์กด์ ์๋ฐ ๊ฐ๋ฐ์๋ถ๋ค ์ญ์ ์ด ๊ณ ๋ฏผ์ ํ๊ณ ์์์์ ์๊ฒ ๋์์
๋ฌธ์ ์ ํด๊ฒฐ์ฑ ์ผ๋ก JPA๋ผ๋ ์๋ฐ ํ์ค ORM (Object Relational Mapping) ๊ธฐ์ ์ ๋ง๋๊ฒ ๋จ
์ด๋ฒ ์๊ฐ์๋ JPA๋ฅผ ํ๋ก์ ํธ์ ์ ์ฉํด ๋ณด๊ฒ ์.
MyBatis, iBatis๋ ORM์ด ์๋. SQL Mapper์. ๊ฐ๋ ORM์ ๋ํด MyBatis, iBatis๋ฅผ ์๊ธฐํ๊ฒ ๋๋๋ฐ ์ด ๋์ ORM์ด ์๋. ORM์ ๊ฐ์ฒด๋ฅผ ๋งคํํ๋ ๊ฒ์ด๊ณ SQL Mapper๋ ์ฟผ๋ฆฌ๋ฅผ ๋งคํํจ
3.1 JPA ์๊ฐ
์๊ตฌ์ฌํญ ๋ถ์
์ด ๊ต์ฌ์์ 3~6์ฅ๊น์ง๋ ํ๋์ ๊ฒ์ํ์ ๋ง๋ค์ด ๋ณด๊ณ ,
7~10์ฅ๊น์ง๋ ์ด ์๋น์ค๋ฅผ AWS์ ๋ฌด์ค๋จ ๋ฐฐํฌ ํ๋ ๊ฒ๊น์ง ์งํํ ๊ฒ์
- ๊ฒ์ํ ๊ธฐ๋ฅ
- ๊ฒ์๊ธ ์กฐํ
- ๊ฒ์๊ธ ๋ฑ๋ก
- ๊ฒ์๊ธ ์์
- ๊ฒ์๊ธ ์ญ์
- ํ์ ๊ธฐ๋ฅ
- ๊ตฌ๊ธ / ๋ค์ด๋ฒ ๋ก๊ทธ์ธ
- ๋ก๊ทธ์ธํ ์ฌ์ฉ์ ๊ธ ์์ฑ ๊ถํ
- ๋ณธ์ธ ์์ฑ ๊ธ์ ๋ํ ๊ถํ ๊ด๋ฆฌ
3.2 ํ๋ก์ ํธ์ Spring Data Jpa ์ ์ฉํ๊ธฐ
๋จผ์ build.gradle์ ๋ค์๊ณผ ๊ฐ์ ์์กด์ฑ๋ค์ ์ถ๊ฐํฉ๋๋ค (spring-boot-starter-data-jpa, h2)
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
โ spring-boot-starter-data-jpa
โก h2
์์กด์ฑ์ด ๋ฑ๋ก๋์ผ๋ฉด, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก JPA ๊ธฐ๋ฅ์ ์ฌ์ฉํด ๋ณด์
domain ํจํค์ง๋ ๋๋ฉ์ธ์ ๋ด์ ํจํค์ง์ ๋๋ค.
์ฌ๊ธฐ์ ๋๋ฉ์ธ์ด๋ ๊ฒ์๊ธ, ๋๊ธ, ํ์, ์ ์ฐ, ๊ฒฐ์ ๋ฑ ์ํํธ์จ์ด์ ๋ํ ์๊ตฌ์ฌํญ ํน์ ๋ฌธ์ ์์ญ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
domain ํจํค์ง์ posts ํจํค์ง๋ฅผ ์๋ก ์์ฑํ๊ณ ๊ทธ ์์ Posts ํด๋์ค๋ฅผ ๋ง๋ค์ด๋ด ๋๋ค.
package study.springboot.domain.posts;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
@Entity
public class Posts {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 500, nullable = false)
private String title;
@Column(columnDefinition = "TEXT", nullable = false)
private String content;
private String author;
@Builder
public Posts(String title, String content, String author) {
this.title = title;
this.content = content;
this.author = author;
}
public void update(String title, String content) {
this.title = title;
this.content = content;
}
}