๐Ÿ“• Spring Framework/Spring Project

๋ฆฌํŒฉํ† ๋ง ๊ณ„ํš

GroovyArea 2022. 7. 28. 16:00
์˜ค๋žœ๋งŒ์— ๋ธ”๋กœ๊ทธ์— ๊ธ€์„ ์“ด๋‹ค. 

์ง€๋‚œ ๋ฉฐ์น  ๋™์•ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด AWS ๋ง๊ตฌ์„ฑ์„ ํ•˜๊ณ , ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋ฉฐ ๋ฐฐํฌ๊นŒ์ง€ ์‹œ์ผฐ๋‹ค. 
๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์•ž๋‘๊ณ , ์ข‹์€ ๊ธฐํšŒ๋ฅผ ์–ป์–ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ฒŒ ๋˜์—ˆ๋‹ค. 

๊ฒฐ๋ก ์€, ์ด ์ƒํƒœ๋กœ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ์—†์„ ์ •๋„๋กœ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ ์•„์‰ฌ์šด ์ฝ”๋“œ ์ž‘์„ฑ ๋ถ€๋ถ„๋„ ๋งŽ์•˜๊ณ , ๊ถ๊ธˆ์ฆ๋„ ๋งŽ์•˜์ง€๋งŒ, ๋‚˜๋จธ์ง€ ์ฃผ๊ด€์ ์ธ ํŒ๋‹จํ•˜์— ๊น”๋”ํ•œ ๋ถ€๋ถ„์€ ๋‚˜๋ฆ„ ๊ดœ์ฐฎ๊ฒŒ ์ž‘์„ฑ์„ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋‹ค. 

์•„์ง ๊ณ ์น ๊ฒŒ ๋งŽ์•˜๊ณ , ๋ฐฐ์šธ๊ฒŒ ๋งŽ์•˜๊ณ , ๋ชฐ๋ž๋˜ ๊ฒƒ์ด ๋งŽ์€ ๋‚˜์˜€๋‹ค. ์ด๋Ÿฐ ๋ฆฌ๋ทฐ๋ฅผ ๋“ค์„ ๋•Œ๋งˆ๋‹ค ๋‚˜๋Š” ์•„์ง ํ•œ์ฐธ ๋ฉ€์—ˆ๊ตฌ๋‚˜. 

๊ณต๋ถ€ ๊ธฐ๊ฐ„ ๋Œ€๋น„ ๋งŽ์€ ์„ฑ์žฅ์„ ๊ฑฐ๋‘์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๋‚ด๊ฐ€ ์š•์‹ฌ์ด ๋งŽ์€ ๊ฑด์ง€. 
์‚ฌ์‹ค์€ ๊ธฐ๊ฐ„ ๋Œ€๋น„ ์„ฑ์žฅ์น˜๊ฐ€ ํ‰๊ท ์น˜์˜€๋˜ ๊ฑด์ง€.

๋ฌด๊ธฐ ํ•ด์ง„๋‹ค.

๋„ˆ๋ฌด ๊ธ‰ํ•œ๊ฐ€?
๊ทธ๋Ÿผ์—๋„ ๋นจ๋ฆฌ ์ทจ์—…ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ๋‹ค. ๋‚  ๋” ์ชผ์•„์•ผ ๋  ๊ฒƒ์ด๋‹ค. ์–ด์ฉ” ์ˆ˜ ์—†๋‹ค.

์ข‹์€ ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒผ๋‹ค. ๊ณ ๋ฏผํ•˜๋А๋ผ ๋จธ๋ฆฌ๊ฐ€ ๊นจ์งˆ ๊ฒƒ ๊ฐ™๋‹ค. 
๋” ์ข‹์€ ๋ถ€๋ถ„์„ ์ด์„ฑ์ ์œผ๋กœ ์ถ”๋ ค ๋น„๊ตํ•˜๋Š” ๊ณผ์ œ๊ฐ€ ์Šค์Šค๋กœ์—๊ฒŒ ์ฃผ์–ด์กŒ๋‹ค. 

Module ๊ด€๋ จ

๋ชจ๋“ˆ ์ด๋ฆ„์ด module-common์œผ๋กœ ์ง€์€ ์ด์œ 

 

> ํ•ด๋‹น ๋ชจ๋“ˆ์€ ๋ชจ๋†€๋ฆฌ์‹์œผ๋กœ ๋˜์–ด์žˆ๋Š”๋ฐ, ๋ณดํ†ต ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์˜ ์ด๋ฆ„์ด common์ด๋ผ ํ•œ๋‹ค. ์‚ฌ์šฉ์ฒ˜์— ๋งž๊ฒŒ ์ด๋ฆ„์„ ๊ณ ๋ฏผํ•ด๋ด์•ผ ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

