diff --git a/docs/user-guide/02-arcus-java-client.md b/docs/user-guide/02-arcus-java-client.md
index be8e5bfa5..ad2918213 100644
--- a/docs/user-guide/02-arcus-java-client.md
+++ b/docs/user-guide/02-arcus-java-client.md
@@ -222,27 +222,116 @@ cache key와 cache server와의 mapping을 갱신하게 한다.
## ARCUS Client 설정
-### Key-Value에서 데이터 압축 설정
+### 데이터 직렬화 및 압축 설정
-ARCUS client는 key-value item의 데이터 압축 및 해제 기능을 가지고 있다.
-즉, 일정 크기 이상의 데이터이면 그 데이터를 압축하여 cache server에 보내어 저장하고,
-cache server로 부터 가져온 데이터가 압축 데이터이면, 해제하여 응용에 전달한다.
+ARCUS Java Client에서 Transcoder는 캐시 데이터와 Java 객체 간 직렬화/역직렬화를 담당한다.
-ARCUS client는 저정할 값의 크기가 16KB 이상일 경우에 압축하여 cache server에 저장하도록 되어 있다.
-이러한 데이터 압축 임계값은 ConnectionFactoryBuilder의 setTranscoder메소드를 통해 설정할 수 있다.
+- ConnectionFactoryBuilder의 `setTranscoder()`, `setCollectionTranscoder()`를 통해 기본 Transcoder를 설정할 수 있다.
+- 만약, 개별 API 호출 시 다른 Transcoder를 사용하고 싶다면 ArcusClient API 메서드의 인자로 직접 지정할 수 있다.
-다음은 4KB 이상의 데이터는 모두 압축하도록 설정하는 예제이다.
+#### 압축 설정
+
+- 모든 Transcoder 구현체는 압축 시 GZip 방식을 사용하며 16KB 이상의 데이터는 자동으로 압축된다.
+- 즉, 16KB 이상의 데이터는 자동으로 압축하여 캐시 서버에 저장하고, 조회 시 자동으로 해제하여 응용에 전달한다.
+
+ARCUS Java Client는 아래 세 가지 Transcoder 구현체를 제공한다.
+
+| 구현체 | 직렬화 방식 |
+| :----------------------------------- | :------------ |
+| `SerializingTranscoder` | Java 직렬화 |
+| `JsonSerializingTranscoder` | Jackson JSON |
+| `GenericJsonSerializingTranscoder` | Jackson JSON |
+
+#### SerializingTranscoder
+
+- 별도 지정이 없는 경우 기본으로 사용되는 Transcoder
+- Java 직렬화 방식을 사용하며, 압축 시 GZip 사용
+- `forKV()`, `forCollection()` 팩토리 메서드를 통해 용도에 맞게 생성 가능
+
+**Key-Value 용도**
```java
+SerializingTranscoder transcoder = SerializingTranscoder.forKV()
+ .maxSize(CachedData.MAX_SIZE) /* 1024 * 1024, 1MB */
+ .classLoader(this.getClass().getClassLoader())
+ .build();
+
+transcoder.setCharset("UTF-8");
+transcoder.setCompressionThreshold(4096);
+
ConnectionFactoryBuilder cfb = new ConnectionFactoryBuilder();
+cfb.setTranscoder(transcoder);
+```
-SerializingTranscoder trans = new SerializingTranscoder();
-trans.setCharset(“UTF-8”);
-trans.setCompressionThreshold(4096);
+**Collection 용도**
-cfb.setTranscoder(trans);
+```java
+SerializingTranscoder transcoder = SerializingTranscoder.forCollection()
+ .forceJDKSerializationForCollection()
+ .maxSize(16384)
+ .classLoader(this.getClass().getClassLoader())
+ .build();
-ArcusClient client = ArcusClient.createArcusClient(SERVICE_CODE, cfb);
+transcoder.setCharset("EUC-KR");
+transcoder.setCompressionThreshold(4096);
+
+ConnectionFactoryBuilder cfb = new ConnectionFactoryBuilder();
+cfb.setCollectionTranscoder(transcoder);
+```
+
+- ClassLoader는 역직렬화 시 사용할 ClassLoader를 지정한다.
+- Spring Devtools와 같이 별도의 ClassLoader를 사용하는 환경에서, 역직렬화 시 사용하는 ClassLoader와 프로세스의 ClassLoader를 일치시키기 위해 사용한다.
+- `null`로 지정하면 JVM 기본 ClassLoader를 사용한다.
+
+
+#### JsonSerializingTranscoder
+
+- Jackson 라이브러리를 사용하여 객체를 JSON 형식으로 직렬화/역직렬화 수행
+- `ObjectMapper`는 내부에서 생성
+- 타입 안정성을 보장하기 위해 생성자에서 특정 클래스 타입 또는 `JavaType`을 지정해야 함
+
+제네릭 타입을 `Object`로 지정하지 않으면 `setTranscoder()` 인자로 지정할 수 없으므로, ArcusClient API 메서드 인자로 직접 지정하는 것을 권장한다.
+
+삽입 및 조회 시 동일한 타입을 갖는 Transcoder를 사용해야 한다.
+
+```java
+JsonSerializingTranscoder transcoder = new JsonSerializingTranscoder<>(MyClass.class);
+arcusClient.set("key", 0, new MyClass("class1"), transcoder).get();
+MyClass myClass = arcusClient.asyncGet("key", transcoder).get();
+```
+
+> 사용자 정의 타입에 기본 생성자나 `@JsonCreator` 어노테이션이 지정된 생성자가 없으면 역직렬화 시 경고 로그와 함께 null이 반환될 수 있다.
+
+#### GenericJsonSerializingTranscoder
+
+Jackson 라이브러리를 사용하여 객체를 JSON 형식으로 직렬화/역직렬화한다.
+
+- `JsonSerializingTranscoder`와 달리 다형성 타입을 지원하여 객체의 구체적인 타입 정보를 보존할 수 있다.
+- `ObjectMapper`를 외부에서 주입해야 하며, `typeHintPropertyName`으로 타입 힌트 프로퍼티 이름을 지정할 수 있다.
+
+| `typeHintPropertyName` 값 | 동작 |
+|:-------------------------|:-----------------------------------------|
+| `null` | `ObjectMapper`의 `DefaultTyping`을 설정하지 않음 |
+| `""` (빈 문자열) | 기본 타입 프로퍼티 이름(`@class`)으로 설정 |
+| 그 외 문자열 | 해당 문자열을 타입 프로퍼티 이름으로 사용 |
+
+
+신뢰할 수 없는 JSON 입력을 처리할 경우 보안 취약점 방지를 위해 적절한 `BasicPolymorphicTypeValidator`를 설정하는 것을 권장한다.
+
+```java
+ObjectMapper objectMapper = new ObjectMapper();
+BasicPolymorphicTypeValidator validator = BasicPolymorphicTypeValidator.builder()
+ .allowIfBaseType("net.spy.memcached.") // 패키지 경로는 커스텀하게 설정
+ .allowIfSubType("net.spy.memcached.") // 패키지 경로는 커스텀하게 설정
+ .build();
+
+objectMapper.activateDefaultTyping(validator, ObjectMapper.DefaultTyping.EVERYTHING);
+
+GenericJsonSerializingTranscoder transcoder =
+ new GenericJsonSerializingTranscoder(objectMapper, "@class", CachedData.MAX_SIZE);
+
+ConnectionFactoryBuilder cfb = new ConnectionFactoryBuilder();
+cfb.setTranscoder(transcoder);
```
### Logger 설정
@@ -416,200 +505,251 @@ SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
### ConnectionFactoryBuilder 설정
+`ConnectionFactoryBuilder`는 ArcusClient의 동작 방식을 커스터마이징하기 위한 빌더 클래스다.
-- setOpQueueFactory(OperationQueueFactory q)
-
- 명령어의 내용을 담는 operation이 최초로 담기는 Input Queue의 팩토리 객체를 지정한다.
- 지정하지 않을 경우 크기가 16,384인 ArrayBlockingQueue를 생성해 사용하게 된다.
- - Arcus Java Client에서는 두 가지의 OperationQueueFactory 구현을 제공한다.
- - ArrayOperationQueueFactory
- - ArrayBlockingQueue를 생성한다.
- - 생성자의 인자를 통해 큐의 크기를 지정할 수 있다.
- - LinkedOperationQueueFactory
- - LinkedBlockingQueue를 생성한다.
- - 큐의 크기를 지정할 수 없다. LinkedBlockingQueue 자체에 큐 크기를 지정할 수 없기 때문이다.
-
-- setWriteOpQueueFactory(OperationQueueFactory q)
-
- Arcus 캐시 서버에 요청을 보내기 위해 대기 중인 operation들을 담는 Write Queue의 팩토리 객체를 지정한다.
-
-- setReadOpQueueFactory(OperationQueueFactory q)
-
- Arcus 캐시 서버로부터 응답을 받기 위해 대기 중인 operation들을 담는 Read Queue의 팩토리 객체를 지정한다.
-
-- setOpQueueMaxBlockTime(long t)
-
- 사용자의 요청이 들어오면 Operation 객체를 생성한다. Operation을 Input Queue에 등록하면, 비동기 방식으로 순차 처리된다.
- OpQueueMaxBlockTime은 Input Queue가 꽉 찬 상태가 되었을 때 사용자의 스레드가 최대 기다리는 시간을 의미한다.
- 단위는 millisecond 이고, 기본값은 10000ms이다.
-
-- setOpTimeout(long t)
-
- Future의 get() 메서드에서 캐시 서버로부터의 응답을 대기하는 최대 시간을 지정한다. 단위는 millisecond 이고, 기본값은 700ms이다.
- 기본 값을 사용하면 Future에서 `get()` 메서드 호출과 `get(700, TimeUnit.MILLISECONDS)` 메서드 호출이 동일하게 동작한다.
-
-- setTranscoder(Transcoder\