Spring 동시성 처리를 위해 Redisson을 사용하다 Redisson에서 Key를 사용하기 위한 Entity별 키 인터페이스를 구성하였다.
현재 구성한 key 생성 메서드는 다음과 같다
@Override
public String getKey(String... args) {
StringBuffer key = new StringBuffer(domain);
String[] components = args;
for (String comp : components) {
key.append("_");
key.append(comp);
}
return key.toString();
}
이때 키 같은 경우 "Entity 이름(domain)" + "구분자 1" + ... "구분자 N" 과 같이 딱 정형화된 틀이 있다.
위 코드의 문제점은 해당 메서드를 사용하는 사용자가 잘못된 순서나 잘못된 형식으로 파라미터를 입력해도 키가 그대로 생성되고 사용자는 의심 없이 사용하게 된다는 점이다.
이렇게 된다면 내부 틀을 아는 사용자만이 해당 메서드를 사용할 수 있고 메서드를 사용하는 시기에 틀에 맞춰 파라미터를 입력해야 하니 안정성이 취약해진다.
즉 안전하고 일관된 키 생성을 추구하려면 메서드에서 정형화된 틀을 제공해주고 이를 어긴다면 컴파일 시점에서 에러를 보여줘야한다.
초기 접근
초기에는 엔티티 객체 자체를 파라미터로 넘겨 해당 메소드 안에서 형식에 맞게 키를 생성해주는 방식을 선택했다.
이 방식은 redisson을 사용한 동시성 처리와 같이 사용하는데 문제가 있었다.
redisson을 사용한 동시성 처리는 동시성 처리가 필요한 튜플을 접근하기전 특정하여 이를 동기적으로 처리하는 방식이고 이때 튜플들을 구분하기 위해 키를 사용한다.
즉 키를 먼저 생성해야 튜플에 접근하고 엔티티를 획득할 수 있으니 (구분되는 키 -> 엔티티 접근) 엔티티를 사용하여 키를 생성하는 것은 동시성 처리 순서에 부합하지 않는 것이다.
메서드 파라미터
메서드 파라미터의 제한으로 한계가 있어 보인다. 파라미터로 제약할 수 있는 부분은 파라미터의 '타입값'과 '수'인데 만약 구분자의 종류가 둘다 Integer 인 두 개의 mapId, robotId 구분자가 있을 경우 두 구분자의 순서를 파라미터로 제한할 수 있는 방법은 없다.
Spring 동시성 처리를 위해 Redisson을 사용하다 Redisson에서 Key를 사용하기 위한 Entity별 키 인터페이스를 구성하였다.
현재 구성한 key 생성 메서드는 다음과 같다
이때 키 같은 경우
"Entity 이름(domain)" + "구분자 1" + ... "구분자 N"과 같이 딱 정형화된 틀이 있다.위 코드의 문제점은 해당 메서드를 사용하는 사용자가 잘못된 순서나 잘못된 형식으로 파라미터를 입력해도 키가 그대로 생성되고 사용자는 의심 없이 사용하게 된다는 점이다.
이렇게 된다면 내부 틀을 아는 사용자만이 해당 메서드를 사용할 수 있고 메서드를 사용하는 시기에 틀에 맞춰 파라미터를 입력해야 하니 안정성이 취약해진다.
즉 안전하고 일관된 키 생성을 추구하려면 메서드에서 정형화된 틀을 제공해주고 이를 어긴다면 컴파일 시점에서 에러를 보여줘야한다.
초기 접근
초기에는 엔티티 객체 자체를 파라미터로 넘겨 해당 메소드 안에서 형식에 맞게 키를 생성해주는 방식을 선택했다.
이 방식은 redisson을 사용한 동시성 처리와 같이 사용하는데 문제가 있었다.
redisson을 사용한 동시성 처리는 동시성 처리가 필요한 튜플을 접근하기전 특정하여 이를 동기적으로 처리하는 방식이고 이때 튜플들을 구분하기 위해 키를 사용한다.
즉 키를 먼저 생성해야 튜플에 접근하고 엔티티를 획득할 수 있으니 (구분되는 키 -> 엔티티 접근) 엔티티를 사용하여 키를 생성하는 것은 동시성 처리 순서에 부합하지 않는 것이다.
메서드 파라미터
메서드 파라미터의 제한으로 한계가 있어 보인다. 파라미터로 제약할 수 있는 부분은 파라미터의 '타입값'과 '수'인데 만약 구분자의 종류가 둘다 Integer 인 두 개의 mapId, robotId 구분자가 있을 경우 두 구분자의 순서를 파라미터로 제한할 수 있는 방법은 없다.