๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธdevelop/Springboot

[Springboot] 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ๋„์ „๊ธฐ #3. Create(์—”ํ‹ฐํ‹ฐ๋กœ DB ์ €์žฅํ•˜๊ธฐ)

by ํ‚ํ‚์ž‰ 2025. 1. 11.

๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. DB ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ๋Š” MySQL, ์˜ค๋ผํด, ๋งˆ๋ฆฌ์•„ DB ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ ์ด๋ฒˆ ์‹ค์Šต์—์„œ๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ ๋ฐ›์€ H2 DB๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

JPA

Java Persistence API

 

DB๋Š” SQL(Structured Query Language)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Java๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ JPA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DB์— Java๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

JPA๋Š” ์ž๋ฐ” ์–ธ์–ด๋กœ DB์— ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ๋„๊ตฌ๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

 

JPA์˜ ํ•ต์‹ฌ ๋„๊ตฌ

์—”ํ‹ฐํ‹ฐ

์ž๋ฐ” ๊ฐ์ฒด๋ฅผ DB๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“  ๊ฒƒ์œผ๋กœ, ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•œ๋‹ค.

 

๋ฆฌํŒŒ์ง€ํ„ฐ๋ฆฌ

์—”ํ‹ฐํ‹ฐ๊ฐ€ DB ์† ํ…Œ์ด๋ธ”์— ์ €์žฅ ๋ฐ  ๊ด€๋ฆฌ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

 

์‹ค์Šต

JPA ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์•Œ์•˜์œผ๋‹ˆ, ์‹ค์Šต์„ ํ†ตํ•ด DTO๋กœ ๋งŒ๋“  ํผ ๋ฐ์ดํ„ฐ๋ฅผ DB์— ์ €์žฅํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์‹ค์Šตํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1. DTO๋ฅผ ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

ArticleController.java ํŒŒ์ผ์—์„œ ์‹ค์Šต์„ ์ด์–ดํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

DTO๋ฅผ ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” form ๊ฐ์ฒด์˜ toEntity()๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ทธ  ๋ฐ˜ํ™˜๊ฐ’์„ Article ํƒ€์ž…์˜ article ์—”ํ‹ฐํ‹ฐ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Article ํด๋ž˜์Šค์™€ toEntity() ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ’กDTO๋ฅผ ์—”ํ‹ฐํ‹ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

 

๋นจ๊ฐ„์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋œ Article์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๊ณ  alt + Enter ์‹œ ๋ฉ”๋‰ด ์„ ํƒํ•˜์—ฌ ํด๋ž˜์Šค ์ƒ์„ฑ ๊ฐ€๋Šฅ

 

Article ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ

Create Class Article ์ฐฝ์—์„œ, ํŒจํ‚ค์ง€ ์ƒ์„ฑ ์œ„์น˜๋ฅผ controller->entity๋กœ ์ˆ˜์ • ํ›„, OK ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด entity ํŒจํ‚ค์ง€๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ๋‚ด๋ถ€์— Article ํด๋ž˜์Šค๊ฐ€ ํ•จ๊ป˜ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

entity ํŒจํ‚ค์ง€์™€ Article ํด๋ž˜์Šค ์ƒ์„ฑ

 

Article ํด๋ž˜์Šค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค๋‹ˆ๋‹ค.

 

1. Article ํด๋ž˜์Šค๊ฐ€ ์—”ํ‹ฐํ‹ฐ์ž„์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด @Entity ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ž…๋‹ˆ๋‹ค.

2. title, content ํ•„๋“œ๋ฅผ ์„ ์–ธํ•˜๊ณ , DB์—์„œ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก @Column ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ž…๋‹ˆ๋‹ค. 

3. ์—”ํ‹ฐํ‹ฐ์˜ ๋Œ€ํ‘œ๊ฐ’์ด ๋  id๋ฅผ ์„ ์–ธํ•˜๊ณ , @Id ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ž…๋‹ˆ๋‹ค. @GeneratedValue ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€ํ‘ฏ๊ฐ’์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ๊ฐ’์€ ์‹๋ณ„์„ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์ด์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, Entity์˜ id, title, content ํ•„๋“œ๊ฐ€ DB์˜ ๊ฐ ์—ด๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค

 

4. Article ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•ด ์ƒ์„ฑ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. content ํ•„๋“œ ์•„๋ž˜์— ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ ํด๋ฆญ ํ›„, Generate->Constructor์„ ์„ ํƒ, id: Long, title: String, content: String์„ ๋ชจ๋‘ ์„ ํƒํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

5. ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ ํด๋ฆญ ํ›„, Generate->toString()์„ ์„ ํƒํ•˜์—ฌ ์œ„์™€ ๋™์ผํ•œ ํ•ญ๋ชฉ๋“ค์„ ๋ชจ๋‘ ์„ ํƒํ•œ ํ›„, ํ™•์ธํ•˜์—ฌ toString ๋ฉ”์„œ๋“œ๋„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

 

