본문 바로가기
연습

프로그래머뇌 청킹연습/표식찾기연습 - 1

by ybs 2022. 5. 11.
반응형

 

[표식찾기 연습]

1단계 코드베이스 선택 

owasp-java-html-sanitizer 에서 PolicyFactory 클래스의 sanitize 메서드

public final class PolicyFactory
  ...
  public <CTX> String sanitize(
      @Nullable String html,
      @Nullable HtmlChangeListener<CTX> listener, @Nullable CTX context) {
    if (html == null) { return ""; }
    StringBuilder out = new StringBuilder(html.length());
    HtmlSanitizer.sanitize(
        html,
        apply(
            HtmlStreamRenderer.create(out, Handler.DO_NOTHING),
            listener,
            context),
        preprocessor);
    return out.toString();
  }
}

2단계 코드 파악: 선택한 메서드나 함수를 파악하고 코드가 하는 일을 요약

html 파라미터는 sanitize 대상이 된다. sanitize 된 결과는 out 변수에 담겨서 리턴된다. 허용 또는 차단하는 html tag 정책들은 이미 PolicyFactory 가 갖고 있어서 sanitize 메서드에서는 다루지 않는다. HtmlSanitizer.sanitize 메서드로 out 변수를 같이 전달한다.

 

listener 파라미터는 sanitize 대상이 되서 변경이 될 때 훅을 제공하는 인터페이스다. 

context 파라미터는 listener 노티받을 때 관련 정보를 제공해주는 객체다.

 

context 타입이 CTX 이라서 처음엔 특별한 뭔가가 있는가 했다. 그냥 일반적인 T 라고 했으면 더 빨리 이해했을거같다.

 

3단계 사용하는 표식의 적극적 확인

설명 : 읽는 도중 '아, 그렇구나'라는 생각이 들면서 그 코드의 의미를 좀 더 이해하게 되면 잠시 멈추고 왜 그렇게 생각했는지를 적어보라. 주석문, 변수명, 메서드명, 임시 저장값 등 어느 것이든 표식이 될 수 있다.

 

sanitizer 메서드명을 통해 필터링 역할을 한다는것을 알 수 있었다.

html 변수명을 통해 원문 html 문자열이 제공됨을 알 수 있었다.

listener 변수명을 통해 이벤트가 발생할 때 훅킹이 가능함을 알 수 있었다.

context 변수명은 listener 가 사용될때에만 사용가능하다는것을 알기 어려웠다. 주석을 통해서 알게 됐다.

 

4단계 회고

- 어떤 표식을 찾았는가?

sanitizer, html, listener, context, out

 

- 찾은 표식들은 코드의 요소인가, 아니면 사람의 언어로 된 정보인가?

변수명이기 때문에 코드의 요소다.

 

- 그 표식들은 무엇에 관해 알려주고 있는가?

html 문자열에 대해 sanitize 즉 필터작업을 하고 이벤트가 발생하면 등록된 listener 가 동작하고 context 정보를 활용할 수 있다. 필터작업 결과는 out 에 담긴다.

 

- 그 표식들은 코드의 도메인에 대한 지식을 나타내는가?

sanitize 네이밍이 xss filter 를 의미하는것은 누구나 바로 생각할 수 있는 범용적인 지식이 아니다. xss filter 도메인 특화된 지식이라 볼 수 있다. 나머지 html, listener,context 는 도메인에 대한 지식으로 볼 수 없다. out 은 변수명이 너무 추상적이다. 

 

- 그 표식들은 코드의 기능에 대한 지식을 나타내는가?

그렇다.

 

[청킹연습]

1단계 코드 선정

  public <CTX> HtmlSanitizer.Policy apply(
      HtmlStreamEventReceiver out, @Nullable HtmlChangeListener<CTX> listener,
      @Nullable CTX context) {
    if (listener == null) {
      return apply(out);
    } else {
      HtmlChangeReporter<CTX> r = new HtmlChangeReporter<CTX>(
          out, listener, context);
      r.setPolicy(apply(r.getWrappedRenderer()));
      return r.getWrappedPolicy();
    }
  }

2단계 코드 파악

설명: 최대 2분을 넘지 않도록 타이머를 설정하고 코드 파악. 시간이 다 되면 코드는 보지 않는다.

3단계 코드 재현

설명: 기억을 되살려 새롭게 코드를 다시 작성

public <CTX> apply(out, HtmlChangeListener listener, context) {

  if (listener == null) {
    apply(out);
  } else {
  
    r.method(out, listenr, context);
  }
}

4단계 회고

- 어느 부분을 쉽게 기억했는가?

파라미터명은 쉽게 기억했다.

 

- 부분적으로 기억한 코드가 있는가?

파라미터 타입중 하나만 기억했다.

 

- 전체를 다 기억하지 못한 코드가 있는가?

else 부분은 거의 다 기억하지 못했다.

 

- 기억하지 못한 라인들이 있다면 그 이유가 무엇일까?

파라미터 타입 HtmlStreamEventReceiver 와 HtmlChangeListener 기억하는데 시간이 소요됐다.

else 부분의 HtmlChangeReporter 타입도 익숙하지 않아서 기억하기 어려웠다.

 

- 기억하지 못한 라인에 본인이 익숙하지 않은 프로그래밍 개념이 들어 있지는 않는가?

그런건 없었다. 필요한 타입 네이밍들이 익숙하지 않았다.

 

- 기억하지 못한 라인에 본인이 익숙하지 않은 도메인 지식이 있지는 않는가?

그렇다. 이 작업을 왜 하는지, 왜 필요한지 모른채로 외우다 보니 short term memory 에 의존할 수 밖에 없었다.

반응형