Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
227 changes: 30 additions & 197 deletions docs/user-guide/02-arcus-java-client.md
Original file line number Diff line number Diff line change
Expand Up @@ -416,200 +416,33 @@ SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

### ConnectionFactoryBuilder ์„ค์ •


- 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\<Object\> t)

Key-Value ํƒ€์ž…์˜ ์บ์‹œ ๋ฐ์ดํ„ฐ์™€ ์ž๋ฐ” ๊ฐ์ฒด ํƒ€์ž… ๊ฐ„ ๋ณ€ํ™˜ ์‹œ์— ์‚ฌ์šฉํ•  Transcoder๋ฅผ ์ง€์ •ํ•œ๋‹ค.

#### SerializingTranscoder
- ๋ณ„๋„๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ด ํƒ€์ž…์„ ์‚ฌ์šฉํ•œ๋‹ค.
- ์••์ถ• ์‹œ GZip ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉฐ, Character set, ์••์ถ• ๊ธฐ์ค€, ClassLoader๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
- Character set๊ณผ ์••์ถ• ๊ธฐ์ค€์€ setter๋กœ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค. Character set์˜ ๊ธฐ๋ณธ๊ฐ’์€ UTF-8์ด๋‹ค.
์••์ถ• ๊ธฐ์ค€์˜ ๋‹จ์œ„๋Š” byte์ด๋ฉฐ, ๊ธฐ๋ณธ๊ฐ’์€ 16,384bytes์ด๋‹ค.
```java
SerializingTranscoder transcoder = new SerializingTranscoder();
transcoder.setCharset("EUC-KR");
transcoder.setCompressionThreshold(4096);

ConnectionFactoryBuilder cfb = new ConnectionFactoryBuilder();
cfb.setTranscoder(transcoder);
```
- ClassLoader๋Š” ์ƒ์„ฑ์ž ์ธ์ž๋กœ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค. Spring Devtools์™€ ๊ฐ™์ด ํด๋ž˜์Šค๋กœ๋”๋ฅผ ๋ณ„๋„๋กœ ๋‘๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ,
์บ์‹œ์—์„œ ์กฐํšŒํ•˜์—ฌ ์—ญ์ง๋ ฌํ™” ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค ๋กœ๋”์™€ ํ”„๋กœ์„ธ์Šค์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
```java
SerializingTranscoder tc = new SerializingTranscoder(CachedData.MAX_SIZE, this.getClass().getClassLoader());
```

#### JsonSerializingTranscoder
- ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ Object๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด setTranscoder ๋ฉ”์„œ๋“œ ์ธ์ž๋กœ ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค.
๋”ฐ๋ผ์„œ ArcusClient API ๋ฉ”์„œ๋“œ ์ธ์ž๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. ์‚ฝ์ž… ๋ฐ ์กฐํšŒ ์‹œ ๋™์ผํ•œ ํƒ€์ž…์„ ๊ฐ–๋Š” transcoder๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
```java
JsonSerializingTranscoder<MyClass> transcoder = new JsonSerializingTranscoder<>(MyClass.class);
arcusClient.set("key", 0, new MyClass("class1"), transcoder).get();
MyClass myClass = arcusClient.asyncGet("key", transcoder).get();
```
- Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ JSON ํ˜•์‹์œผ๋กœ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”ํ•œ๋‹ค.
- ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ์ž์—์„œ ํŠน์ • ํด๋ž˜์Šค ํƒ€์ž… ๋˜๋Š” JavaType์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
- ๊ธฐ๋ณธ ํƒ€์ž…(String, Integer, Long, Boolean, Date ๋“ฑ)์€ ๋ฐ”๋กœ ์ง๋ ฌํ™”ํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ๊ฐ์ฒด๋Š” JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ง๋ ฌํ™”ํ•œ๋‹ค.
์ด ๋•Œ ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…์— ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋‚˜ `@JsonCreator` ์–ด๋…ธํ…Œ์ด์…˜์ด ์ง€์ •๋œ ์ƒ์„ฑ์ž๊ฐ€ ์—†์œผ๋ฉด ์›Œ๋‹ ๋กœ๊ทธ์™€ ํ•จ๊ป˜ ์—ญ์ง๋ ฌํ™” ์‹œ null์ด ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•œ๋‹ค.
- ์••์ถ• ์‹œ GZip ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉฐ, Character set, ์••์ถ• ๊ธฐ์ค€์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
- Character set๊ณผ ์••์ถ• ๊ธฐ์ค€์€ setter๋กœ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค. Character set์˜ ๊ธฐ๋ณธ๊ฐ’์€ UTF-8์ด๋‹ค.