ArticleController๋กœ ๋Œ์•„๊ฐ€์„œ ๋ณด๋ฉด, Article์˜ ์˜ค๋ฅ˜ ํ‘œ์‹œ๊ฐ€ ์‚ฌ๋ผ์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ๋Š” toEntity() ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

toEntity() ๋ฉ”์„œ๋“œ ๋งŒ๋“ค๊ธฐ

toEntity() ๋ฉ”์„œ๋“œ๋Š” DTO์ธ form ๊ฐ์ฒด๋ฅผ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

1. Create method 'toEntity' in 'ArticleForm'์„ ํด๋ฆญํ•˜๋ฉด, ArticleForm์ด ์—ด๋ฆฌ๋ฉด์„œ toEntity() ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

2. toEntity() ๋ฉ”์„œ๋“œ์—์„œ๋Š” ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ DTO ๊ฐ์ฒด๋ฅผ ์—”ํ‹ฐํ‹ฐ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ „๋‹ฌ๊ฐ’์€ Article ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ํ˜•์‹์— ๋งž๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. 

 

2. ๋ฆฌํŒŒ์ง€ํ„ฐ๋ฆฌ๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ DB์— ์ €์žฅ

๋ฆฌํŒŒ์ง€ํ„ฐ๋ฆฌ๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ DB์— ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

1. articleRepository.save() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ article ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

2. save() ๋ฉ”์„œ๋“œ๋Š” ์ €์žฅ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ด๋ฅผ Article ํƒ€์ž…์˜ saved ๊ฐ์ฒด์—์„œ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜์—†์ด ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” articleRepository ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋นจ๊ฐ„ ์˜ค๋ฅ˜๋“ค์„ ์žก๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฆฌํŒŒ์ง€ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋ฆฌํŒŒ์ง€ํ„ฐ๋ฆฌ ๋งŒ๋“ค๊ธฐ

1. repository๋ผ๋Š” ์ด๋ฆ„์˜ ์ƒˆ๋กœ์šด ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.

2. ArticleRepository๋ผ๋Š” ์ด๋ฆ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

3. ๋ฆฌํŒŒ์ง€ํ„ฐ๋ฆฌ๋Š” JPA์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฆฌํŒŒ์ง€ํ„ฐ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ArticleRepository ๋‹ค์Œ์— extends Crud๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ƒ์„ฑ๋˜๋Š” ํŽผ์นจ ๋ชฉ๋ก์—์„œ CrudRepository<T, ID>๋ฅผ ์„ ํƒํ•˜์—ฌ, CrudRepository๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์Šต๋‹ˆ๋‹ค.

 

๐Ÿ’กCrudRepository๋Š” JPA์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์ด๋ฅผ ์ƒ์†ํ•ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4. CrudRepository์— <> ๋ฅผ ๋ถ™์ด๊ณ , ๊ทธ ์•ˆ์— 2๊ฐœ์˜ ์ œ๋„ค๋ฆญ ์š”์†Œ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ ๊ด€๋ฆฌ ๋Œ€์ƒ ์—”ํ‹ฐํ‹ฐ์˜ ํด๋ž˜์Šค ํƒ€์ž…, ๊ด€๋ฆฌ ๋Œ€์ƒ ์—”ํ‹ฐํ‹ฐ์˜ ๋Œ€ํ‘œ๊ฐ’ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ๋ณธ ์‹ค์Šต์—์„œ๋Š” Article, Long์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

5. ์—ฌ๊ธฐ๊นŒ์ง€ ์ž‘์„ฑํ•˜๋ฉด CrudRepository์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋ณ„๋„ ์ •์˜ ์—†์ด, ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฐ์ฒด ์ฃผ์ž…ํ•˜๊ธฐ

์Šคํ”„๋ง๋ถ€ํŠธ์—์„œ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•„๋„, ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ๋‹ค ์—ฐ๊ฒฐํ•ด์ค๋‹ˆ๋‹ค.

 

 ๐Ÿ’ก@Autowired๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ๋งŒ๋“ค์–ด๋†“์€ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€ ์ฃผ์ž…ํ•ด์ฃผ๋ฉฐ, ์ด๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

์˜ค๋ฅ˜ ํ•ด๊ฒฐ

๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š”์ง€ ํ™•์ธ์„ ์œ„ํ•ด ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋‹ˆ ์•„๋ž˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๋ฌธ์ œ์˜ ์›์ธ์€ jenkins...jenkins ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ตํž ๋•Œ localhost:8080 ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๊ทธ๊ฒŒ ์•„์ง ์‚ฌ์šฉ ์ค‘์ธ ์ƒํƒœ์˜€๋‚˜๋ด…๋‹ˆ๋‹ค. ์Šคํ”„๋ง๋ถ€ํŠธ ์‹คํ–‰ ํฌํŠธ๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜, jenkins๋ฅผ ๊บผ์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ jenkins๋ฅผ ๋„๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

jenkins ์•„์›ƒ

์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•ด๋ณด๋ฉด ์ž˜ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค๐Ÿ‘๐Ÿ‘