Agile Java Lesson 12

기본

리플렉션과 다른 상급 주제

1. mocking

의존성 관계가 있는 클래스에서 어느 한 쪽을 테스트 해야할 땐 다른 한 쪽을 mocking 합니다. 예제에선 Account 클래스를 테스트 하기 위해 Ach 인터페이스를 부분 구현해 간단하게 테스트 하고 있습니다.

인터페이스를 구현하면 선언된 모든 메소드를 구현해야 하는데, 테스트에서 메소드 몇 개 쓰기 위해 전부 구현하는건 불필요해 보입니다. 적어도 테스트에서 사용하는건 필요한 것만 있는게 좋겠죠. 그래서 Adapter 클래스를 사용합니다.

Ach 인터페이스를 구현하는 MockAch(Adapter) 더미 클래스를 만든 후 실제 테스트에선 MockAch 클래스에서 필요한 메소드만 오버라이딩 합니다. 이때 오버라이딩 하는 새로운 클래스를 만들면 배보다 배꼽이 더 큰 격이고 익명 클래스를 사용합니다.

2. anonymous class

익명 클래스는 코드 블럭을 { } 파라미터로 넘기기 때문에 오버라이딩한 객체를 쓰는 것 보다 self-description 합니다. 하지만 너무 남용하거나 크기가 커질 경우 코드가 복잡해져 오히려 코드를 읽기 어려워 집니다.

또한 익명 클래스는 call-back 형식으로 필요할 때 호출되기 때문에 메소드의 지역 변수를 사용할 경우 익명 클래스가 사용하기도 전에 참조가 없어질 수도 있습니다. 따라서 익명 클래스에서 메소드의 지역 변수를 사용하려면 꼭 final로 선언해야 합니다. 그래야 레퍼런스를 복사해서 가지고 있어도 안전하니까요.

트레이드오프(중복 vs 코드 가독성)에 관한 저자의 커멘트.

중복을 줄이는 것이 안전한 길이다. 중복을 줄이면, 관리를 위한 비용을 줄일 수 있다.

3. reflection

JUnit3의 작명 규칙을 예를 들어 자바 리플렉션을 설명합니다. 리플렉션은 런타임 시에 클래스 메타데이터와 객체의 스냅샷을 알아낼 수 있는 강력한 API 입니다. 하지만 이런 강력함이 컴파일 할 때는 알 수 없는 오류를 만들 수 있고 가독성이 떨어지며 디버그하기 어렵기 때문에 코드를 방어적으로 작성하라고 합니다.

4. dynamic proxy

사용자 권한 별로 메소드 접근을 제어하기 위해 프록시 패턴을 사용하는 부분입니다. 어떤 사용자가 어떤 메소드를 호출할 지 알 수 없기 때문에 접근을 제어할 객체와 접근 가능한 정보를 Proxy 객체에 설정해 놓고 클라이언트가 메소드를 호출할 때 InvocationHandler에서 hooking해 접근 여부를 판단합니다. 자바 API에서 Proxy, InvocationHandler를 제공해 주기 때문에 정보만 잘 설정해서 쓰면 됩니다.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중