#### GenericJsonSerializingTranscoder
- Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ JSON ํ˜•์‹์œผ๋กœ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”ํ•œ๋‹ค.
- ๊ธฐ๋ณธ ํƒ€์ž…(String, Integer, Long, Boolean, Date ๋“ฑ)์€ ๋ฐ”๋กœ ์ง๋ ฌํ™”ํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ๊ฐ์ฒด๋Š” JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ง๋ ฌํ™”ํ•œ๋‹ค.
์ด ๋•Œ ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…์— ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋‚˜ `@JsonCreator` ์–ด๋…ธํ…Œ์ด์…˜์ด ์ง€์ •๋œ ์ƒ์„ฑ์ž๊ฐ€ ์—†์œผ๋ฉด ์›Œ๋‹ ๋กœ๊ทธ์™€ ํ•จ๊ป˜ ์—ญ์ง๋ ฌํ™” ์‹œ null์ด ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•œ๋‹ค.
- ๋‹คํ˜•์„ฑ ํƒ€์ž…์„ ์ง€์›ํ•˜์—ฌ ๊ฐ์ฒด์˜ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž… ์ •๋ณด๋ฅผ ๋ณด์กดํ•  ์ˆ˜ ์žˆ๋‹ค.
- ์ƒ์„ฑ์ž์—์„œ ObjectMapper์™€ ํƒ€์ž… ํžŒํŠธ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. DefaultTyping์ด ์„ค์ •๋˜์ง€ ์•Š์€ ObjectMapper ์‚ฌ์šฉ ์‹œ ํƒ€์ž… ํžŒํŠธ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
- ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” JSON ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ ์ ์ ˆํ•œ BasicPolymorphicTypeValidator๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.
```java
ObjectMapper objectMapper = new ObjectMapper();
BasicPolymorphicTypeValidator validator = BasicPolymorphicTypeValidator.builder()
.allowIfBaseType("net.spy.memcached.") // ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ๋Š” ์ปค์Šคํ…€ํ•˜๊ฒŒ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
.allowIfSubType("net.spy.memcached.") // ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ๋Š” ์ปค์Šคํ…€ํ•˜๊ฒŒ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
.build();
GenericJsonSerializingTranscoder transcoder =
new GenericJsonSerializingTranscoder(objectMapper, "@class", CachedData.MAX_SIZE);

ConnectionFactoryBuilder cfb = new ConnectionFactoryBuilder();
cfb.setTranscoder(transcoder);
```

- setCollectionTranscoder(Transcoder\<Object\> t)

Collection ํƒ€์ž…์˜ ์บ์‹œ ๋ฐ์ดํ„ฐ์™€ ์ž๋ฐ” ๊ฐ์ฒด ํƒ€์ž… ๊ฐ„ ๋ณ€ํ™˜ ์‹œ์— ์‚ฌ์šฉํ•  Transcoder๋ฅผ ์ง€์ •ํ•œ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ SerializingTranscoder ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, Character set, ClassLoader๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
setTranscoder ๋ฉ”์„œ๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ GenericJsonSerializingTranscoder๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

- ๋นŒ๋”๋ฅผ ํ†ตํ•ด SerializingTranscoder๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
```java
SerializingTranscoder transcoder = SerializingTranscoder.forCollection()
.forceJDKSerializationForCollection()
.maxSize(16384)
.classLoader(this.getClass().getClassLoader())
.build();
```

