URL escape / encoding

URLEncoder.encode() 메소드를 써도 되지만 이 기능은 파라메터로 넘어온 모든 문자열을 인코딩한다.
따라서 아래와 같은 문자열을 입력할 경우

public static void main(String[] args) throws Exception {
	String url = "https://test.com/call.jsp?pararm=한글파라메터";
	
	System.out.println(URLEncoder.encode(url, "UTF-8"));
}

출력결과 : https%3A%2F%2Ftest.com%2Fcall.jsp%3Fpararm%3D%ED%95%9C%EA%B8%80%ED%8C%8C%EB%9D%BC%EB%A9%94%ED%84%B0

위와같이 https://test.com/call.jsp?param= 과 같이 인코딩이 필요하지 않은 부분까지 모두 인코딩을 해 버린다.
따라서 URLEncoder.encode() 메소드는 필요한 만 인코딩 할때 사용하여야 하므로 인코딩이 필요한 부분을 문자열에서 추출해서 적용해야 하는 번거로움이 있다

이것을 해결하려면 아래와 같이 URL 클래스와 URI클래스를 사용하여 URL의 요소를 분리하여 적용하면 해결된다.

	/**
	 * URL에서 인코딩이 필요한 부분만 escape해서 리턴해줌
	 * URLEncoder.encode()를 사용하면 입력된 모든 문자열을 인코딩함. 그래서 이걸 써야함.
	 * @param urlStr
	 * @return
	 */
	public static String escapeURL(String urlStr) {
		String result = null;
		
		if (urlStr == null) {
			return result;
		}
		
		try {
			URL url = new URL(urlStr);
			URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
			
			result = uri.toASCIIString();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}