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

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

@PathVariable, @RequestParam, @ModelAttribute

์•Œ๊ฒŒ๋œ ์ 1. @RequestParam์„ ํ†ตํ•ด์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐQuery StringForm ํ˜•์‹ ๋ฐ์ดํ„ฐ (html form)๋ฉ€ํ‹ฐํŒŒํŠธ ๋ฐ์ดํ„ฐ : multipart/form-data ํ˜•์‹์˜ ์š”์ฒญ์—์„œ ํผ ํ•„๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Œ์œ„ ์„ธ๊ฐ€์ง€๋ฅผ ๋‹ค ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2. @RequestBody๋Š” ๋ณ€ํ™˜๊ณผ์ •, @ModelAttribute์€ ๋งตํ•‘๊ณผ์ •@RequestBodyJSON, XML, Text๋“ฑ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ํ•ฉํ•œ HttpMessageConverter์„ ํ†ตํ•ด ํŒŒ์‹ฑ๋˜์–ด Java ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ ๋ฉ๋‹ˆ๋‹ค.@RequestBody๋ฅผ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋Š” ๋ฐ”์ธ๋”ฉ์„ ์œ„ํ•œ ์ƒ์„ฑ์ž๋‚˜, setter๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.๋‹จ, ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•ด ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์™€ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์œ„ํ•œ getter๋‚˜ setter ์ค‘ 1๊ฐ€์ง€๋Š” ์ •์˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค..

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

๋กœ๊น…