- Character set์€ ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ setter๋ฅผ ์‚ฌ์šฉํ•ด ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค. Character set์˜ ๊ธฐ๋ณธ๊ฐ’์€ UTF-8์ด๋‹ค.
```java
transcoder.setCharset("EUC-KR");

ConnectionFactoryBuilder cfb = new ConnectionFactoryBuilder();
cfb.setCollectionTranscoder(transcoder);
```

- setShouldOptimize(boolean o)

์ตœ์ ํ™” ๋กœ์ง ์‚ฌ์šฉ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ด๋‹ค. **optimize ๋กœ์ง ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค.**
Operation Queue์— ์—ฐ์†ํ•ด์„œ ์กด์žฌํ•˜๋Š” get ์—ฐ์‚ฐ๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ์ตœ๋Œ€ 100๊ฐœ์˜ ํ‚ค๊ฐ€ ๋‹ด๊ธด ํ•˜๋‚˜์˜ ์š”์ฒญ์œผ๋กœ ARCUS์— ์ „๋‹ฌ๋œ๋‹ค.

- setReadBufferSize(int to)

ARCUS ์บ์‹œ ์„œ๋ฒ„์™€ ์†Œ์ผ“ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ „์—ญ ByteBuffer ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•œ๋‹ค. ๋‹จ์œ„๋Š” byte์ด๋ฉฐ, ๊ธฐ๋ณธ๊ฐ’์€ 16,384์ด๋‹ค.
(์ด๋ฆ„์€ Read์ด์ง€๋งŒ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ฒ„ํผ ๋ชจ๋‘ ์ด ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.)
๋งŒ์•ฝ ByteBuffer ํฌ๊ธฐ๋ฅผ ๋„˜์–ด์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋„˜์–ด์˜ค๋ฉด ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ByteBuffer ํฌ๊ธฐ๋งŒํผ ์ฒ˜๋ฆฌํ•œ ํ›„
ByteBuffer์˜ ๋‚ด์šฉ์„ ๋น„์šฐ๊ณ , ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๋„๋ก ๋˜์–ด ์žˆ๋‹ค.

- setDaemon(boolean d)

Memcached I/O ์Šค๋ ˆ๋“œ๋ฅผ Daemon์œผ๋กœ ์‚ฌ์šฉํ•  ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true์ด๋‹ค.

- setMaxReconnectDelay(long to)

Arcus ์บ์‹œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์–ด๋– ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์—ฐ๊ฒฐ์„ ๋Š๊ณ  reconnect๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ ์–ผ๋งˆ ๋™์•ˆ์˜ ์ง€์—ฐ์„ ๋‘˜ ์ง€ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
reconnect๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ฆ‰์‹œ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ผ์ • ์‹œ๊ฐ„ ํ›„์— ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ์ด ๋ฉ”์„œ๋“œ์—์„œ๋Š” Arcus ์บ์‹œ ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ ๋ถ€๋ถ„์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ
์ผ์ • ์‹œ๊ฐ„ ํ›„ Reconnect๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์„ค์ •์„ ํ•œ๋‹ค.
๋‹จ์œ„๋Š” second์ด๋ฉฐ, ๊ธฐ๋ณธ๊ฐ’์€ 1์ดˆ์ด๋‹ค.

- setTimeoutExceptionThreshold(int to) / setTimeoutDurationThreshold(int to)

์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋„์ค‘ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ reconnect๊ฐ€ ์ ์ ˆํžˆ ์ˆ˜ํ–‰๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด threshold๋ฅผ ์ง€์ •ํ•œ๋‹ค.

๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด reconnect๋ฅผ ์‹œ๋„ํ•œ๋‹ค.
- ์ฒซ Timeout์ด ๋ฐœ์ƒํ•œ ์‹œ์ ๋ถ€ํ„ฐ ํ˜„์žฌ ์‹œ์ ๊นŒ์ง€ timeout์ด ์ง€์†์ ์œผ๋กœ TimeoutExceptionThreshold๊ฐœ ์ด์ƒ ๋ฐœ์ƒํ•˜๋Š” ์ค‘์ด๋‹ค.
- ์ฒซ Timeout์ด ๋ฐœ์ƒํ•œ ์‹œ์ ๋ถ€ํ„ฐ ํ˜„์žฌ ์‹œ์ ๊นŒ์ง€์˜ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์ด TimeoutDurationThreshold ๊ธฐ๊ฐ„๋ณด๋‹ค ๊ธธ๋‹ค.

