Jan 27, 2010 - 불필요한 객체 생성을 피하는 방법

극단적인 ex)

String s= new String("테스트");
String s = "테스트";

기능적으로 동일한 객체를, 필요할 때마다 매번 새로 생성하기보다는 하나의 객체를 재사용하는 것이 좋을 때가 많습니다.
재사용을 하면 객체 생성에 소요되는 비용(시간과 자원)이 절감되므로 실행 속도가 더 빨라지고 코드도 보기 좋게 작성됩니다.
불변(immutable) 객체는 항상 재사용이 가능합니다.

new String 을 하게 되면 매번 새로운 String 인스턴스를 생성하게 됩니다.
한마디로 불필요한 객체를 만들게 된다는 말입니다.

매번 이 생성자를 통해 생성하게 되면 기능 상으로 동일한 객체가 계속 별개로 생성하게 되기 때문에, 만일 반복문이나 자주 호출되는 메소드 안에서 이런 문장이 실행된다면,
동일한 String 인스턴스를 쓸데없이 생성하게 됩니다.

String 의 경우 동일한 문자열 리터럴(literal)을 갖도록 권장하고 있습니다.

Sep 30, 2009 - Web 화면에서 특수한 기호(이하 특수문자) 인식

특수문자를 HTML TAG로 변환하는 방법

1. " : "
2. & :  &
3. < : &lt;
4. > : &gt;
5. non-breaking space : &nbsp;

문제

ㄱ. <input type=text name=n value="">">
ㄴ. alert("">");

ㄱ, ㄴ 의 예제와 같이 특정 html 출력시에 DB의 데이터를 그대로 사용할 경우 HTML 문서 오류가 발생할 가능성이 있습니다.

이러한 경우 4번과 5번은 HTML 태그를 손상시키지 않으므로 무시해도 됩니다.

그렇다면 문제가 발생하지 않기 위해선

  1. DB에 넣기 전에 1,2,3 의 경우 변환한 후 데이터 입력
  2. HTML에 그대로 적용

(만약 HTML 에 적용하기 전에 수정하거나 사용되어진다면, DB에는 그대로 넣고 HTML 출력 바로 직전에 변환하는 과정 필요)

결론 :

DB에 넣을 때는 신경쓰지 않아도 되지만, 빼올 때 어떻게 처리하는 지에 따라서 고민해보아야 합니다.

HTML 출력시 혹은 디바이스에서 처리할 때 문제가 발생하면,

( “, &, <) 와 같은 문자열을 (", &, <)로 변환시켜주면 됩니다.

ㄷ. <input type=text name=n value="&quot;&lt;">
ㄹ. alert("&quot;&lt;");

위와 같은 경우에도 실제로는 메시지 창에서 “> 란 값이 출력될 수도 있으므로 고민을 해봐야합니다. 아무때나 변경시키면 곤란하다는 의미입니다.

<!-- 상세 소스-->
 public static String escapeHtmlString(String s)
 {
  String s1 = s;
  if (s1 == null)
   return null;
  if (s1.indexOf(38, 0) != -1)
   s1 = replace(s1, "&", "&amp;");
  if (s1.indexOf(60, 0) != -1)
   s1 = replace(s1, "<", "&lt;");
  if (s1.indexOf(62, 0) != -1)
   s1 = replace(s1, ">", "&gt;");
  if (s1.indexOf(34, 0) != -1)
   s1 = replace(s1, "\"", "&quot;");
  return s1;
 }

로 강제로 변환하는 로직을 구현합니다.

Apr 9, 2009 - POPUP_OPNER

자식창에서 부모창의 파일업로드 기능

클라이언트의 승낙 없이는 클라이언트의 자원을 함부로 사용할 수 없습니다.

파일업로드의 경우 클라이언트의 사용자가 직접 입력하지 않고
스크립트를 사용한다던지 하는 것은 보안차단되어 있습니다.

현재 팝업창에서 파일업로드가 되면서 DB에 저장되는 형식을 가지고 있는데
다른 부분은 OPNER 로 빼서 팝업에 넘겨주는 것이 가능하나, 파일업로드의 경우 OPNER 에서 처리하지 않고
POPUP 창까지 클라이언트가 올리려던 경로를 기억해 둔 다음,
POPUP 창에서 처리하려고 할 경우 지금 기억하고 있는 것이 클라이언트가 집적 마우스로 선택해서 올리기 위한 자의적인 파일인지,
코더가 악의적으로 하드내의 특정 파일을 빼내려고 경로를 잡은 건지 알 방법이 없기에,
원칙적으로 이러한 코딩이 보안 설정되어있는 것으로 압니다.

이를 해결하기 위해선, 클라이언트의 사용자 승낙(예를 들어, ActiveX의 설치 과정)을 받아 클라이언트에 해당 파일을 업로드하도록 만들어진 프로그램을 설치해야만 그런 기능이 가능할 것입니다.

혹은 우선 OPNER 에서 실지로 파일을 임시 폴더로 업로드 한 뒤에,
메일 발송을 할 경우에 경로에 있는 임시 파일을 실제 파일 경로로 옮기는 것도 가능은 할 거 같습니다.