2016년 12월 18일 일요일

Spring AspectJ와 java beans getter&setter로 삽질하던 이야기

java beans의 field값을 상황에 따라 조작해줘야 할 필요가 생겼다.
AES로 encrypt/decrpyt 해 줘야 하는 문제인데,
상황에 따라 몇 가지 변수가 있다.

때문에 일반적인 business layer <> persistence layer 계층으로 처리하기에는 일이 복잡해진다.

이럴 때 빛을 발하는게 AOP인데.
테스트케이스로 개발하면서 테스트해보니 JPA와 함께 잘 해결한 것처럼 "보였다."

실제 코드에 반영해보니 아뿔사.
생성된 instance가 가지고 있는 전역변수가 다른 객체의 instance인 경우에 문제가 발생하는 것이었다. 상세한 내용은 생략하지만, 의도치 않은 동작이 발생했다.


해결할 방법을 두 가지 시나리오로 정리했다.
  1. AOP로 decrypt된 instance에 field method를 부가해서 한번만 decrypt 처리를 한다.
  2. instance의 변수는 immutable로 다루고 getter를 조작해서 상황에 맞게 처리를 한다.
이리저리 검토해봤을 때, 2번 케이스가 가장 적합하다고 판단해서
domain model class의 getter들을 pointcut으로 접근하도록 advice를 만들었다.

그런데 왠걸? 아무리해도 advised methods에 getter들이 나타나지 않는게 아닌가?!

가능성을 몇 가지 생각해봤다.
  1. lombok이 문제인가?
  2. interface를 구현한 것 때문에 외부에 method signature가 노출이 안되나?
  3. pointcut advice를 잘못 작성했나?
도대체 내가 무얼 잘못 했나를 검증하며 몇 시간 씨름을 했다.

그리고 도무지 답을 찾지 못하고 stackoverflow든 어디든 도움을 요청하기 위해 케이스를 일반화시키고 있었다.

그리고는 불현듯 깨달았다.

domain model class는 spring bean이 아니며, spring bean이 되어서도 안되며 그렇기 때문에 advised methods에 getter가 나타날 수 없었다는 것.

간단한 문제(?)였다.

그나저나 이걸 어떻게 해결한다...

댓글 없음:

댓글 쓰기