๋กœ๊น…์ด ์™œ ํ•„์š”ํ• ๊นŒ?๋ฐฐํฌํ™˜๊ฒฝ์—์„œ ๋™์ž‘ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.๊ธฐ์กด์˜ System.out.println(), System.err.println()๊ณผ ๊ฐ™์€ ํ”Œ๋กœ์šฐ๋กœ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.๋กœ๊น…์ด ๊ธฐ๋กํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์‚ฌํ•ญ์„œ๋น„์Šค ๋™์ž‘ ์ƒํƒœ์žฅ์• (exceptino || error)๋กœ๊น… ํ”„๋ ˆ์ž„์›ŒํฌSLF4JLogbackLog4jnlogSystem.out.println()๋ณด๋‹ค ์ข‹์€ ์ ์ถœ๋ ฅ ํ˜•์‹์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ์„ค์ •ํ•˜์—ฌ ๋‚จ๊ธฐ๊ณ  ์‹ถ์€ ๋กœ๊ทธ๋ฅผ ๋ณ„๋„๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ๋Š” ๋ชจ๋“  ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ์šด์˜์„œ๋ฒ„์—์„œ๋Š” ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š” ๋“ฑ ๋กœ๊ทธ๋ฅผ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค์ฝ˜์†” ๋ฟ ์•„๋‹ˆ๋ผ, ํŒŒ์ผ์ด๋‚˜ ๋„คํŠธ์›Œํฌ๋“ฑ ๋กœ๊ทธ๋ฅผ ๋ณ„๋„์˜ ์œ„์น˜์— ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Œ์„ฑ๋Šฅ๋„ System.out.println()๋ณด๋‹ค ์ข‹์Œ!๋กœ๊ทธ๋ ˆ๋ฒจ(Fatal..

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

๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ

์˜ˆ์ „ ๋ฑ…ํ‚น ์„œ๋น„์Šค๋ฅผ ์ฃผ์ œ๋กœ ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์ง€๋งŒ, ๋™์‹œ์„ฑ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ๋ชป ํ•œ ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ ์ด์Šˆ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• synchronized ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์—์„œ๋งŒ ๋™์ž‘. ์ฆ‰ ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ๋Œ€์ด๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ ์„œ๋ฒ„์—์„œ ๋™์‹œ์— ์ ‘๊ทผํ•œ๋‹ค๋ฉด synchronized ๋Š” ๊ธฐ๋Šฅ์„ ๋ฐœํœ˜ํ•  ์ˆ˜ ์—†๋‹ค. @Transactional ์„ ์‚ฌ์šฉํ•˜๋ฉด, ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹ํ•  ๋•Œ ์ž ๊น์˜ ํ…€์— ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค. Lock (DB์—์„œ ์žฌ๊ณตํ•˜๋Š” ๋ฝ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ) Pessimistic Lock (๋น„๊ด€์  ๋ฝ) row๋‚˜ table ๋‹จ์œ„๋กœ ๋ฝ์„ ๊ฒ€ ์ž์› ์š”์ฒญ์— ๋”ฐ๋ฅธ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•˜๊ณ  ๋ฝ์„ ๊ฑธ์–ด๋ฒ„๋ฆฌ๋Š” ๋น„๊ด€์  ๋ฝ ๊ณต์œ ๋ฝ(Shared Lock)๊ณผ ๋ฒ ํƒ€๋ฝ..

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

์›น์†Œ์ผ“

websocket์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์›น์†Œ์ผ“ ํ†ต์‹ ์˜ ์‹œ์ž‘ ์›น์†Œ์ผ“ ํ†ต์‹ ์€ ์‹œ์ž‘์€ HTTP request ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ HTTP request ํ—ค๋”์—๋Š” Connection : "Upgrade", Upgrade : "websocket"์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. GET /spring-websocket-portfolio/portfolio HTTP/1.1 Host: localhost:8080 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg== Sec-WebSocket-Protocol: v10.stomp, v11.stomp Sec-WebSocket-Version: 13 Origin: http://localhos..

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

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ ๋™์ž‘ ์›๋ฆฌ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ๋™์ž‘๊ณผ์ • ํ•„ํ„ฐ๋ž€? ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์™ธ๋ถ€์— ์กด์žฌํ•˜์—ฌ ์Šคํ”„๋ง๊ณผ ๋ฌด๊ด€ํ•œ ์ž์›์— ๋Œ€ํ•ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต web.xml์— ๋“ฑ๋ก. ์ธ์ฝ”๋”ฉ ๋ณ€ํ™˜ ์ฒ˜๋ฆฌ, XSS ๋ฐฉ์–ด ๋“ฑ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ธ์ฆ๊ณผ ์ธ๊ฐ€์˜ ์ฐจ์ด์  ์ธ์ฆ : ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ๋ณธ์ธ์ด ๋งž๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ ์ธ๊ฐ€ : ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ๋œ ์ž์›์— ๋Œ€ํ•ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ ˆ์น˜ Servlet Container์™€ Spring Container DelegatingFilterProxy Servlet Container์™€ Spring์˜ Spring Container๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ํ•„ํ„ฐ์ž…๋‹ˆ๋‹ค. servlet container์— ์กด์žฌํ•˜๋Š” ํ•„ํ„ฐ์ž…๋‹ˆ๋‹ค. ํ•„ํ„ฐ(Filter)๋„ ์Šคํ”„๋ง์—์„œ ๊ด€๋ฆฌ๊ฐ€..

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

REST API

REST : Representational State Transfer ํ•˜๋‚˜์˜ URI๋Š” ํ•˜๋‚˜์˜ ๊ณ ์œ ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋Œ€ํ‘œํ•˜๋„๋ก ์„ค๊ฒŒ๋œ๋‹ค๋Š” ๊ฐœ๋…์— ์ „์†ก๋ฐฉ์‹์„ ๊ฒฐํ•ฉํ•ด์„œ ์›ํ•˜๋Š” ์ž‘์—…์„ ์ง€์ •ํ•œ๋‹ค. URI + GET / POST / PUT / DELETE HTTP URI๋ฅผ ํ†ตํ•ด ์ œ์–ดํ•  ์ž์›์„ ๋ช…์‹œํ•˜๊ณ , HTTP Method(GET, POST, PUT, DELETE)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›(Resource)์„ ์ œ์–ดํ•˜๋Š” ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ๋ฐฉ์‹์˜ ์•„ํ‚คํ…์ฒ˜ ๊ธฐ์กด Service : ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ํ›„ ๊ฐ€๊ณต๋œ data๋ฅผ ์ด์šฉํ•ด ํŠน์ • ํ”Œ๋žซํผ์— ์ ํ•ฉํ•œ ํ˜•ํƒœ์˜ View๋กœ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜. REST Service : data์ฒ˜๋ฆฌ๋งŒ ํ•œ๋‹ค๊ฑฐ๋‚˜, ์ฒ˜๋ผ ํ›„ ๋ฐ˜ํ™˜๋  data๊ฐ€ ์žˆ๋‹ค๋ฉด JSON์ด๋‚˜ XMLํ˜•์‹์œผ๋กœ ์ „๋‹ฌ. View์— ๋Œ€ํ•ด์„œ๋Š” ์‹ ๊ฒฝ์“ธ ํ•„์š”๊ฐ€..

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

MyBatis

MyBatis Java Object์™€ SQL๋ฌธ ์‚ฌ์ด์˜ ์ž๋™ Mapping ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ORM Framework MyBatis๋Š” SQL์„ ๋ณ„๋„์˜ ํŒŒ์ผ(XML ํ˜น์€ ์ž)๋กœ ๋ถ„๋ž˜ํ•ด์„œ ๊ด€๋ฆฌ Object ์™€ SQL ์‚ฌ์ด์˜ parameter mapping ์ž‘์—…์„ ์ž๋™์œผ๋กœ ํ•ด ์คŒ. ์ž๋ฐ”์™€ SQL์„ ์—ฐ๊ฒฐ๋งŒ ํ•ด์ค€๋‹ค! JAVA - MyBatis - MySQL myBatis → Java์™€ myBatis → spring ๋”ฐ๋กœ ์žˆ์Œ JDBC Driver Loading (Driver Class) DB์—ฐ๊ฒฐ(Connection๊ฐ์ฒด ์ƒ์„ฑ) (url, id, pwd) SQL ์‹คํ–‰ ์ค€๋น„ SQL๋ฌธ์žฅ Statement์ƒ์„ฑ SQL ์‹คํ–‰ DB ์† ์ข…๋ฃŒ ๐Ÿ’ก ์œ„ ๋ฐฉ์‹์—์„œ ํŒŒ๋ž€์ƒ‰ ๋ถ€๋ถ„์€ MyBatis๊ฐ€ ์•Œ์•„์„œ ํ•ด์ฃผ๊ณ , ์ดˆ๋ก์ƒ‰ ๋ถ€๋ถ„๋งŒ xml์— ์„ค์ •..

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

Spring Web MVC

๐Ÿ’กํ•„ํ„ฐ, ์ธํ„ฐ์…‰ํ„ฐ, AOP์˜ ์ฐจ์ด? ํ•„ํ„ฐ - ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ ์™ธ๋ถ€์— ์กด์žฌํ•˜์—ฌ ์Šคํ”„๋ง๊ณผ ๋ฌด๊ด€ํ•œ ์ž์›์— ๋Œ€ํ•ด ๋™์ž‘ํ•จ. - ๋ณดํ†ต web.xml์— ๋“ฑ๋กํ•˜๊ณ , ์ธ์ฝ”๋”ฉ ๋ณ€ํ™˜ ์ฒ˜๋ฆฌ, XSS ๋ฐฉ์–ด ๋“ฑ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋กœ ์‚ฌ์šฉ๋จ. ์ธํ„ฐ์…‰ํ„ฐ - ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋ฉฐ Dispatcher Servlet์ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „, ํ›„๋กœ ๋ผ์–ด๋“ฌ. - ์Šคํ”„๋ง์˜ ๋ชจ๋“  ๋นˆ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ. ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ(์ˆœ์„œ ์ฃผ์˜). - ๋กœ๊ทธ์ธ ์ฒดํฌ, ๊ถŒํ•œ์ฒดํฌ, ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ๊ฐ„ ๊ณ„์‚ฐ์ž‘์—… ๋กœ๊ทธํ™•์ธ ๋“ฑ์˜ ์—…๋ฌด์ฒ˜๋ฆฌ. AOP - ํ•„ํ„ฐ์™€ ์ธํ„ฐ์…‰ํ„ฐ (ํ•„ํ„ฐ์™€ ์ธํ„ฐ์…‰ํ„ฐ๋Š” Servlet ๋‹จ์œ„์—์„œ ์‹คํ–‰) ์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฉ”์†Œ๋“œ ์•ž์—์„œ Proxy ํŒจํ„ด์˜ ํ˜•ํƒœ๋กœ ์‹คํ–‰๋จ. - OOP๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ฐœ๋…. (OOP์—์„œ ๊ณตํ†ต ์‚ฌํ•ญ์„ ๋ชจ๋“ˆํ™” ํ•œ..

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