html
Spring Boot์์ ์ฌ์ฉ์ ๊ด๋ฆฌ ๊ตฌํ: ๊ณ์ ๋ชจ๋ธ ์ถ๊ฐ
๋ชฉ์ฐจ
- ์๊ฐ...........................................ํ์ด์ง 1
- ์ํฐํฐ ๊ฐ ๊ด๊ณ ์ค์ ....ํ์ด์ง 4
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ฒ๋ฆฌ.........ํ์ด์ง 6
- ์ ํ๋ฆฌ์ผ์ด์ ์คํ ๋ฐ ํ ์คํธ.....ํ์ด์ง 8
- ๊ฒฐ๋ก ................................................ํ์ด์ง 10
์๊ฐ
๋น ๋ฅด๊ฒ ๋ณํํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ํ๊ฒฝ์์ ํจ์จ์ ์ธ ์ฌ์ฉ์ ๊ด๋ฆฌ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค. Java ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ํ ๊ฐ๋ ฅํ ํ๋ ์์ํฌ์ธ Spring Boot๋ ์ด ๊ณผ์ ์ ์ฉ์ดํ๊ฒ ํ๋ ๊ฒฌ๊ณ ํ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํฉ๋๋ค. ์ด eBook์ Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ ๋ชจ๋ธ์ ์ถ๊ฐํ๋ ๋ณต์กํ ๊ณผ์ ์ ๋ค๋ฃจ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ ์์ฑ, ์ํฐํฐ ๊ด๊ณ ์ค์ , ์ํํ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ์ค์ ์ ์ผ๋ก ์ค๋ช ํฉ๋๋ค.
์ฌ์ฉ์ ๊ด๋ฆฌ ๊ตฌํ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ์ฑ์ ํฅ์์ํฌ ๋ฟ๋ง ์๋๋ผ, ์์ ํ๊ณ ์ฒด๊ณ์ ์ธ ์ ๊ทผ ์ ์ด๋ฅผ ์ ๊ณตํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํฉ๋๋ค. ์ด ๊ฐ์ด๋๋ ์ด๋ณด์์ ๊ธฐ๋ณธ ์ง์์ ๊ฐ์ง ๊ฐ๋ฐ์๋ฅผ ๋์์ผ๋ก ํ๋ฉฐ, Spring Boot ํ๊ฒฝ ๋ด์์ ๊ณ์ ๋ชจ๋ธ์ ํตํฉํ๋ ๋ฐ ์์ด ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ๋ฉฐ ์คํ ๊ฐ๋ฅํ ์ธ์ฌ์ดํธ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
์ฌ์ฉ์ ๊ด๋ฆฌ์ ์ค์์ฑ
ํจ๊ณผ์ ์ธ ์ฌ์ฉ์ ๊ด๋ฆฌ๋ ํ๊ฐ๋ ์ธ์๋ง์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ๋ถ๋ถ์ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํ์ฌ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ณ ์์คํ ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํฉ๋๋ค. ์ ๊ตฌ์กฐํ๋ ๊ณ์ ๋ชจ๋ธ์ ๊ตฌํํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ์ธ์ฆ ๊ณผ์ ์ ๊ฐ์ํํ๊ณ , ์ฌ์ฉ์ ์ญํ ์ ๊ด๋ฆฌํ๋ฉฐ, ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๋์ฑ ํจ์จ์ ์ผ๋ก ํ ์ ์์ต๋๋ค.
์ฅ๋จ์
์ฅ์ :
- ๋ณด์ ๊ฐํ: ์ ์ ํ ์ฌ์ฉ์ ๊ด๋ฆฌ๋ ๋ฌด๋จ ์ ๊ทผ์ผ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค.
- ํ์ฅ์ฑ: ๊ตฌ์กฐํ๋ ๊ณ์ ๋ชจ๋ธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ฝ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค.
- ์ ์ง๋ณด์์ฑ: ์ํฐํฐ ๊ฐ์ ๋ช ํํ ๊ด๊ณ๋ ํฅํ ์ ๋ฐ์ดํธ์ ์ ์ง๋ณด์๋ฅผ ๋จ์ํํฉ๋๋ค.
๋จ์ :
- ๋ณต์ก์ฑ: ๊ด๊ณ ์ค์ ๊ณผ ์ํฐํฐ ๊ด๋ฆฌ๋ ์ด๋ณด์์๊ฒ ๋ณต์กํ ์ ์์ต๋๋ค.
- ์ค๋ฒํค๋: ์ถ๊ฐ์ ์ธ ๊ด๋ฆฌ ๊ณ์ธต์ ๊ฐ๋ฐ ์๊ฐ์ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค.
์ธ์ ๊ทธ๋ฆฌ๊ณ ์ด๋์ ์ฌ์ฉํ ๊ฒ์ธ๊ฐ
๊ณ์ ๋ชจ๋ธ ๊ตฌํ์ ์ ์์๊ฑฐ๋ ํ๋ซํผ, ์์ ๋ฏธ๋์ด ๋คํธ์ํฌ, ์ํฐํ๋ผ์ด์ฆ ์๋ฃจ์ ๊ณผ ๊ฐ์ด ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ๊ฐ ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์์ ์ ๋๋ค. ํนํ ๋๋์ ์ฌ์ฉ์์ ๋ณต์กํ ์ ๊ทผ ์ ์ด๋ฅผ ๊ด๋ฆฌํ ๋ ์ ์ฉํฉ๋๋ค.
๊ณ์ ๋ชจ๋ธ ์ค์
Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์ฌ์ฉ์ ๊ด๋ฆฌ๋ฅผ ํ๋ฆฝํ๊ธฐ ์ํด ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ๊ณ์ ๋ชจ๋ธ์ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์ด ๋ชจ๋ธ์ ์ฌ์ฉ์ ์ํฐํฐ๋ฅผ ๋ํ๋ด๋ฉฐ, ํด๋นํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ๋งคํ๋ฉ๋๋ค.
๊ณ์ ์ํฐํฐ ์ ์
Spring Boot์์ ์ํฐํฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ๋งคํ๋๋ ํด๋์ค์ ๋๋ค. Account ์ํฐํฐ๋ฅผ ์ ์ํ๋ ค๋ฉด:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package org.studyeasy.SpringStarter.models; import javax.persistence.*; import lombok.Getter; import lombok.Setter; import lombok.NoArgsConstructor; @Entity public class Account { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; private String email; private String password; private String firstName; // Getters and Setters } |
์ค๋ช :
- @Entity: ํด๋์ค๋ฅผ JPA ์ํฐํฐ๋ก ํ์ํฉ๋๋ค.
- @Id: ๊ธฐ๋ณธ ํค๋ฅผ ์ง์ ํฉ๋๋ค.
- @GeneratedValue: ID ์์ฑ ์ ๋ต์ ์ ์ํฉ๋๋ค.
- Lombok ์ด๋ ธํ ์ด์ : @Getter, @Setter, @NoArgsConstructor๋ getters, setters ๋ฐ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํ์ฌ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ค์ฌ์ค๋๋ค.
ID ์์ฑ ์ ๋ต ๊ตฌ์ฑ
๊ธฐ๋ณธ์ ์ผ๋ก Spring Boot๋ ID ์์ฑ์ AUTO ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๊ฒฝ์ฐ, ID๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฆ๊ฐ์ํค๊ธฐ ์ํด SEQUENCE ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.
1 2 3 |
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; |
์ค๋ช :
- GenerationType.SEQUENCE: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค๋ฅผ ์ด์ฉํ์ฌ ๊ณ ์ ํ ID๋ฅผ ์์ฑํ๋ฉฐ, ์์ธก ๊ฐ๋ฅํ๊ณ ์ฆ๋ถ์ ์ธ ID ํ ๋น์ ๋ณด์ฅํฉ๋๋ค.
์ํฐํฐ ๊ฐ ๊ด๊ณ ์ค์
์ผ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ์(๊ณ์ )๋ ๊ฒ์๋ฌผ๊ณผ ๊ฐ์ ๋ค์ํ ์ํฐํฐ์ ์ํธ ์์ฉํฉ๋๋ค. ์ด๋ฌํ ์ํฐํฐ ๊ฐ์ ๋ช ํํ ๊ด๊ณ๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ํํ ์ด์์ ์ํด ์ค์ํฉ๋๋ค.
์ผ๋๋ค ๊ด๊ณ
ํ๋์ ๊ณ์ ์ ์ฌ๋ฌ ๊ฒ์๋ฌผ์ ๊ฐ์ง ์ ์์ง๋ง, ๊ฐ ๊ฒ์๋ฌผ์ ํ๋์ ๊ณ์ ๊ณผ๋ง ์ฐ๊ด๋ฉ๋๋ค. ์ด๋ ์ผ๋๋ค ๊ด๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ๋ง๋ฉ๋๋ค.
Account.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package org.studyeasy.SpringStarter.models; import javax.persistence.*; import java.util.List; import lombok.Getter; import lombok.Setter; import lombok.NoArgsConstructor; @Entity @Getter @Setter @NoArgsConstructor public class Account { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; private String email; private String password; private String firstName; @OneToMany(mappedBy = "account") private List<Post> posts; } |
์ค๋ช :
- @OneToMany(mappedBy = "account"): Account ์ํฐํฐ๊ฐ Post ์ํฐํฐ์ ์ผ๋๋ค ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์์ ๋ํ๋ ๋๋ค. mappedBy ์์ฑ์ Post ํด๋์ค์ account ํ๋๋ฅผ ๊ฐ๋ฆฌ์ผ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ์ค์ ํฉ๋๋ค.
๋ค๋์ผ ๊ด๊ณ
๋ฐ๋๋ก, ๊ฐ ๊ฒ์๋ฌผ์ ๋จ์ผ ๊ณ์ ๊ณผ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ, ์ด๋ Post ์ธก์์ ๋ค๋์ผ ๊ด๊ณ๋ฅผ ์ค์ ํฉ๋๋ค.
Post.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package org.studyeasy.SpringStarter.models; import javax.persistence.*; import lombok.Getter; import lombok.Setter; import lombok.NoArgsConstructor; @Entity @Getter @Setter @NoArgsConstructor public class Post { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; private String title; private String content; @ManyToOne @JoinColumn(name = "account_id", referencedColumnName = "id", nullable = false) private Account account; } |
์ค๋ช :
- @ManyToOne: ์ฌ๋ฌ ๊ฒ์๋ฌผ์ด ํ๋์ ๊ณ์ ๊ณผ ์ฐ๊ด๋ ์ ์๋ ๋ค๋์ผ ๊ด๊ณ๋ฅผ ์ ์ํฉ๋๋ค.
- @JoinColumn: Post ํ ์ด๋ธ์ ์ธ๋ ํค ์ด(account_id)์ด Account ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค(id)๋ฅผ ์ฐธ์กฐํจ์ ์ง์ ํฉ๋๋ค.
- nullable = false: ๋ชจ๋ ๊ฒ์๋ฌผ์ด ๊ณ์ ๊ณผ ์ฐ๊ด๋์ด์ผ ํจ์ ๋ณด์ฅํ์ฌ account_id ์ด์ null ๊ฐ์ด ์๋๋ก ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ฒ๋ฆฌ
์ ์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ๊ด๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์๋ ๋ฐ์ดํฐ ์ด๊ธฐํ์ ๋ ๊ฐ๋ฅ์ฑ ์ ์ฝ ์ฒ๋ฆฌ๋ฅผ ํฌํจํฉ๋๋ค.
์๋ ๋ฐ์ดํฐ ์ด๊ธฐํ
์๋ ๋ฐ์ดํฐ๋ ํ ์คํธ ๋ฐ ๊ฐ๋ฐ์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด๊ธฐํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
SeedData.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package org.studyeasy.SpringStarter.config; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import org.studyeasy.SpringStarter.models.Account; import org.studyeasy.SpringStarter.repositories.AccountRepository; @Component public class SeedData implements CommandLineRunner { private final AccountRepository accountRepository; public SeedData(AccountRepository accountRepository) { this.accountRepository = accountRepository; } @Override public void run(String... args) throws Exception { Account account = new Account(); account.setPassword("password123"); account.setFirstName("John"); accountRepository.save(account); } } |
์ค๋ช :
- CommandLineRunner: ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๊ฐ ๋ก๋๋ ํ run ๋ฉ์๋๋ฅผ ์คํํ์ฌ ์ด๊ธฐ ๊ณ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ถ๊ฐํฉ๋๋ค.
- AccountRepository: Account ์ํฐํฐ์ ๋ํ CRUD ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
๋ ๊ฐ๋ฅ์ฑ ์ ์ฝ ๊ด๋ฆฌ
ํน์ ํ๋๊ฐ null์ด ์๋์ ๋ณด์ฅํจ์ผ๋ก์จ ๋ฐ์ดํฐ ์ด์์ ์๋ฐฉํ๊ณ ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํฉ๋๋ค.
Post.java์์๋ account ํ๋๊ฐ nullable = false๋ก ํ์๋์ด ์์ด ๋ชจ๋ ๊ฒ์๋ฌผ์ด ๊ธฐ์กด ๊ณ์ ๊ณผ ์ฐ๊ฒฐ๋์ด์ผ ํจ์ ๊ฐ์ ํฉ๋๋ค.
1 2 3 |
@ManyToOne @JoinColumn(name = "account_id", referencedColumnName = "id", nullable = false) private Account account; |
์ค๋ช :
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ณ์ ๊ณผ ์ฐ๊ด๋์ง ์์ ๊ฒ์๋ฌผ์ ์์ฑํ๋ ค๊ณ ์๋ํ๋ฉด ๋ ๊ฐ๋ฅ์ฑ ์ ์ฝ์ผ๋ก ์ธํด ํฌ๋์๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ฐ๋ฐ ์ค์๋ nullable = true๋ก ์ผ์์ ์ผ๋ก ์ค์ ํ์ฌ ๊ฒ์๋ฌผ์ ๊ณ์ ๊ณผ ์ฐ๊ด์ํค๋ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์คํ ๋ฐ ํ ์คํธ
๋ชจ๋ธ๊ณผ ๊ตฌ์ฑ์ด ์๋ฃ๋๋ฉด ๋ค์ ๋จ๊ณ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ณ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฑ์์ก๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์์
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํฉ๋๋ค:
1 |
./mvnw spring-boot:run |
์ค๋ช :
- ./mvnw spring-boot:run: Maven Wrapper๋ฅผ ์ฌ์ฉํ์ฌ Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๋ฉฐ, ๋ค์ํ ํ๊ฒฝ ๊ฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
H2 ์ฝ์์์ ๋ฐ์ดํฐ ๊ฒ์ฆ
Spring Boot๋ H2 ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํตํฉ๋์ด H2 ์ฝ์์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๊ณ ๊ฒ์ฆํ ์ ์์ต๋๋ค.
- H2 ์ฝ์ ์ ๊ทผ:
๋ธ๋ผ์ฐ์ ์์ http://localhost:8080/h2-console์ผ๋ก ์ด๋ํฉ๋๋ค.
- ์ฐ๊ฒฐ ์ธ๋ถ ์ฌํญ:
- JDBC URL: jdbc:h2:mem:testdb
- ์ฌ์ฉ์ ์ด๋ฆ: sa
- ๋น๋ฐ๋ฒํธ: (๋น์ ๋๊ธฐ)
- ํ
์ด๋ธ ๊ฒ์ฆ:
- Accounts ํ ์ด๋ธ: ์๋๋ ๊ณ์ ์ด id, email, password, firstName๊ณผ ํจ๊ป ํ์๋์ด์ผ ํฉ๋๋ค.
- Posts ํ ์ด๋ธ: ์ด๊ธฐ์๋ ๋น์ด ์๊ฑฐ๋ nullable = true๋ก ์ค์ ๋ ๊ฒฝ์ฐ account_id๊ฐ null์ธ ๊ฒ์๋ฌผ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
์ํ ๋ฐ์ดํฐ ๊ฒ์ฆ:
ID | Password | First Name | |
---|---|---|---|
1 | [email protected] | password123 | John |
๊ฒฐ๋ก
Spring Boot์์ ์ฌ์ฉ์ ๊ด๋ฆฌ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์ ๊ตฌ์กฐํ๋ ๊ณ์ ๋ชจ๋ธ์ ์์ฑํ๊ณ , ์ํฐํฐ ๊ฐ์ ๋ช ํํ ๊ด๊ณ๋ฅผ ์ค์ ํ๋ฉฐ, ๊ฒฌ๊ณ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ๋ณด์ฅํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด ๊ฐ์ด๋์ ๋ช ์๋ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๋ฉด ๊ฐ๋ฐ์๋ ์ฌ์ฉ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ํจ์จ์ ์ผ๋ก ํตํฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ฃผ์ ์์ฌ์ :
- ์ํฐํฐ ๊ตฌ์ฑ: ํด๋์ค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ํฐํฐ๋ก ํ์ํ๊ณ ๊ธฐ๋ณธ ํค ์์ฑ ์ ๋ต์ ์ ์ํ์ญ์์ค.
- ๊ด๊ณ ๋งคํ: @OneToMany ๋ฐ @ManyToOne๊ณผ ๊ฐ์ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ํฐํฐ ๊ฐ์ ๋ช ํํ ๊ด๊ณ๋ฅผ ์ค์ ํ์ญ์์ค.
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ: ๋ ๋ถ๊ฐ๋ฅํ ํ๋์ ๊ฐ์ ์ ์ฝ ์กฐ๊ฑด์ ์ ์ฉํ์ฌ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ์ญ์์ค.
- ์๋ ๋ฐ์ดํฐ: ํ ์คํธ ๋ฐ ๊ฐ๋ฐ์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด ์๋ ๋ฐ์ดํฐ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด๊ธฐํํ์ญ์์ค.
- ๊ฒ์ฆ: H2 ์ฝ์๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ๊ธฐ๋ฅ์ ๊ฒ์ฆํ์ญ์์ค.
SEO ํค์๋: Spring Boot ์ฌ์ฉ์ ๊ด๋ฆฌ, ๊ณ์ ๋ชจ๋ธ ์ถ๊ฐ, Spring์์ ์ผ๋๋ค ๊ด๊ณ, Spring Boot ์ํฐํฐ, Spring Boot ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ , Spring Boot์์ Lombok, JPA ๊ด๊ณ, Spring Boot H2 ์ฝ์, Spring์์ ์๋ ๋ฐ์ดํฐ, Spring Boot ํํ ๋ฆฌ์ผ
์ฐธ๊ณ : ์ด ๊ธฐ์ฌ๋ AI์ ์ํด ์์ฑ๋์์ต๋๋ค.