๋ชฉ๋กBack-end (35)

DevLog ๐Ÿ˜ถ

[JPA] @OneToMany ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘ ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ JPA์—์„œ @OneToMany ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘๋ณด๋‹ค๋Š” ๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ ๋งคํ•‘์„ ๊ถŒ์žฅํ•œ๋‹ค๋Š” ๋ง์„ ๋ณด์•˜์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ, ๊ฐ์ฒด์ง€ํ–ฅ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์„ค๊ณ„ํ•˜๋‹ค ๋ณด๋ฉด ๋‹ค๋Œ€์ผ์˜ ์ƒํ™ฉ๋ณด๋‹ค๋Š” 1์ธ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ N์ธ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ๋งŽ๊ณ , (์ ์–ด๋„ ๋‚ด ๊ฒฝํ—˜์—์„œ๋Š” ๊ทธ๋žฌ๋‹ค) N์ธ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๊ตณ์ด 1์ธ ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ชฐ๋ผ๋„ ๋๋˜ ์ ์ด ๋งŽ์•˜๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ผ๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘์„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ, ์™œ ๊ทธ๋žฌ๋˜ ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•ด์„œ ๋‚˜๋ฆ„๋Œ€๋กœ ์‹คํ—˜์„ ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. (ex. ๊ฒŒ์‹œ๊ธ€๊ณผ ๊ฒŒ์‹œ๊ธ€ ์ด๋ฏธ์ง€์˜ ๊ด€๊ณ„์—์„œ, ๊ฒŒ์‹œ๊ธ€ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒŒ์‹œ๊ธ€ ์ •๋ณด๋ฅผ ์ฐพ์•„์˜ค๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๊ฒŒ์‹œ๊ธ€์„ ๊ธฐ์ค€์œผ๋กœ ๊ฒŒ์‹œ๊ธ€ ์ด๋ฏธ์ง€ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒŒ ๋” ๋งŽ์•˜์Œ) ๐ŸŒฑ ๊ธฐ๋ณธ ์—”ํ‹ฐํ‹ฐ ์„ค๊ณ„ํ•˜๊ธฐ @Entity class Board( @Id @..

Back-end/JPA 2023. 7. 16. 20:13
[JPA] CascadeType.REMOVE vs orphanRemoval=true ์ฐจ์ด์  ์•Œ์•„๋ณด๊ธฐ - 1ํŽธ

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ JPA๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ CascadeType.REMOVE์™€ orphanRemoval = true ์˜ต์…˜์— ๋Œ€ํ•ด์„œ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ์ œ๋Œ€๋กœ ์ธ์ง€ํ•œ ์ ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์„œ, ์ด๋ฒˆ์— ๊ณต๋ถ€ํ•  ๊ฒธ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๋ฉฐ ๋‘ ์˜ต์…˜์˜ ์ฐจ์ด๋ฅผ ๊ณต๋ถ€ํ•ด๋ณด์•˜๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด Cascade ์˜ต์…˜์€ ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ์™€ ์ž์‹ ์—”ํ‹ฐํ‹ฐ์˜ ์˜์† ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๊ณ , orphanRemoval์€ ์กฐ๊ธˆ ๋” ์„ธ๋ถ€์ ์œผ๋กœ ๊ณ ์•„ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ด€๋ฆฌ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ ์ผ€์ŠคํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ฉฐ ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด์ž. ๐ŸŒฑ ์—”ํ‹ฐํ‹ฐ ์„ธํŒ…ํ•˜๊ธฐ 1:N ๊ด€๊ณ„๋ฅผ ๋‹ด๋‹นํ•ด์ค„ '์ฝ˜์„œํŠธ' ์—”ํ‹ฐํ‹ฐ์™€ '์ฝ˜์„œํŠธ ํ‹ฐ์ผ“' ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค. ๋‘˜ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋Š” ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์„ค์ •ํ•˜์˜€์œผ๋ฉฐ, ํ•˜๋‚˜์˜ ์ฝ˜์„œํŠธ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฝ˜์„œํŠธ ํ‹ฐ์ผ“์„ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜์˜€..

Back-end/JPA 2023. 6. 29. 23:58
[Spring] Rest-docs ์—ฐ๋™ํ•˜๊ธฐ (version 3.3.2)

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์‚ฌ์‹ค rest-docs๋Š” ๋ฏธ์…˜ ์š”๊ตฌ์‚ฌํ•ญ์€ ์•„๋‹ˆ์—ˆ์ง€๋งŒ, ๊ฐœ์ธ์ ์ธ ์š•์‹ฌ์œผ๋กœ ํ•œ ๋ฒˆ ์ง์ ‘ ๊ตฌ์ถ•ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์–ด์„œ ๋ฏธ์…˜ํ•˜๋Š” ๊น€์— ํ•จ๊ป˜ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. (์–ด์ฐจํ”ผ ์ถ”ํ›„ ๋ฏธ์…˜ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ”„๋ก ํŠธ ํฌ๋ฃจ์™€ ํ˜‘์—…ํ•˜๊ฒŒ ๋˜๋ฉด ์„ธํŒ…ํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ...) RestDocs๋ฅผ ์—ฐ๋™ํ•  ๋•Œ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ ๋ ˆ๋ฒจ์—์„œ ์ง„ํ–‰ํ• ์ง€ (RestAssured) ์•„๋‹ˆ๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ ์ง„ํ–‰ํ• ์ง€ ๊ณ ๋ฏผํ–ˆ์—ˆ๋Š”๋ฐ, RestAssured๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด BDD ์Šคํƒ€์ผ์ด๋ผ ๋” ์ง๊ด€์ ์ผ ๊ฒƒ ๊ฐ™๊ธด ํ•˜์ง€๋งŒ ์•„๋ฌด๋ž˜๋„ ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค ๋ณด๋‹ˆ๊นŒ ๊ทธ๋ƒฅ ์ปจํŠธ๋กค๋Ÿฌ ๋ ˆ์ด์–ด์—์„œ ์ง„ํ–‰ํ–ˆ๋‹ค. (์‹ค์ œ๋กœ๋„ ์ปจํŠธ๋กค๋Ÿฌ ๋ ˆ๋ฒจ์—์„œ ๋งŽ์ด ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.) โœ”๏ธ Rest-docs๊ฐ€ ์–ด๋–ค ๊ฑฐ์ง€? Spring Rest Docs๋Š” Restful ์„œ๋น„์Šค์— ๋Œ€ํ•ด ์ •ํ™•ํ•˜๊ณ ..

Back-end/Spring 2023. 5. 22. 13:56
[JPA] OSIV ์ฐ๋จนํ•˜๊ธฐ 2ํŽธ - ์ค€์˜์† ์ƒํƒœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ง€์—ฐ ๋กœ๋”ฉํ•˜๊ธฐ (FetchType.EAGER์™€ N+1 ๋ฌธ์ œ, fetch join)

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ์ง€์—ฐ ๋กœ๋”ฉํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ–ˆ๋‹ค. ์ด๋Š”, ์ง€์—ฐ ๋กœ๋”ฉ์„ ์œ„ํ•œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๊ด€๋ฆฌ ๋ฒ”์œ„์—์„œ ๋ฒ—์–ด๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, ์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ? ๐ŸŒฑ ๊ธ€๋กœ๋ฒŒ ํŽ˜์น˜ ์ „๋žต์„ LAZY์—์„œ EAGER๋กœ ์ˆ˜์ •ํ•˜๊ธฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ , ์ฆ‰์‹œ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜์ž๋Š” ๊ฒƒ์ด๋‹ค ๐Ÿ˜… @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Crew { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private ..

Back-end/JPA 2023. 5. 21. 19:22
[JPA] OSIV ์ฐ๋จนํ•˜๊ธฐ 1ํŽธ - ํ”„๋ก์‹œ ๊ฐ์ฒด์™€ ์ค€์˜์† ์ƒํƒœ ์—”ํ‹ฐํ‹ฐ

๊ธˆ์š”์ผ์— ๊ทผ๋กœํ•˜๋ฉด์„œ ๊ตฌ๊ตฌ์™€ ๊ทผ๋กœ ํฌ๋ฃจ๋“ค์˜ ๋„์›€ ๋•๋ถ„์— JPA๋ฅผ ๋‹ค์‹œ๊ธˆ ๊ณต๋ถ€ํ•˜๊ฒŒ ๋๋‹ค ๐Ÿ˜… ๋‚˜๋„ ์™„์ „ํ•˜๊ฒŒ ์ž˜ ์•„๋Š” ๋‚ด์šฉ์€ ์•„๋‹Œ์ง€๋ผ ์•„๋Š”๋Œ€๋กœ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ๐ŸŒฑ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ํŠธ๋žœ์žญ์…˜ ๐Ÿ’ก ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€? ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†ํ™”์‹œํ‚ค๋Š” ํ™˜๊ฒฝ. EntityManager๋ฅผ ํ†ตํ•ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๋ฉด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ณด๊ด€๋œ ์—”ํ‹ฐํ‹ฐ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. EntityManager ์ƒ์„ฑ ์‹œ 1๊ฐœ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๐Ÿ’ฌ ํŠน์ง• - ์‹๋ณ„์ž ๊ฐ’์œผ๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค. - ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ์ ์— flush. (์“ฐ๊ธฐ ์ง€์—ฐ - ๋‚ด๋ถ€ ์ฟผ๋ฆฌ ์ €์žฅ์†Œ์— SQL ์ €์žฅ ํ›„ ํ•œ ๋ฒˆ์— ํ”Œ๋Ÿฌ์‹œ) - 1์ฐจ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (์ฒ˜์Œ์— 1์ฐจ ์บ์‹œ์—์„œ ์—”ํ‹ฐํ‹ฐ ์กฐํšŒ > ์—†์œผ๋ฉด DB ์กฐํšŒ > 1์ฐจ ์บ์‹œ์— ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ = '์˜์†ํ™”') - ..

Back-end/JPA 2023. 5. 21. 16:44
[Spring] ์Šคํ”„๋ง ํ…Œ์ŠคํŠธ - ํ…Œ์ŠคํŠธ ์ปจํ…์ŠคํŠธ ์บ์‹ฑ, @SpringBootTest, @WebMvcTest

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์ด์ „ ํฌ์ŠคํŒ…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šคํ„ฐ๋””์—์„œ ๋งก์€ 'ํ…Œ์ŠคํŠธ' ํŒŒํŠธ์— ๋Œ€ํ•ด์„œ ๋ธ”๋กœ๊ทธ์— ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค ๐Ÿ˜Š ํ…Œ์ŠคํŠธ ์ชฝ์€ ๊ณต์‹ ๋ฌธ์„œ๋„ ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ€๋…์„ฑ์ด ๋„ˆ๋ฌด ์•ˆ ์ข‹์•„์„œ ์ตœ๋Œ€ํ•œ ๊ฐ„๋žตํ•˜๊ฒŒ๋งŒ ํ›‘์–ด๋ณด์•˜๋‹ค. ์•„์ง ๋ชจ๋ฅด๋Š” ๊ฒŒ ์ •๋ง ๋งŽ์€ ๊ฒƒ ๊ฐ™๋‹ค ใ…Žใ…Ž ๐ŸŒฑ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ vs ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด, ์™ธ๋ถ€ ์ž‘์—…๋“ค๊ณผ ์—ฐ๊ด€๋˜์–ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์™ธ๋ถ€ ์ž‘์—…๋“ค์„ ํฌํ•จํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ž˜ ๋Œ์•„๊ฐ€๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, @SpringBootTest ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•˜์—ฌ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋งŽ๋‹ค. (๊ด€๋ จ๋œ ๋ชจ๋“  ๋นˆ์„ ๊ฐ€์ ธ์™€์„œ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๋Š๋‚Œ) ๋ฐ˜๋ฉด, ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋งž์ถฐ ์ˆ˜ํ–‰ํ•˜๋Š” ํ…Œ์ŠคํŠธ์ด๋‹ค. ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ์˜ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ E2E ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ฃผ์–ด์ง„ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ..

Back-end/Spring 2023. 5. 8. 00:50
[Spring] IoC Container์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ DI, ๋นˆ ์Šค์ฝ”ํ”„, ๋นˆ๊ณผ ์Šคํƒœํ‹ฑ ๋ฉ”์„œ๋“œ

๐ŸŒฑ ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ์Šคํ„ฐ๋””์—์„œ ๋ฐœํ‘œ ์ž๋ฃŒ๋กœ ์ค€๋น„ํ–ˆ๋˜ ๋‚ด์šฉ์ธ๋ฐ, ๋ธ”๋กœ๊ทธ์—๋„ ์˜ฎ๊ฒจ๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ ์ •๋ฆฌํ•˜๋Š” ๊ธ€ ๐Ÿ˜Š ํ”„๋กค๋กœ๊ทธ ๋กœ๋“œ๋งต์˜ ํ‚ค์›Œ๋“œ ์œ„์ฃผ๋กœ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค! ๐ŸŒฑ DI (์˜์กด๊ด€๊ณ„ ์ฃผ์ž…) โœ”๏ธ ์˜์กดํ•œ๋‹ค? A๊ฐ€ B๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , B๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด A์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ๊ด€๊ณ„. ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์€ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•œ๋‹ค. - ํด๋ž˜์Šค ๋ชจ๋ธ์ด๋‚˜ ์ฝ”๋“œ์—๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ์ ์˜ ์˜์กด๊ด€๊ณ„๊ฐ€ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋„๋ก, ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์˜์กดํ•ด์•ผ ํ•œ๋‹ค. - ๋Ÿฐํƒ€์ž„ ์‹œ์ ์˜ ์˜์กด๊ด€๊ณ„๋Š” ์ปจํ…Œ์ด๋„ˆ๋‚˜ ํŒฉํ„ฐ๋ฆฌ์™€ ๊ฐ™์€ ์ œ 3์˜ ์กด์žฌ (ex. IoC container)๊ฐ€ ๊ฒฐ์ •ํ•œ๋‹ค. - ์˜์กด๊ด€๊ณ„๋Š” ์‚ฌ์šฉํ•  ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์™ธ๋ถ€์—์„œ ์ œ๊ณตํ•ด์คŒ์œผ๋กœ์„œ ๋งŒ๋“ค์–ด์ง„๋‹ค. โœ”๏ธ DI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌด์—‡์ด ์ข‹์€๊ฐ€? - ๊ฐ์ฒด๊ฐ„์˜ ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ → ์žฌ์‚ฌ์šฉ์„ฑ, ์œ ์ง€๋ณด..

Back-end/Spring 2023. 5. 7. 18:19