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์๋ฌ๊ฐ ๋์ด