๋™์ž‘ ์›๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
- reconnect๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜๋ฉด ์—ฐ๊ฒฐ์ด ๋Š๊ธด ์ƒํƒœ๊ฐ€ ๋˜๋ฏ€๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ์ž‘์—…์— ๋Œ€ํ•ด timeout์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋Œ€์‹  ์‹คํŒจ ์‘๋‹ต์„ ๋น ๋ฅด๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
- ๋„คํŠธ์›Œํฌ ์ˆœ๋‹จ์ด ์ง€์†๋  ๊ฒฝ์šฐ reconnect๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹คํŒจํ•˜๋ฏ€๋กœ ์ด ๋•Œ์— ๋“ค์–ด์˜จ ์š”์ฒญ ์—ญ์‹œ ์‹คํŒจ ์‘๋‹ต์„ ๋น ๋ฅด๊ฒŒ ๋ฐ˜ํ™˜๋ฐ›๊ฒŒ ๋œ๋‹ค.
- ์ผ์‹œ์ ์œผ๋กœ Burst ํŠธ๋ž˜ํ”ฝ์ด ๋ฐœ์ƒํ•  ๋•Œ ๋„คํŠธ์›Œํฌ ์žฅ๋น„ ํ˜น์€ ๋Œ€์—ญํญ์œผ๋กœ ์ธํ•ด ์—ฐ์†์ ์ธ timeout์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” ๋„คํŠธ์›Œํฌ ์ˆœ๋‹จ์ด ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ 
๋ณด๊ธฐ ์–ด๋ ค์šฐ๋ฏ€๋กœ reconnect๋ฅผ ์‹œ๋„ํ•ด๋„ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” reconnect๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
- ์—ฐ์†์ ์ธ timeout์ด TimeoutDurationThreshold ์ด์ƒ์œผ๋กœ ์ง€์†๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜์—ฌ reconnect๋ฅผ ์‹œ๋„ํ•œ๋‹ค.

๊ฐ ์ธ์ž์˜ ๋‹จ์œ„์™€ ๊ธฐ๋ณธ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
- TimeoutExceptionThreshold Timeout์˜ ๋ฐœ์ƒ ํšŸ์ˆ˜๋ฅผ ๋‹จ์œ„๋กœ ํ•˜๊ณ , ๊ธฐ๋ณธ๊ฐ’์€ 10์ด๋ฉฐ, 2 ์ด์ƒ ๊ฐ’์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
- TimeoutDurationThreshold์˜ ๋‹จ์œ„๋Š” millisecond ์ด๊ณ  ๊ธฐ๋ณธ๊ฐ’์€ 1600ms์ด๋‹ค.
0์„ ์ง€์ •ํ•ด ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜, 1000 ~ 5000 ์‚ฌ์ด์˜ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ์‹œ ์ƒํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
- TimeoutDurationThreshold๋ฅผ 1000์œผ๋กœ ์„ค์ •ํ•˜๊ณ  TimeoutExceptionThreshold๋ฅผ 10์œผ๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ,
1์ดˆ ๋™์•ˆ 10ํšŒ ์ด์ƒ์˜ timeout์ด ์—ฐ์†์ ์œผ๋กœ ๋ฐœ์ƒํ–ˆ๊ณ  ํ˜„์žฌ๊นŒ์ง€๋„ timeout์ด ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ, reconnect๋ฅผ ์‹œ๋„ํ•œ๋‹ค.
- TimeoutDurationThreshold๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๊ณ  TimeoutExceptionThreshold๋ฅผ 100๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ,
100ํšŒ ์ด์ƒ์˜ timeout์ด ์—ฐ์†์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋ฉด reconnect๋ฅผ ์‹œ๋„ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ •๋ง ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์ด๋”๋ผ๋„
reconnect๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ burst ํŠธ๋ž˜ํ”ฝ ์š”์ฒญ์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋ฉด TimeoutDurationThreshold๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