> ๋ชจ๋“ˆ์„ ๋‚˜๋ˆˆ ์ด์œ ๋Š” MSA ํ™˜๊ฒฝ์„ ๊ณ ๋ คํ•ด ๋ณธ ๊ฒƒ์ด ์ œ์ผ ํฌ๋‹ค. 

๋ณธ ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ์žˆ์„ ๋•Œ ์ด๋ฉ”์ผ ์ „์†ก ๊ธฐ๋Šฅ์€ ์žฅ์•  ๊ฒฉ๋ฆฌ๋ฅผ ์‹œํ‚ค๊ฒŒ ์œ„ํ•ด ๋ณ„๊ฐœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ์„ ๊ณ ์•ˆํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

> ๊ฒฐ๋ก ์ ์œผ๋กœ ๊ธฐ๋Šฅ ๋ณ„๋กœ ๋ชจ๋“ˆํ™”๋ฅผ ํ•ด์•ผ ํ• ์ง€ ํฌ๊ฒŒ ๊ณ ๋ฏผ์ด ๋œ๋‹ค. 

๊ณตํ†ต, api, mail??

 

๊ฐ์ฒด ๋งคํ•‘ ์‹œ model mapper๋ฅผ ํƒํ•œ ์ด์œ 

> dto์™€ VO, dto์™€ Entity ๋งคํ•‘์„ ํ•  ๋ชฉ์ ์—๋งŒ ์ง‘์ฐฉํ•˜๊ณ , ์„ฑ๋Šฅ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฌด์ž‘์ • ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์„ฑ๋Šฅ์„ ์ง‘์ฐฉํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์—ฌ์•ผ๊ฒ ๋‹ค.

 

> MapStruct๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ณ ์ณ๋ณด์ž.

 

์ปจํŠธ๋กค๋Ÿฌ์˜ ์ฑ…์ž„์— ๊ด€ํ•˜์—ฌ

> ์ปจํŠธ๋กค๋Ÿฌ๋Š” request, response์˜ ์—ญํ• ์ด ์ฃผ๋œ ๋ชฉ์ ์ด๋‹ค. ์–ด๋–ค ๊ฐ’์„ ์•Œ๊ณ  ์žˆ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค. 

 

> enum์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, Service์—์„œ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์ข‹์„ ๋“ฏ์‹ถ๋‹ค.

 

์Šค์นผ๋ผ์™€ ์‘๋‹ต ๋ฉ”์‹œ์ง€

> Path๋กœ ๋ฐ›๋Š” ์Šค์นผ๋ผ ๊ฐ’์€ ์œ„ํ—˜ํ•˜๋‹ค. ๊ฐ’์ด ๋ฐ”๋€Œ๊ฒŒ ๋˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์ˆ˜์ •์ด ์ด๋ค„์งˆ ๊ฒƒ์ด๋‹ค. 

์ด๊ฑด ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ๋„, ๋†“์นœ ๋ถ€๋ถ„์ด๋‹ค. ๋ฌด์กฐ๊ฑด ๋งคํ•‘ ๋งคํ•‘ ๋งคํ•‘.

 

> ์‘๋‹ต ์ฝ”๋“œ๊ฐ€ 200์ผ ๊ฒฝ์šฐ๋Š” ๊ตณ์ด ResponseEntity ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์—†์„ ๊ฒƒ์ด๋‹ค. 

๋ฌผ๋ก  ๋ณธ์ธ์˜ ์ฝ”๋“œ ์ž‘์„ฑ ๊ทœ์น™์„ ์ •๋ฆฝํ•œ ๊ฒฝ์šฐ ๊ทธ์— ํ•ฉ๋‹นํ•œ ์ด์œ ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹๋‹ค.

 

 

์ƒํƒœ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” Bean

> Bean์€ ๊ฐ€๋ณ€์ ์ธ ์ƒํƒœ๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉด ์œ„ํ—˜ํ•˜๋‹ค. Thread-Safe ํ•˜์ง€๊ฐ€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์ธ๋ฐ, ์ข€ ๋” ์‹ ์ค‘ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

> ์ด๊ฒŒ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ค‘๋‹จํ•œ ๊ฐ€์žฅ ํฐ ์ด์œ ์ด๋‹ค. ๊ฑฐ๊ตญ์ ์ธ ์ˆ˜์ •์ด ํ•„์š”ํ•˜๊ฒ ๋‹ค.

WAS๋Š” ํ•ญ์ƒ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋ง์ž.

 

Null ์ฒดํฌ์™€ Exception ์ฒ˜๋ฆฌ

> ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ด๋Ÿฌํ•œ ๋กœ์ง์„ ๊ฐ€์งˆ ์ด์œ ๊ฐ€ ์—†๋‹ค. ์ตœ๋Œ€ํ•œ ์„œ๋น„์Šค์—์„œ ์ฒ˜๋ฆฌ

> ์ด๋Ÿด ๊ฒฝ์šฐ Exception์„ ๋˜์ ธ, RestControllerAdvice์—์„œ ๊ณตํ†ต ์ฒ˜๋ฆฌ

> Null ์ฒดํฌ ๊ด€๋ จ์€ Optional์„ ์ ์šฉํ•ด๋ณด์ž.

 

์ฝ”๋“œ์˜ ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ๊ณ ๋ ค

> ์ถ”์ƒํ™” ์ˆ˜์ค€์€ ํ•ญ์ƒ ์ผ๊ด€๋˜์–ด ์žˆ์–ด์•ผ ๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค. 

 

์ฃผ๋ฌธ, ๊ฒฐ์ œ ๋„๋ฉ”์ธ ๊ด€๋ จ

> ์˜์กด์„ฑ์„ ํ™•์‹คํžˆ ๋ถ„๋ฆฌํ•˜์ž

 

Optional 

> null์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ๋ง์ž.

> ์ฐจ๋ผ๋ฆฌ ๋น„์–ด์žˆ๋Š” ์ฟ ํ‚ค๋ฅผ ๋ฐ˜ํ™˜

 

Map์˜ ์‚ฌ์šฉ

> Util ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ Map ๋ฐ˜ํ™˜์„ ์ตœ๋Œ€ํ•œ ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค. ํƒ€์ž… ์ถ”๋ก ์ด ์–ด๋ ค์›Œ์ง„๋‹ค.

> ์ผ๋ฐ˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์ž.

> Map์„ ์ด์šฉํ•  ๊ฒฝ์šฐ ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌํ•  ๋•Œ๋งŒ.

 

Service Layer ํ•จ์ˆ˜์˜ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ํƒ€์ž…์˜ return

> Cookie๋Š” javax.servler.http ํŒจํ‚ค์ง€์˜ ํด๋ž˜์Šค. ์ด ๋‚ ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ดํ•  ๊ฒฝ์šฐ, ๋ณ€๊ฒฝ ์‹œ์— ์ •๋ง ์ทจ์•ฝํ•ด์ง„๋‹ค

> ํŒจํ‚ค์ง€์˜ ์˜์กด์„ฑ์„ ์ƒ๊ฐํ•˜์ž.

> ์ด ์—ญ์‹œ ๋งคํ•‘

 

์ด๋ฒคํŠธ ํผ๋ธ”๋ฆฌ์…” ๊ด€๋ จ

> ์ด๋ฒคํŠธ ํผ๋ธ”๋ฆฌ์…”๋Š” ๋ณดํ†ต ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์‹œ ํ™œ์šฉ.

> ํ•ด๋‹น ๋กœ์ง์€ ์ ˆ์ฐจ์ ์ธ ๋กœ์ง์ด๋ฏ€๋กœ, ๋น„๋™๊ธฐ์™€ ๊ด€๋ จ์ด ์—†๋‹ค. ๋”ฐ๋กœ ๋ฉ”์„œ๋“œ๋กœ ๋Œ€์ฒดํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

RestTemplate๊ณผ try-catch

> restTemplate์€ deprecated ๋˜์—ˆ์œผ๋ฏ€๋กœ, webClient ์‚ฌ์šฉ์„ ๊ณ ๋ฏผ

> catch๋ผ๋Š” ๊ฒƒ์€ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ธ๋ฐ, ๋‹จ์ˆœํžˆ log๋กœ ๋๋‚ด๋Š” ๊ฑด ํ™ฉ๋‹นํ•œ ๊ฒฝ์šฐ์ด๋‹ค. Exception์„ ๋˜์ ธ์„œ ํ•ด๊ฒฐํ•˜๋Š” ์Šต๊ด€์„ ๊ธฐ๋ฅด์ž.

> null ๋ฆฌํ„ด์€ ํ•ญ์ƒ ๊ธˆ๋ฌผ => ๋ฐ–์—์„œ null ์ฒดํฌ๋ฅผ ํ•˜๊ฒŒ ๋˜๋Š” ๋ถˆ์ƒ์‚ฌ๊ฐ€ ๋ฐœ์ƒ

 

 

์ƒ๊ฐํ•ด๋ณด๋‹ˆ, ์ €์žฅ์†Œ๋ฅผ ํ•˜๋‚˜ ๋” ํŒŒ๋Š”๊ฒŒ ์ข‹์„ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•