๐Ÿ’Ž๋ฐฑ์—”๋“œ : Backend

๐Ÿ’Ž๋ฐฑ์—”๋“œ : Backend

[SpringBoot] SpringBoot ์ •๋ฆฌ

์ƒ์„ฑ์ž injection์„ ์“ฐ๋Š”๊ฒŒ ์ข‹๋‹ค ์ƒ์„ฑ์ž injection์„ ํ•˜๋ฉด setter๋กœ entity๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š”๊ฒฝ์šฐ @Autowired๋ฅผ ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค MemberRepository๋Š” ๋ณ€๊ฒฝ๋  ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— final๋กœ ํ•ด์ฃผ๋Š”๊ฒŒ ์ข‹๋‹ค test case๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ injection์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค ( ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ) @RequiredArgsConstructor final์ด ์žˆ๋Š” ํ•„๋“œ๋งŒ์„ ๊ฐ€์ง€๊ณ  ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค ๊ฒฐ๊ตญ ์ž๋™์œผ๋กœ ์ƒ์„ฑ์ž๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  injection์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ @PersistenceContext -> @Autowired @PersistenceContext ๋ฅผ @Autowired๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Œ (SpringBo..

๐Ÿ’Ž๋ฐฑ์—”๋“œ : Backend

Spring๊ณผ SpringBoot์˜ ์ฐจ์ด

Spring์ด๋ž€? ์ •ํ™•ํ•œ ํ‘œํ˜„์œผ๋กœ๋Š” '์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ(Spring Framework) ์˜์กด์„ฑ ์ฃผ์ž…(DI) ์ œ์–ด์—ญ์ „ (IOC) ๊ด€์ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(AOP) ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์š”์†Œ ์œ„ ์š”์†Œ๋“ค์„ ํ†ตํ•ด ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ ์œ„์™€ ๊ฐ™์ด ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์œผ๋กœ ๊ฐœ๋ฐœํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์šฉ์ดํ•จ ๊ด€์ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(AOP)๋ž€? AOP๋Š” ์‰ฝ๊ฒŒ ๋งํ•ด, OOP(๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์„ ๋ณด์™„ํ•˜๋Š” ์ˆ˜๋‹จ์œผ๋กœ, ์—ฌ๋Ÿฌ ๊ณณ์— ์“ฐ์ด๋Š” ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ํ•„์š”ํ•œ ๊ณณ์— ์—ฐ๊ฒฐํ•จ์œผ๋กœ์จ ์œ ์ง€๋ณด์ˆ˜ ๋˜๋Š” ์žฌ์‚ฌ์šฉ์— ์šฉ์ดํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ AOP๋ฅผ ํ†ตํ•ด ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๋กœ์ง ์ˆ˜์ • ์—†์ด ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ ์ด๋Ÿฐ ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ํ†ตํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•จ SpringBoot๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ ์ด์œ  ์Šคํ”„๋ง์€ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„..

๐Ÿ’Ž๋ฐฑ์—”๋“œ : Backend

[Spring] @Autowired์˜ ์œ„์น˜์™€ Required์˜ต์…˜

@Autowired์˜ ์œ„์น˜ setter ์œ„ setterํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ injection์ด ์ˆ˜ํ–‰๋จ field ์œ„ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ injection์ด ์ˆ˜ํ–‰๋จ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์—†๋‹ค๋ฉด error๋ฐœ์ƒ(์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ๋ฐœ์ƒ) overload ์ƒ์„ฑ์ž ์œ„ overload ์ƒ์„ฑ์ž์—์„œ ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉ ์œ„์™€ ๊ฐ™์ดํ•˜๊ฒŒ ๋˜๋ฉด @Qualifier์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค overload์ƒ์„ฑ์ž ๊ฐ™์€ ๊ฒฝ์šฐ์— Exam์„ ๋‘ ๊ฐœ ์ด์ƒ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ! ๐Ÿ‘‡ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ์ž์— @Qualifier์„ ์„ค์ •ํ•ด์„œ ํ•ด๊ฒฐ @Autowired์˜ required ์†์„ฑ exam2๋ผ๋Š” bean์ด ์—†๋Š”๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์ด๋‹ค. required=false๋กœ ์„ค์ •์„ ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น bean์ด ์—†๋Š”..

๐Ÿ’Ž๋ฐฑ์—”๋“œ : Backend

[Spring] <context : annotation-config> vs <context : component-scan>

์™€ ์˜ ์ฐจ์ด์  ์ด๋ฏธ ๋“ฑ๋ก๋œ bean์— ๋Œ€ํ•ด์„œ๋งŒ Annotation์„ ํ™œ์„ฑํ™” ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ xml์— bean์„ ๋ฐ˜๋“œ์‹œ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค. @Autowired์™€ @Qualifier ๋‘ ๊ฐ€์ง€๋งŒ ํ•ด๊ฒฐํ•œ๋‹ค. bean์˜ ๋“ฑ๋ก์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†๋‹ค. ์Šคํ”„๋ง์ด ์•Œ์•„์„œ bean์Šค์บ”์„ ํ†ตํ•ด Annotation์„ ํ•ด์„ํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•œ๋‹ค. @Autowired์™€ @Qualifier๋ฟ๋งŒ ์•„๋‹ˆ๋ผ @Service, @Component, @Controller, @Repository ๋“ฑ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ์Šค์บ”ํ•˜๊ณ  bean์„ ์ž‘์„ฑํ•œ๋‹ค. ๋‹ค๋งŒ base-package๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง์ด ์Šค์บ”ํ•  ํŒจํ‚ค์ง€ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ด๋‘ฌ์•ผ ํ•œ๋‹ค.

๐Ÿ’Ž๋ฐฑ์—”๋“œ : Backend

[Spring]@Autowired๋™์ž‘๋ฐฉ์‹๊ณผ @Qualifier

Spring @Autowired๋Š” ์ž๋ฃŒํ˜•์„ ๊ธฐ์ค€์œผ๋กœ ์ฐพ๋Š”๋‹ค Exam๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์˜ id="exam"์„ ์ง€์› ๋‹ค. ์‹คํ–‰ํ•˜๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. ๐Ÿ“Œ @Autowired๋Š” ์ž๋ฃŒํ˜•์„ ๊ธฐ์ค€์œผ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค(๊ธฐ๋ณธ๋™์ž‘) ๋ณ€์ˆ˜๋ช…์„ ๊ธฐ์ค€์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ๋„ ํ•จ (๋ฐ‘์— ๋‚˜์˜ด) @Qualifier public class InlineExamConsole implements ExamConsole { private Exam exam; ... @Autowired @Qualifier("exam1") @Override public void setExam(Exam exam) { this.exam = exam; } } @Qualifier๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ exam1์„ Autowiredํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค. exam๊ฐ์ฒด exam1๊ณผ exam2๊ฐ€ ๋‘ ๊ฐœ ์žˆ๋‹ค..

๐Ÿ’Ž๋ฐฑ์—”๋“œ : Backend

[Spring]์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•  ๋•Œ ์žฅ์ ๊ณผ @Autowired๋ฅผ ์ด์šฉํ•œ DI

Spring โญXml->Annotation (์ถœ์ฒ˜:https://www.youtube.com/watch?v=S065KRjXRSY&list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T&index=12&t=90s) XML์„ ์ด์šฉํ•œ๋‹ค๋ฉด B2๋ฅผ B3๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์„๋•Œ ์„ค์ •ํŒŒ์ผ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  ์„ค์ •ํŒŒ์ผ๋งŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์˜ˆ์ „์—๋Š” ์ข‹์•˜์ง€๋งŒ, ์„ค์ •ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋Š”๊ฒƒ์— ๋ถˆํŽธํ•จ์„ ๋Š๋ผ๊ฒŒ ๋˜์—ˆ๋‹ค. ์†Œ์Šค์ฝ”๋“œ์— ์„ค์ •์„ ์‹ฌ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. โญ@Autowired์„ ์ด์šฉํ•œ DI (์ถœ์ฒ˜:https://www.youtube.com/watch?v=S065KRjXRSY&list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T&index=12&t=90s) ..

๐Ÿ’Ž๋ฐฑ์—”๋“œ : Backend

[Spring]์ฝœ๋ ‰์…˜ ์ƒ์„ฑ๊ณผ DI

Spring toString (์ž๋ฐ”์™€ ๊ฐ™์€) ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด๋“ค์€ ๊ฐ์ฒด์— toString์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ toString์€ ๊ทธ ๊ฐ์ฒด๋ฅผ ์„ค๋ช…ํ•ด์ฃผ๋Š” ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ดํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด์˜ toString์„ ๋ฎ์–ด์“ฐ๊ธฐ(overriding)ํ•˜๋ฉด ๋‹ค๋ฅธ ํ˜•์‹์˜ ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ž์—ด์ด ๊ธฐ๋Œ€๋˜๋Š” ๊ณณ์—์„œ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ์€ ์•”์‹œ์ ์œผ๋กœ toString์„ ํ˜ธ์ถœํ•œ๋‹ค. โญ์ˆœ์ˆ˜ java ์ฝœ๋ ‰์…˜ ์ƒ์„ฑ public class Program { public static void main(String[] args) { List exams = new ArrayList(); exams.add(new NewlecExam(1,1,1,1)); for(Exam e : exams) System.o..

๐Ÿ’Ž๋ฐฑ์—”๋“œ : Backend

[Spring]DI ์ง€์‹œ์„œ

Spring โญSpring์‚ฌ์šฉํ•˜์ง€ ์•Š์€ DI package spring.di; public class Program { public static void main(String[] args) { Exam exam = new NewlecExam(1,2,3,4); ExamConsole console = new GridExamConsole(); console.setExam(exam); // DI console.print(); } } >>> โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ total โ”‚ avg โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ 10 โ”‚ 2.50 โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜spring์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  exam์ด๋ผ๋Š” dependecy๋ฅผ ๋งŒ๋“ค์–ด์„œ console์— injectionํ•œ..

mc.thd
'๐Ÿ’Ž๋ฐฑ์—”๋“œ : Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (3 Page)