- setDelimiter(byte to)

Arcus ์บ์‹œ ์„œ๋ฒ„์— `-D <char>` ์˜ต์…˜์œผ๋กœ Prefix์™€ Subkey๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ๋ถ„์ž๋ฅผ ์ง์ ‘ ์ง€์ •ํ•œ ๊ฒฝ์šฐ
Arcus Java Client์—์„œ๋„ ๋™์ผํ•œ ๊ตฌ๋ถ„์ž๋ฅผ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์„œ๋ฒ„์— ์˜ต์…˜์„ ์ฃผ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ง€์ •ํ•  ํ•„์š” ์—†์œผ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ’์€ ์ฝœ๋ก (`:`)์ด๋‹ค.

- setKeepAlive(boolean on)

Arcus ์บ์‹œ ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ์„ TCP KeepAlive ์˜ต์…˜์„ ํ†ตํ•ด ์œ ์ง€ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ด๋‹ค.
์ด ์˜ต์…˜์„ true๋กœ ์„ค์ •ํ•˜๋ฉด, ARCUS ์บ์‹œ ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
์žฅ์‹œ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์ด ์—†๋Š” TCP ์—ฐ๊ฒฐ์„ ๊ฐ•์ œ ์ข…๋ฃŒํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์ฃผ๊ธฐ์ ์ธ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐœ์ƒ์‹œ์ผœ ๊ฐ•์ œ ์ข…๋ฃŒ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

- setDnsCacheTtlCheck(boolean dnsCacheTtlCheck)

ARCUS Java Client ๊ตฌ๋™ ์‹œ์— DNS ์บ์‹œ TTL ๊ฒ€์ฆ์„ ํ™œ์„ฑํ™”ํ•  ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•œ๋‹ค.
๊ธฐ๋ณธ๊ฐ’์€ true์ด๋‹ค. ZooKeeper Ensemble์„ ๋„๋ฉ”์ธ ์ฃผ์†Œ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ, DNS์— ๋งคํ•‘๋œ IP ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜์˜๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด
DNS Cache TTL ๊ฐ’์ด 0 ~ 300์ดˆ ๋‚ด์— ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•œ๋‹ค.

- enableShardKey(boolean shardKey)

์บ์‹œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋А ๋…ธ๋“œ์— ์ €์žฅ๋ ์ง€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ‚ค ์ „์ฒด๋ฅผ ํ•ด์‹ฑํ•˜์—ฌ ๊ฒฐ์ •ํ•œ๋‹ค.
ํ‚ค์˜ ์ผ๋ถ€๋งŒ์„ ๊ธฐ์ค€์œผ๋กœ ํ•ด์‹ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, shardKey ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•œ๋‹ค.
ํ‚ค ๋ฌธ์ž์—ด์—์„œ ๊ฐ€์žฅ ์ฒซ `{`์™€ ๊ฐ€์žฅ ์ฒซ `}` ์‚ฌ์ด์˜ ๋ฌธ์ž๋กœ๋งŒ ํ•ด์‹ฑํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ๊ฒฐ์ •ํ•˜๋ฏ€๋กœ, ํ•ด์‹ฑ์„ ์›ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ค‘๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ๋ฉด ๋œ๋‹ค.
๋งŒ์•ฝ shard key๋ฅผ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ธฐ์กด๋Œ€๋กœ ์ „์ฒด ํ‚ค๋ฅผ ํ•ด์‹ฑํ•œ๋‹ค.

- setAuthDescriptor(AuthDescriptor to);

Arcus ์บ์‹œ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ ์‹œ SASL ์ธ์ฆ์„ ์‹œ๋„ํ•œ๋‹ค. ์ธ์ฆ์— ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ณ  1์ดˆ ๋’ค ์žฌ์‹œ๋„ํ•œ๋‹ค.
ํ˜„์žฌ scramSha256 ๋ฐฉ์‹๋งŒ ์ง€์›๋œ๋‹ค.
```java
ConnectionFactoryBuilder cfb = new ConnectionFactoryBuilder();
cfb.setAuthDescriptor(AuthDescriptor.scramSha256("username", "password"));
```

