2015년 6월 27일 토요일

나만의 개발환경

내가 좋아하는 개발환경 중에서 이클립스와 관련된 내용

1. 버전
별다른 특이사항이 없으면 최신 버전을 이용한다. 현재는 luna. 링크

2. Package
Eclipse IDE for Java EE Developers로 받아야 Web과 관련된 개발을 편하게 할 수 있다. 일반 Package를 받으면 HTML Editor도 없어서 html파일을 더블 클릭으로 열면 이클립스에 내장된 브라우저로 열린다 -.- 여기서 패키지별 기능 비교가 가능하다.

3. Workspace
root에 dev와 같은 특정 이름으로 디렉토리를 만들어서 그 안에 이클립스가 설치되는 폴더와 workplace 폴더를 만든다. 포맷을 대비하여 d 드라이브를 선호한다. root에 만드는 디렉토리는 이클립스를 설치하는 의도가 드러나도록 이름을 짓는다. 일부러 과거 버전의 이클립스를 쓰는 경우에는 kepler, indigo와 같은 이름으로 만들거나, 특정 프로젝트를 위한 개발환경이라면 해당 프로젝트 이름으로 만드는 식이다. root에 만드는 이유는 소스파일들의 전체 경로가 너무 길어지지 않게 하기 위해서 이다.

4. Perspective
기본적으로 Java Perspective를 사용하지만, 아래처럼 View 구성을 약간씩 변경한다. 

- 왼쪽 View에 JUnit View를 추가한다. JUnit을 돌리는 시점이라면 테스트 대상이 되는 Java 파일에만 집중하게 되므로 전체 트리 구조는 볼 필요 없기 때문이다.

- Server, Ant View를 왼쪽 아래에 넣는다. 둘다 위아래로 긴 목록이 나오지 않는 스타일의 View이지만, 자주 접근하게 되므로 왼쪽 아래에 필요한 만큼만 보이게 줄여서 넣는다.

- 오른쪽 View를 최소화한다. 기본 설정에 Task List와 Outline이 있는데 둘다 항상 보고 싶은 정보는 아니고, 특정 시점에 뭔가 있는지 궁금해지는 View이다. Task List는 Mylyn을 쓰지 않으면 제거하고, Tasks를 추가하여 넣는다.

- 아래쪽 View도 필요한 것만 남기고 제거한다. Problems, Console, Progress, Search만 남겨놓는다. Javadoc은 필요할때 마우스 오버해서 보는 편이다.

여기 까지 설정하면 아래 처럼 된다.


5. Colors
밝은 계열의 테마를 선호한다. 그래서 이클립스의 기본 설정색을 변경하지 않고 그냥 사용한다. 오히려 cmd.exe나 putty 사용할 때에 기본 설정인 검정색 바탕에 회색 글씨를 희색 바탕의 검정색 글씨로 변경해서 사용하는 편이다.

6. Fonts
글씨체는 무조건 나눔고딕코딩으로 변경한다. 개발하기에 이보다 좋은 폰트는 못 찾은 것 같다. 이 주제에 대해서 나름의 관심이 있어서 많은 Font를 써봤지만, 한글까지 정확하고 이쁘게 표현하는 Font는 나눔고딕코딩이 유일한 듯 한다. 그리고 큰 글씨를 선호하기 때문에 기본 크기도 14로 올려서 사용한다.

7. Keys
단축키도 몇가지를 추가한다. File Search에 Ctrl + Shift + F 를 지정해서 패키지 익스플로러에서 바로 Selected 범위로 파일내용을 찾기에 편하게 만든다. Copy Qualified Name에 Ctrl + Shift + C 를 지정해서 전체 경로를 폼함한 파일명이나 패키지명을 포함한 클래스명을 손휩게 복사할 수 있게 만든다.

... 더 있지만 블로그가 너무 길어지므로 여기까지...


JSON 문자열의 데이터를 HTML escape 할때 주의점

브라우저에서 AJAX로 JSON을 요청한 경우, 서버에서 JSON 문자열을 리턴해주는데, XSS 방지를 위해 특수문자 6개( & < > " ' / )는 HTML 엔티티로 변환해서 넘겨준다.

return input.replaceAll("&", "&amp;")
.replaceAll("<", "&lt;")
.replaceAll(">", "&gt;")
.replaceAll("\\\\\"", "&quot;")
.replaceAll("'", "&#x27;")
.replaceAll("/", "&#x2F;");

그런데 "의 경우에는 " 자체가 JSON에서 사용하는 특수문자이기 때문에 \"와 같이 표현되도록 JSON이 생성된다. 그래서 "를 &quot;로 변경하면 실제로는 \" 가 \&quot;가 되므로 escape 문자인 \가 데이터인 것처럼 변경된다. 그래서 \"를 &quot;로 변경해야 한다.

그런데 값이 \일때는 또다른 문제가 발생한다.

name이라는 항목의 실제값이 \ 라고 가정하면,
JSON인코딩 문자열은 {"name":"\\"} 가 된다.
이게 위 XSS 치환 로직을 거치면 {"name":"\&quot;}가 되면서 JSON 규칙에서 어긋나게된다.

JSON spec에 따르면 값(value)는 쌍따옴표(")로 둘러싸여져 있고, 값 바로뒤에는 특수문자 } , ]만 나올 수 있다. 쌍따옴표(")가 값(value)이 아닌 이름(name)일 수 도 있으므로 : 도 나올 수 있다. 그래서 정규식에 negative lookahead를 적용해서 \\\"(?!,|]|:|})를 &quot;로 변경하도록 적용하니 값이 \일때도 정상적으로 처리된다. 그리고 Java String의 escape 문자도 적용되어야 하니 Java String에 넣을려면 \\\\\"(?!,|]|:|}) 가 되어야 한다.
실제 데이터가 ":" 일 때는 \":\" 처럼 데이터가 생성된다. 그래서 위에 취소선을 그은 방법대로 하면 , } ] : 앞에 나타나는 "는 치환되지 않는다. 그래서 negative lookbehind를 적용해서 짝수개의 \\\\가 발생하고 바로 나타나는 \"에 대해서 치환하도록 정규식을 변경했더니 정상적으로 치환이 된다.
특정 패턴이 0번 혹은 짝수번 나타나는지를 확인하기 위해 negative lookbehind와 짝수번 패턴의 *를 사용했다. 참고 \\가 안나오고 \\\\가 0번이상 발생하는 패턴. 만들어진 정규식은 (?<!\\)(\\\\)*
Java String의 replaceAll 사용시 짝수번패턴은 치환하지 않고 그대로 유지하기 위해 치환할 부분을 제외한 전체부분은 그룹으로 묶고 치환해서 들어갈 문자열에 $1으로 지정. 참고


return input.replaceAll("&", "&amp;")
.replaceAll("<", "&lt;")
.replaceAll(">", "&gt;")
.replaceAll("((?<!\\\\)(\\\\\\\\)*)(\\\\\\\")", "$1&quot;")
.replaceAll("'", "&#x27;")
.replaceAll("/", "&#x2F;");