2022 01 23 - oneso123456789/2022 GitHub Wiki

oher

Controller์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ ์ด์–ด์ง
์˜ค๋ฅ˜ ๋””๋ฒ„๊น… ๋…ธํŠธ๋ฅผ ์ด๋ ‡๊ฒŒ ์œ„์— ์ ์–ด์•ผ ํ• ์ง€ ์•„๋‹ˆ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ณณ์— ์ ์–ด์•ผํ• ์ง€ ๊ณ ๋ฏผ์ž„
ํ•˜์ดํผ๋งํฌ๋กœ ์˜ฌ๋ฆฌ๋Š”๊ฑฐ๋„ ๋‚˜์˜์ง„ ์•Š์•„๋ณด์ž„

ex02Bean ์˜ค๋ฅ˜

ex02Bean์˜ http://localhost:8080/sample/ex02Bean?list[0].name=aaa&list[2].name=bbb ๋งคํ•‘์„ ์‚ฌ์šฉํ•ด๋ณด๋ฉด HTTP Status 400 โ€“ Bad Request ์˜ค๋ฅ˜๊ฐ€ ์•ผ๊ธฐ๋จ
์ด์œ ๋Š” tomcat ๋ฒ„์ „์— ๋”ฐ๋ผ์„œ '[]' ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š”๋Œ€ ํ†ฐ์บฃ 9.0๋ฒ„์ „๋„ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•จ

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ '['๋ฌธ์ž๋Š” %5B๋กœ ']'๋ฌธ์ž๋Š” %5D๋กœ ๋ณ€๊ฒฝํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด๋จ
๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋ก  JavaScript๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—” encodeURIComponnt()์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ํ•ด๊ฒฐ๊ฐ€๋Šฅ

์—ฌ๊ธฐ์„œ ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ฒจ์„œ list[0]๋ฐฐ์—ด์— ์ด๋ฆ„๊ณผ ๋‚˜์ด ๋ชจ๋‘๋ฅผ ์ž…๋ ฅํ•ด๋ณด๋ ค๊ณ  ํ–ˆ์Œ
http://localhost:8080/sample/ex02Bean?list%5B0%5D.name=aaa&age=26
๋’ค์— ์—”๋“œ๋กœ age๋ฅผ ๋ถ™์—ฌ๋ดค์ง€๋งŒ ์‹คํŒจํ•จ
http://localhost:8080/sample/ex02Bean?list%5B0%5D.name=aaa&list%5B0%5D.age=26
์ด๋ฐฉ์‹์€ ์„ฑ๊ณตํ–ˆ์ง€๋งŒ ๋„ˆ๋ฌด ๋งคํ•‘์ด ๊ธธ์–ด์ง€๋Š”๊ฑฐ ๊ฐ™์•„์„œ ๋ฐ˜์ ˆ์งœ๋ฆฌ ์„ฑ๊ณต์ž„
์•„๋งˆ ๋” ์ข‹์€๋ฐฉ์‹์ด ์žˆ์–ด๋ณด์ž„ ๊ทธ๋ฆฌ๊ณ  []๋‘๊ฐœ๋ฉด ๋  ๋ฌธ์ž์—ด์ด %5B,%5D๋กœ 6๊ฐœ๋กœ ๋Š˜์–ด๋‚˜์„œ ๊ธธ์–ด๋ณด์ด๋Š”๊ฑฐ ๋ฟ์ด์ง€ ์ถฉ๋ถ„ํžˆ ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ ์žˆ์–ด ๋ณด์ด๋Š” ๋งคํ•‘์ž„

์ง€๊ธˆ์ด 5์‹œ 17๋ถ„์ด๋‹ˆ 30๋ถ„๊นŒ์ง€๋งŒ ๊ณ ๋ฏผํ•ด๋ณด๊ธฐ๋กœ ํ•˜๊ฒ ์Œ
http://localhost:8080/sample/ex02Bean?list%5B0%5D.name=aaa&.age=33
์ด ๋งคํ•‘๋„ ์‹คํŒจํ•จ ์ง€๊ธˆ ๋“  ์ƒ๊ฐ์ธ๋Œ€ ์›๋ž˜ ๋ฐฐ์—ด๋„ ๋ฐฐ์—ด๋ช…๊ณผ์ฃผ์†Œ๊ฐ’์„ ๊ฐ™์ด ์ ์–ด์•ผ์ง€ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋‹ˆ๊นŒ ์•„๊นŒ ์ƒ๊ฐํ•œ ๋ฐฉ์‹์ด ๋งž๋Š” ๋ฐฉ์‹ ๊ฐ™์Œ ๋ฌผ๋ก  ๋” ์ข‹์€๋ฐฉ๋ฒ•์ด ์žˆ์„์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์ด๋ ‡๊ฒŒ ๊ฒฐ๋ก ์„ ๋‚ด๊ฒ ์Œ http://localhost:8080/sample/ex02Bean?list%5B0%5D.name=aaa&list%5B0%5D.age=26
๋ฐฐ์—ด๋ฐฉ์„ ๋‘๋ฒˆ ํ˜ธ์ถœํ•˜๊ณ  ๋‹ค๋ฅธ ์š”์†Œ์— ๊ฐ๊ฐ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š”๋ฐฉ์‹

java.util.Date์™€ java.sql.Date์˜ ์ฐจ์ด

ํฐ ๊ด€์ ์—์„  sqlํŒจํ‚ค์ง€์˜ date๋Š” utilํŒจํ‚ค์ง€๋ฅผ ์ƒ์†๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜์ง€๋งŒ
toString์œผ๋กœ ์„ธ๋ถ€์ ์œผ๋กœ ๋ณด๋ฉด sql์˜ date๋Š” ์‹œ/๋ถ„/์ดˆ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์—†๋‹ค.

SimpleDateFormat ํ˜•์‹ ์˜ค๋ฅ˜

@InitBinder ๋‚ด์šฉ์ค‘ ๋ฐœ์ƒ
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); ๋ผ๊ณ  ์„ ์–ธํ•ด์•ผํ• ๊ฒƒ์„ ํŒจํ„ด์ชฝ์—์„œ ("yyyy-mm-dd);๋ผ๊ณ  ์„ ์–ธํ•ด์„œ ๋…„๋„ 4์ž๋ฆฌ ๋ถ„2์ž๋ฆฌ ์ผ 2์ž๋ฆฌ๋กœ ์ถœ๋ ฅ๋จ..
๋‹ฌ์„ 2์ž๋ฆฌ๋กœ ํ‘œ์‹œํ• ๋• ๋Œ€๋ฌธ์ž MM์œผ๋กœ ํ‘œ์‹œํ•ด์•ผํ•จ

๊ฐ์ฒด ๋ฆฌ์ŠคํŠธ

๋งŒ์ผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ SampleDTO์™€ ๊ฐ™์ด ๊ฐ์ฒดํƒ€์ž…์ด๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด
์•ฝ๊ฐ„์˜ ์ž‘์—…์„ ํ†ตํ•ด์„œ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Œ
์˜ˆ๋ฅผ ๋“ค์–ด SampleDTO๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ „๋‹ฌ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด SampleDTO์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” SampleDTOList ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•จ
(์ฒ˜์Œ ์„ค๊ณ„ํ• ๋•Œ ๊ทธ๋ƒฅ DTO๋ฅผ ์‚ฌ์šฉํ• ์ง€ DTOList๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์ œ๋Œ€๋กœ ํŒ๋‹จํ• ์ค„ ์•Œ์•„์•ผํ• ๊บผ ๊ฐ™์Œ)

SampleDTOList ํด๋ž˜์Šค

private๋กœ List๋ฅผ ๋งŒ๋“œ๋Š”๋Œ€ ์ด๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ๋Š” SampleDTO ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•จ
๋˜ํ•œ public์œผ๋กœ SampleDTOList() ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์„œ private List๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๋Š”๊ฑฐ ๊ฐ™์Œ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹น์—ฐํ•œ ๊ตฌ์กฐ๊ฐ™์Œ DTO๋Š” data transfer object๋‹ˆ๊นŒ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค or ํด๋ž˜์Šค
๋Š” ๋ณ€ํ•˜์ง€ ์•Š์•„์•ผํ•จ ํ•˜์ง€๋งŒ ํ˜ธ์ถœ์„ ๋ฐ›์€ ํด๋ž˜์Šค๋Š” ๊ฐ’์ด ๋ณ€ํ•ด๋„ ์ƒ๊ด€์—†์Œ
์ด๊ฒŒ ๋งž๋Š”์ดํ•ด์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์›๋ณธ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋Š”๊ฒŒ ์•„๋‹Œ ์‚ฌ๋ณธ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์„œ
์‚ฌ์šฉํ•˜๋Š”๊ฒƒ๊ณผ ๊ฐ™์Œ

@InitBinder

ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜์ง‘์„ ๋‹ค๋ฅธ์šฉ์–ด๋กœ๋Š” 'binding(๋ฐ”์ธ๋”ฉ)'์ด๋ผ๊ณ ํ•จ
๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋Š” ์ž๋™์œผ๋กœ ๋ณ€ํ™˜๋˜์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์•ผํ•จ
์˜ˆ๋ฅผ ๋“ค์–ด ํ™”๋ฉด์— '2022-01-23'๊ณผ ๊ฐ™์ด ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ java.util.Date ํƒ€์ž…์œผ๋กœ
๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์ด ๊ทธ๋Ÿฌํ•จ

์Šคํ”„๋ง Controller์—์„œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•  ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” @InitBinder๋ฅผ ์ด์šฉํ•ด์„œ
์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
com.crow.domain ํŒจํ‚ค์ง€์— TodoDTO๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑ

TodoDTO ํด๋ž˜์Šค

private ๋ณ€์ˆ˜๋กœ Stringํ˜•์˜ title๊ณผ Dateํ˜•์˜ dueDate๋ฅผ ์„ ์–ธํ•ด์คŒ
์—ฌ๊ธฐ์„œ Date๋Š” java.util.Dateํƒ€์ž…์„ ์‚ฌ์šฉํ•จ
๋งŒ์ผ ์‚ฌ์šฉ์ž๊ฐ€ 2022-01-23 ๊ณผ ๊ฐ™์ด ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ณ ์ž ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ
์ด๊ฑธ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์ด @InitBinder์ž„

SampleController ํด๋ž˜์Šค

public ํ˜•์‹์˜ void initBinder ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•ด์คŒ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” WebDataBinderํƒ€์ž…์œผ๋กœ
๋ฉ”์„œ๋“œ์— @InitBinder์–ด๋…ธํ…Œ์ด์…˜์„ ์–ธ
SimpleDateFormat์„ ์ด์šฉํ•ด "yyyy-mm-dd"ํฌ๋งท์ƒ์„ฑ WebDataBinder๋ฅผ ์ด์šฉํ•ด์„œ ์ปค์Šคํ…€์—๋””ํ„ฐ ๋“ฑ๋ก(java.util.Date.class๋ฅผ ๋Œ€์ƒ์œผ๋กœ
์ƒˆ๋กœ์šด ์ปค์Šคํ…€ ๋ฐ์ดํŠธ์—๋””ํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์คŒ ์ด๋•Œ ๋ฐ์ดํ„ฐ ํฌ๋งท์€ ์•„๊นŒ SimpleDateFormat์œผ๋กœ ๋งŒ๋“ ํฌ๋งท์ด์šฉ
false๋ฅผ ์„ ํƒํ•ด์„œ null๊ฐ’์€ ๋ถˆ๊ฐ€๋Šฅ์œผ๋กœ ๋งŒ๋“ค์–ด์คŒ

๋งŒ์ผ ๋ธŒ๋ผ์šฐ์ €์—์„œ 'http://localhost:8080/sample/ex03?title=crow&dueDate=2022-01-23'
๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ–ˆ๋‹ค๋ฉด ์„œ๋ฒ„์—์„œ๋Š” ์ •์ƒ์ ์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ด์„œ ์ฒ˜๋ฆฌํ•จ

๋ฐ˜๋ฉด์— @InitBinder ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” 400 ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜์žˆ์Œ
(400์—๋Ÿฌ๋Š” ์š”์ฒญ ๊ตฌ๋ฌธ(syntax)์ด ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ์ž„)
๋‚ ์งœ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด๋„ ์•„์ง jsp ํŽ˜์ด์ง€๋Š” ์—†์œผ๋ฏ€๋กœ 404์—๋Ÿฌ๋Š” ๋ฐœ์ƒํ•จ

@DateTimeFormat

@InitBinder๋ฅผ ์ด์šฉํ•ด์„œ ๋‚ ์งœ๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์—
@DateTimeFormat์„ ์ ์šฉํ•ด๋„ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•จ
@DateTimeFormat์„ ์ด์šฉํ•  ๊ฒฝ์šฐ์—๋Š” @InitBinder๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Œ

TodoDTO ํด๋ž˜์Šค

๊ธฐ์กด๋‚ด์šฉ์—์„œ dueDate์œ„์— @DateFormat(pattern = "yyyy/MM/dd") ์–ด๋…ธํ…Œ์ด์…˜ ์ถ”๊ฐ€
๋‘๊ฐœ๋ฅผ ์ค‘๋ณต ์‚ฌ์šฉ์‹œ InitBinder๋ฅผ ์šฐ์„ ํ•˜๋Š”๊ฑฐ ๊ฐ™์Œ @DateFormat์œผ๋กœ url์„ ๋„˜๊ธธ์‹œ 400์—๋Ÿฌ๊ฐ€ ๋‚˜์˜ด