- Front Cache ์„ค์ •์€ ๋ณ„๋„ [๋ฌธ์„œ](11-front-cache.md#์‚ฌ์šฉ๋ฒ•)์— ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค.
`ConnectionFactoryBuilder`๋Š” ArcusClient์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๊ธฐ ์œ„ํ•œ ๋นŒ๋” ํด๋ž˜์Šค๋‹ค.

> ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ [ConnectionFactoryBuilder ๋ฌธ์„œ](13-connection-factory.md)๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

| Method | Description | Default | Unit | Note |
|:------------------------------------------------|:------------------------------------------------------|:-----------------------------|:------|:------------------------------|
| `setOpQueueFactory(OperationQueueFactory)` | Input Queue์˜ ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด ์„ค์ • | `ArrayOperationQueueFactory` | | ํฌ๊ธฐ: 16,384 |
| `setWriteOpQueueFactory(OperationQueueFactory)` | Write Queue์˜ ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด ์„ค์ • | `ArrayOperationQueueFactory` | | ํฌ๊ธฐ: 16,384 |
| `setReadOpQueueFactory(OperationQueueFactory)` | Read Queue์˜ ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด ์„ค์ • | `ArrayOperationQueueFactory` | | ํฌ๊ธฐ: 16,384 |
| `setOpQueueMaxBlockTime(long)` | Input Queue๊ฐ€ ๊ฐ€๋“ ์ฐฌ ์ƒํƒœ์ผ ๋•Œ ์œ ์ € ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐํ•˜๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„ | 10,000 | ms | |
| `setTranscoder(Transcoder<Object>)` | Key-Value ํƒ€์ž…์˜ ์บ์‹œ ๋ฐ์ดํ„ฐ์™€ Java ๊ฐ์ฒด ๊ฐ„ ๋ณ€ํ™˜์„ ์œ„ํ•œ Transcoder | SerializingTranscoder | | |
| `setCollectionTranscoder(Transcoder<Object>)` | Collection ํƒ€์ž…์˜ ์บ์‹œ ๋ฐ์ดํ„ฐ์™€ Java ๊ฐ์ฒด ๊ฐ„ ๋ณ€ํ™˜์„ ์œ„ํ•œ Transcoder | SerializingTranscoder | | |
| `setOpTimeout(long)` | `Future.get()` ํ˜ธ์ถœ ์‹œ ์บ์‹œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋Œ€๊ธฐํ•˜๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„ | 700 | ms | |
| `setShouldOptimize(boolean)` | Operation Queue ๋‚ด ์—ฐ์†๋œ GET Operation์„ ์กฐํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์š”์ฒญ์œผ๋กœ ์ฒ˜๋ฆฌ | false | | ์‚ฌ์šฉ ๋น„๊ถŒ์žฅ |
| `setReadBufferSize(int)` | ์บ์‹œ ์„œ๋ฒ„์™€ ์†Œ์ผ“ ํ†ต์‹  ์‹œ ์‚ฌ์šฉ๋˜๋Š” ์ „์—ญ ByteBuffer ํฌ๊ธฐ | 16,384 | bytes | ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ฒ„ํผ ๋ชจ๋‘ ์ด ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ์„ฑ๋จ |
| `setDaemon(boolean)` | Memcached I/O ์Šค๋ ˆ๋“œ๋ฅผ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋กœ ์„ค์ • | true | | ๊ธฐ๋ณธ๊ฐ’(true) ์œ ์ง€ ๊ถŒ์žฅ |
| `setUseNagleAlgorithm(boolean)` | Nagle ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ ์—ฌ๋ถ€ (false = TCP NoDelay ํ™œ์„ฑํ™”) | false | | |
| `setMaxReconnectDelay(long)` | ์บ์‹œ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์žฌ์—ฐ๊ฒฐ ์ „ ๋Œ€๊ธฐ ์‹œ๊ฐ„ | 1 | s | |
| `setTimeoutExceptionThreshold(int)` | ์žฌ์—ฐ๊ฒฐ ์กฐ๊ฑด ํŒ๋‹จ ์‹œ ์—ฐ์† Timeout ๋ฐœ์ƒ ํšŸ์ˆ˜ ์ž„๊ณ„๊ฐ’ | 10 | count | ์ตœ์†Ÿ๊ฐ’: 2 |
| `setTimeoutDurationThreshold(int)` | ์žฌ์—ฐ๊ฒฐ ์กฐ๊ฑด ํŒ๋‹จ ์‹œ ์ฒซ Timeout๋ถ€ํ„ฐ ํ˜„์žฌ๊นŒ์ง€์˜ ์ง€์† ์‹œ๊ฐ„ ์ž„๊ณ„๊ฐ’ | 1,600 | ms | 0: ๋น„ํ™œ์„ฑํ™”, ์ œํ•œ ๋ฒ”์œ„: 1,000~5,000 |
| `setDelimiter(byte)` | ์บ์‹œ ์„œ๋ฒ„ `-D <char>` ์˜ต์…˜์œผ๋กœ ์ง€์ •๋œ Prefix/Subkey ๊ตฌ๋ถ„์ž | `:` | | ์„œ๋ฒ„ ์˜ต์…˜๊ณผ ๋ฐ˜๋“œ์‹œ ์ผ์น˜ํ•ด์•ผ ํ•จ |
| `setKeepAlive(boolean)` | ์บ์‹œ ์„œ๋ฒ„์™€์˜ TCP KeepAlive ์˜ต์…˜ ์„ค์ • | false | | |
| `setDnsCacheTtlCheck(boolean)` | ๊ตฌ๋™ ์‹œ DNS ์บ์‹œ TTL ๊ฒ€์ฆ ํ™œ์„ฑํ™” ์—ฌ๋ถ€ | true | | ZooKeeper๋ฅผ ๋„๋ฉ”์ธ ์ฃผ์†Œ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ ์œ ํšจ |
| `enableShardKey(boolean)` | ํ‚ค์˜ `{`, `}` ๋กœ ๊ฐ์‹ธ์ง„ ๋ถ€๋ถ„๋งŒ์„ ํ•ด์‹ฑ ๋Œ€์ƒ์œผ๋กœ ์‚ฌ์šฉ | false | | |
| `setAuthDescriptor(AuthDescriptor)` | ์บ์‹œ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์‹œ SASL ์ธ์ฆ์„ ์œ„ํ•œ AuthDescriptor | null | | ํ˜„์žฌ `scramSha256` ๋งŒ ์ง€์› |
| `setMaxFrontCacheElements(int)` | Front Cache์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์•„์ดํ…œ ์ˆ˜ | 0 | items | 0: ๋น„ํ™œ์„ฑํ™” |
| `setFrontCacheExpireTime(int)` | Front Cache ์•„์ดํ…œ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ | 5 | s | |
| `setReadPriority(ReadPriority)` | Replication ํ™˜๊ฒฝ์—์„œ ์ฝ๊ธฐ ์š”์ฒญ์˜ ์šฐ์„ ์ˆœ์œ„ ์„ค์ • | MASTER | | |
| `setAPIReadPriority(APIType, ReadPriority)` | Replication ํ™˜๊ฒฝ์—์„œ API ํƒ€์ž…๋ณ„ ์ฝ๊ธฐ ์šฐ์„ ์ˆœ์œ„ ์„ค์ • | - | | `setReadPriority`๋ณด๋‹ค ์šฐ์„  ์ ์šฉ๋จ |
| `setFailureMode(FailureMode)` | ๋…ธ๋“œ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋™์ž‘ ๋ฐฉ์‹ ์„ค์ • | Cancel | | `Cancel`๋งŒ ์ •์ƒ ๋™์ž‘ |
Loading