Backend๐ŸŒฑ

@RequestMapping ๋Œ€์‹  @PostMapping @GetMapping ์“ฐ๋Š” ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ–ˆ๋‹ค. ๊ตฌ๊ธ€๋ง์œผ๋กœ ์—ฌ๋Ÿฌ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐพ์•„๋ดค์ง€๋งŒ "์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ"์ด๋ผ๋Š” ์งค๋ง‰ํ•œ ๋‹ต๋ณ€์ด ๋Œ€๋ถ€๋ถ„์ด์—ˆ๋‹ค. @RequestMapping(value="๊ฒฝ๋กœ", method=RequestMethod.GET) @RequestMapping(value="๊ฒฝ๋กœ", method=RequestMethod.POST) ์ด๋ ‡๊ฒŒ ๊ธด ์ฝ”๋“œ๊ฐ€ @GetMapping("๊ฒฝ๋กœ") @PostMapping("๊ฒฝ๋กœ") ์ด๋ ‡๊ฒŒ ์งง์•„์ง„๋‹ค๋Š” ์„ค๋ช…์ด๋‹ค. ์ฐธ๊ณ ๋กœ @GetMapping๊ณผ @PostMapping ์–ด๋…ธํ…Œ์ด์…˜์€ @PutMapping, @DeleteMapping, @PatchMapping๊ณผ ํ•จ๊ป˜ ์Šคํ”„๋ง 4.3๋ถ€ํ„ฐ ๋“ฑ์žฅํ–ˆ๋‹ค. ํ‹€๋ฆฐ ๋ง์€ ์•„๋‹ˆ์ง€๋งŒ ์ด๊ฑด ์งˆ๋ฌธ..
1. REST๋ž€? "ํ•˜๋‚˜์˜ URI๋Š” ํ•˜๋‚˜์˜ ๊ณ ์œ ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋Œ€ํ‘œํ•˜๋„๋ก ์„ค๊ณ„๋œ๋‹ค." REST(Representational State Transfer) ๋ž€ ์ž์›์„ ์ด๋ฆ„(์ž์›์˜ ํ‘œํ˜„)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ(์ •๋ณด)๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ ์ž์›์˜ ํ‘œํ˜„๊ณผ ์ƒํƒœ(์ •๋ณด) ์ „๋‹ฌ์„ ํ•˜๋Š” ๊ฒƒ URI๋ฅผ ํ†ตํ•ด ์ž์›์„ ๋ช…์‹œํ•˜๊ณ , HTTP Method(GET, POST, DELETE, PUT...)๋ฅผ ํ†ตํ•ด ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„(CRUD Operation)๋ฅผ ์ ์šฉํ•˜๊ณ  ์ž์›์„ JSON, XML, TEXT ... ๋“ค ์—ฌ๋Ÿฌ ํ˜•ํƒœ์˜ ํ‘œํ˜„์œผ๋กœ ๋‚˜ํƒ€๋‚ด์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š”๋‹ค. CRUD Operation Create : ์ƒ์„ฑ(POST) Read : ์กฐํšŒ(GET) Update : ์ˆ˜์ •(PUT, PATCH) Delete : ์‚ญ์ œ(DE..
๊ฐœ๋ฐœ ๋„์ค‘ API ์˜ Request, Response ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ๋‚˜ ๋‹ค๋ฅธ ๊ณ„์ธต์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธธ ๋•Œ ๋ณ„๋„์˜ DTO ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ณ ๋ฏผ์„ ํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ๋˜ํ•œ, ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ๊ฐœ๋ฐœํ•˜๋Š” ๊ณผ์ •์—์„œ ํ˜น์€ ๊ธฐ์กด ์†Œ์Šค์—์„œ ํ™•์ธํ•ด๋ณด๋ฉด DTO ์™€ VO ๋Š” ๋‹ค๋ฅธ ๊ฐœ๋…์ด์ง€๋งŒ ์ข…์ข… ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, Entity ์™€ DTO ๋„ ํ•œ ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์ด๊ฒƒ์ด ๋ฌด์กฐ๊ฑด? ํ‹€๋ ธ๋‹ค๋ผ๊ณค ํ•  ์ˆ˜๋Š” ์—†๊ฒ ์ง€๋งŒ, ๊ฐ๊ฐ์˜ ์—ญํ• ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ ์—ญํ• ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•˜๊ณ  ์ด๊ฒƒ์ด ์ข‹์€ ์ฝ”๋“œ๋กœ ์ด์–ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๊ฐ Entity, DTO, VO ์— ๋Œ€ํ•ด ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. 1. Entity ์‹ค์ œ DB ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋Š” ํ•ต์‹ฌ ํด๋ž˜์Šค๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜๋Š” ์ปฌ๋Ÿผ๋“ค์„ ํ•„๋“œ๋กœ..
https://www.inflearn.com/questions/347511/dto-vs-class DTO vs Class - ์ธํ”„๋Ÿฐ | ์งˆ๋ฌธ & ๋‹ต๋ณ€ ์•ˆ๋…•ํ•˜์„ธ์š”! ๊ฐ•์‚ฌ๋‹˜์ œ๊ฐ€ NestJS+ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ํ—ท๊ฐˆ๋ ธ๋˜ ๋ถ€๋ถ„ ์งˆ ๋ฌธ ๋“œ๋ฆฝ๋‹ˆ๋‹ค.DTO๋ฅผ ํ†ตํ•ด์„œ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ Class๋ฅผ ์ง์ ‘ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์˜ ์ฐจ์ด๋Š” ์–ด๋–ค ์ ์ด ์žˆ์„๊นŒ์š”?Create www.inflearn.com Q ) DTO vs Class (์—”ํ‹ฐํ‹ฐ) A ) ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ์˜ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์กฐํšŒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ์กฐํšŒ ์„ฑ๋Šฅ์—์„œ ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ ์ฐ์–ด์„œ ์กฐํšŒํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•ด์„œ ํ•„๋“œ๊ฐ€ ๋งŽ๋‹ค๋ฉด ์„ฑ๋Šฅ์— ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒํ™ฉ์— ๋”ฐ๋ผ DTO๋กœ ์ง์ ‘ ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹์ด ๋” ๋‹จ์ˆœํ•œ ๊ฒฝ์šฐ๋„ ๋งŽ์Šต๋‹ˆ๋‹ค. ์• ์ดˆ..
long์€ ์›์‹œ ํƒ€์ž…(Primitive Type), Long์€ ์ฐธ์กฐ ํƒ€์ž…(Reference Type)์ด๋‹ค ๐ŸŒฑ์›์‹œ ํƒ€์ž…(Primitive Type) ์ •์ˆ˜, ์‹ค์ˆ˜, ๋ฌธ์ž, ๋…ผ๋ฆฌ ๋ฆฌํ„ฐ๋Ÿด ๋“ฑ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์ง์ ‘ ์ €์žฅํ•˜๋Š” ํƒ€์ž…์œผ๋กœ์„œ boolean, char, byte, short, int, long, float, double๋ฅผ ๋งํ•œ๋‹ค. ๐ŸŒฑ์ฐธ์กฐ ํƒ€์ž…(Reference Type) ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํƒ€์ž…์œผ๋กœ์„œ ์›์‹œ ํƒ€์ž…์„ ์ œ์™ธํ•œ ๋ฌธ์ž์—ด, ๋ฐฐ์—ด, enum, ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งํ•œ๋‹ค. ์›์‹œ ํƒ€์ž…(Primitive Type)์€ null ํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค ์›์‹œ ํƒ€์ž…๊ณผ ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์  ์ค‘ ํ•˜๋‚˜๋Š” ์›์‹œ ํƒ€์ž…์€ null๋กœ ์ง€์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ฐธ์กฐ ..
์Šคํ”„๋ง MVC์—์„œ๋Š” MultipartResolver๋ฅผ ์„ค์ •ํ•˜๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์–ด์˜ค๋Š” Multipart ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ๋Š” ๊ธฐ๋ณธ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์œผ๋กœ ๋“ฑ๋กํ•ด ์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค! ์—…๋กœ๋“œ 1. application.properties ์ž‘์„ฑ spring.servlet.multipart.max-file-size=1MB spring.servlet.multipart.max-request-size=10MB file.dir=D:/test/ max-file-size : ํŒŒ์ผ ํ•˜๋‚˜์˜ ์ตœ๋Œ€์‚ฌ์ด์ฆˆ ์„ค์ •, ์•„๋ฌด๋Ÿฐ ์„ค์ •์„ ์•ˆํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์ด 1MB์ด๋‹ค. max-request-size : Multipart ์š”์ฒญ ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ์ „์ฒด ํ•ฉ์˜ ํฌ๊ธฐ๋ฅผ ..
# ์š”์•ฝ ์ž๋ฃŒํ˜•์ด String์ผ ๊ฒฝ์šฐ remove(String๊ฐ’) ์ž…๋ ฅ์‹œ ๊ฐ’์œผ๋กœ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  remove(์ •์ˆ˜๊ฐ’) ์ž…๋ ฅ์‹œ ์ธ๋ฑ์Šค๋กœ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค ๊ทธ๋ ‡๋‹ค๋ฉด ์ž๋ฃŒํ˜•์ด Integer์ผ ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€? remove(Integer๊ฐ’) ์ž…๋ ฅ์‹œ ์ธ๋ฑ์Šค ์‚ญ์ œ๋กœ ์ธ์‹ํ•œ๋‹ค ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ’์œผ๋กœ ์–ด๋–ป๊ฒŒ ์‚ญ์ œํ•˜๋Š”๊ฐ€?! list.remove(list.indexOf(๊ฐ’)) ์„ ์ž…๋ ฅํ•˜๋ฉด ์ตœ์ดˆ์˜ "๊ฐ’"์ด ๋‚˜์˜ค๋Š” ์œ„์น˜์—์„œ ์‚ญ์ œ๊ฐ€ ๋œ๋‹ค ๋‚ด ํฌ์ŠคํŒ… ์ฐธ์กฐ : https://jaewonna.tistory.com/180 ArrayList.remove() - ์ธ๋ฑ์Šค remove() ๋ฉ”์„œ๋“œ์— ์ง€์ •๋œ ์œ„์น˜(์ธ๋ฑ์Šค)๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์œ„์น˜์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋’ค์— ์žˆ๋Š” ์š”์†Œ๋Š” ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. remove() ๋ฉ”์„œ๋“œ๋Š” ์‚ญ์ œ๋œ ์š”์†Œ๋ฅผ ..
Entity์— Boolean ํƒ€์ž… ์„ ์–ธ @Column(columnDefinition = "tinyint(1) default 1") private boolean status; Entity์— Boolean ํƒ€์ž…์„ ์„ ์–ธ ํ›„ @Getter๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํƒ€์ž…์ฒ˜๋Ÿผ get์„ ์‚ฌ์šฉํ•˜๋‹ˆ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋กฌ๋ณต ๋ฌธ์„œ๋ฅผ ๋”ฐ๋ฅด๋ฉด, A default getter simply returns the field, and is named getFoo if the field is called foo (or isFoo if the field's type is boolean). https://projectlombok.org/features/GetterSetter boolean ํƒ€์ž…์ผ ๊ฒฝ์šฐ is๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค. g..
Java ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋Š” ๋ฌด์—‡์ผ๊นŒ?? ๋ฐ”๋กœ NullPointException ์ž…๋‹ˆ๋‹ค. ์ด Exception์„ ์ตœ๋Œ€ํ•œ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” Optional์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Java 8๋ถ€ํ„ฐ Null์ฒ˜๋ฆฌ๋กœ Optional์ด ๋‚˜์™”๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ธฐ๋Œ€ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด์ ธ ๋ง์ด ๋งŽ์•˜๋‹ค.... NullPointException๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ๋ฐฉ์–ดํ•ด๋‚ผ ๊ฒƒ์ด๋ผ๋Š” ์˜ˆ์ƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๊ตฌ๋ฉ์ด ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. Optional์˜ get()๊ฐ™์€.. ๊ทธ๋ž˜์„œ ์ฃผ์˜์‚ฌํ•ญ์ด 26๊ฐ€์ง€๊ฐ€ ๋œ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ์ฃผ์˜์‚ฌํ•ญ์— ๋‹ค๋ฃจ๊ธฐ ์ „์— Optional์ด ๋ฌด์—‡์ธ์ง€, ์–ด๋–ค ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐ŸŒฑOptional์ด๋ž€? T ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ Wrapperํ•˜๋Š” Wrapper ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋ฉด..
Spring Data JPA ์‚ฌ์šฉ ์‹œ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์˜ ๋ฆฌํ„ด ํƒ€์ž…์„ Optional๋กœ ์„ค์ •.โ€‹ ifPresent๋ฅผ ํ†ตํ•ด null์ฒดํฌ๋ฅผ ํ•จ์œผ๋กœ ์ธํ•ด ์ฝ”๋“œ์–‘์„ ์ค„์ด๊ณ  ์ข€ ๋” ์ง๊ด€์ ์œผ๋กœ ์†Œ์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 1. isEmpty() ์‚ฌ์šฉ Optional test = testRepository.findById("์•„์ด๋””"); if(!test.isEmpty()){ //test๊ฐ€ null์ด ์•„๋‹ ๊ฒฝ์šฐ ํ”„๋กœ์„ธ์Šค }); 2. ifPresent ์‚ฌ์šฉ Optional test = testRepository.findById("์•„์ด๋””"); test.ifPresent(a->{ //test๊ฐ€ null์ด ์•„๋‹ ๊ฒฝ์šฐ ํ”„๋กœ์„ธ์Šค });
JaeStory
'Backend๐ŸŒฑ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก