
1. ๐ URL ์ธ์ฝ๋ฉ ์๊ธฐ
URL ์ธ์ฝ๋ฉ์ ์น ๋ธ๋ผ์ฐ์ ์ ์น ์๋ฒ๊ฐ URL์ ์์ ํ๊ฒ ์ก์ ํ๊ธฐ ์ํ ์ธ์ฝ๋ฉ ๋ฐฉ์์ด๋ค.
๋ณดํต ์ ๋์ฝ๋์ Charset์ธ UTF-8 ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
1.1. ๊ณต๋ฐฑ ๋ฌธ์ +, %20
URL ์ธ์ฝ๋ฉ์ ๋ณด๋ฉด ๊ณต๋ฐฑ์ + ๋๋ %20์ผ๋ก ํํ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. +๋ ๋ ๊ฑฐ์๋ก ๋ง์ด ์ฐ์๊ณ ,
%20์ด ํ์ค์ด๊ธฐ ๋๋ฌธ์ %20์ด ์ฃผ๋ก ์ฐ์ธ๋ค. ๋ฌด์์ ์ฌ์ฉํด์ผ ํ๋๊ฐ๋ ์ ๋ต์ ์๊ณ ,
์ ํ๊ธฐ ๋๋ฆ์ด๊ธฐ ๋๋ฌธ์ ๊ท์น์ ์ ํ๊ณ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํ๋ค.
2. ๐ Problem
URL ์ธ์ฝ๋ฉ ๊ณต๋ฐฑ์ ๋ฌธ์ ๊ฐ ์์๋ค.
URL๋ก ๋์ด์ค๋ ๊ฒ(location)์ โ์๋ ํ์ธ์%20์ ๋%20๋์ ๋๋คโ๋ผ๊ณ ์์ฒญํ๋ ์ํ์๋ค.
ํ์ง๋ง ์๋ฒ์์ ์ฌ๋ฐ๋ฅธ URL์ธ์ง ์ฒดํฌํ๋ ๊ณผ์ ์์ DB์ ์ ์ฅ๋์ด ์๋ url ์ ๋ณด์์ โ์๋ ํ์ธ์ ์ ๋ ๋์ ๋๋ค.โ์
์ผ์นํ๋์ง ๊ฒ์ฆํ๋ ๋ก์ง์์ ์ผ์นํ์ง ์๋๋ค๊ณ ํ๋จํด์ ๋ฐ์ํ ์ด์์๋ค.
2.1. ๋ฐ์ ์ด์
DB์์ ๊ฐ์ ธ์จ url์ ๊ณต๋ฐฑ์ ์์ ๊ณ ์ค์ ๋ก ๋์ด์จ url๊ณผ ๋น๊ต๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅด๋ค๊ณ ์ธ์ํ๋ ๊ฒฝ์ฐ์๋ค.
URL๋ก ๋์ด์จ ๊ฒ์ location, DB์ ์ ๋ณด๋ฅผ ์ด๋ผ๊ณ ์นญํ๊ฒ ๋ค.
3. ๐ Trial And Error
3.1. ๊ณต๋ฐฑ ์ ๊ฑฐํ์ง ์๊ณ ๋น๊ตํ๊ธฐ
๋จผ์ ๊ธฐ์กด ์ฝ๋์์ ๋ ๊ฐ ๋ชจ๋ ์ธ์ฝ๋ฉ ํ ์ ๊ท์์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ํ๋จํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ์ด ์ธ์ฝ๋ฉ๊ณผ ์ ๊ท์์ด๋ผ๋
๋ฐฉ์์ ๋ฐ๊ฟ ์๋ ์์๋ค. ๊ทธ๋์ url ๊ณต๋ฐฑ์ ์ ๊ฑฐํ์ง ์๋ ๋ฐฉ๋ฒ์ ์ ํํ๋ค.
๋ฌธ์ ๋ ์๋์ ๊ฐ์ด ๋ฐ์ํ๋ค.
- location๊ณผ url์ ์ธ์ฝ๋ฉํ๋ ํ๋ ๊ณผ์ ์์ ๊ณต๋ฐฑ์ด %20์ด ์๋ +๋ก ์ธ์ฝ๋ฉ๋๋ ํ์์ด์๋ค.
์ฌ๊ธฐ์ ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ java.net.URLEncoder.encode()๋ฅผ ์ฌ์ฉํ๋ค. ํด๋น api๋ ๊ณต๋ฐฑ์ +๋ก ์ธ์ฝ๋ฉํ๋ ๋ฐฉ์์ด๋ค. - ์ธ์ฝ๋ฉ๋ +๋ฅผ Pattern.compile.matcher.find๋ฅผ ์ฌ์ฉํด์ ์ ๊ท์์ผ๋ก ์ผ์น ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค.
- ์ ๊ท์์ผ๋ก +๋ฅผ ์ ๋๋ก ์ ๋๋ก ์ธ์ํ์ง ๋ชปํด์ ์์ ํ ๋์ผํ ๋ฌธ์์ด์ธ๋ฐ๋ findํ์ง ๋ชปํ๋ค๋ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
(์ฐธ๊ณ ๋ก location ๊ฐ์ ๊ฒฝ์ฐ๋ ํ๊ธ๊ณผ ๊ณต๋ฐฑ๊ฐ์ ๊ฒฝ์ฐ๋ ์ธ์ฝ๋ฉ์ด ์ด๋ฏธ ๋์ด ๋ค์ด์จ ์ํฉ์ด๋ผ์ ๋์ฝ๋ฉ ํ ๋ค์ ์ธ์ฝ๋ฉํ๋ ๋ฐฉ์์ด์๋ค.)
3.2. +๋ฅผ ์ ์ธ์ํ์ง ๋ชปํ๋๊ฐ
์ธ์ํ์ง ๋ชปํ๋ ๊ฒ์ด ์๋๋ค. ์ ๊ท ํํ์์์ +ํํ์์ ์๋์ ๊ฐ๋ค.

https://www.w3schools.com/jsref/jsref_obj_regexp.asp
์ธ์ฝ๋ฉ๋ ๊ฒฐ๊ณผ๋ฅผ ๋จผ์ ๋ณด๋ฉด location๊ณผ url ๋ชจ๋ โ์๋ ํ์ธ์+์ ๋+๋์ด์ ๋๋คโ์ด๋ค.
ํ์ง๋ง n+ ํํ์์ด๊ธฐ ๋๋ฌธ์ findํ ์ ์๋๊ฒ ๋ฌธ์ ์๋ค.
๊ฒ์ฆ์ ์๋ ํ ์คํธ๋ก ์ ์ ์๋ค.
@Test
void ๊ณต๋ฐฑ_ํ
์คํธ() {
Matcher matcher1 = Pattern.compile("%20").matcher("%20");
assertThat(matcher1.find()).isTrue();
Matcher matcher2 = Pattern.compile("abc+").matcher("abc");
assertThat(matcher2.find()).isTrue();
Matcher matcher3 = Pattern.compile("abc+").matcher("fsdafsdfabc+c");
assertThat(matcher3.find()).isTrue();
Matcher matcher4 = Pattern.compile("abc+").matcher("bc+c");
assertThat(matcher4.find()).isFalse();
Matcher matcher5 = Pattern.compile("abc+d").matcher("abc+c");
assertThat(matcher5.find()).isFalse();
Matcher matcher6 = Pattern.compile("abc+d").matcher("abc");
assertThat(matcher6.find()).isFalse();
}
4. ๐ Solution
๊ณต๋ฐฑ์ %20์ผ๋ก ์ธ์ฝ๋ฉํ๊ธฐ
๋จผ์ URLEncoding Api๋ก๋ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ spring์ด ์ ๊ณตํ๋ UriUtils๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ ๊ฒ ์ฌ์ฉํด์ ์์ ํ ์ผ์นํ๋ ๋ฌธ์์ด์ด ๋๊ธฐ ๋๋ฌธ์ ์ผ์นํ๋๋ก ๊ฐ์ ํ ์ ์๋ค.
์ฆ, URLEncoder๋ฅผ ์ง์ํ๊ณ UriUtils๋ฅผ ์ฐ๋๋ก ํ๋๊ฒ ์ข๋ค.