The codec framework

10.1 ์ฝ”๋ฑ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๋ชจ๋“  ๋„คํŠธ์›Œํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ”ผ์–ด ๊ฐ„์— ์ „์†ก๋˜๋Š” ์›์‹œ ๋ฐ”์ดํŠธ๋ฅผ ๋Œ€์ƒ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ณ€ํ™˜ ๋กœ์ง์€ ์ฝ”๋ฑ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ์ฝ”๋ฑ์€ ๊ฐ๊ฐ ํ•œ ํ˜•์‹์˜ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์„ ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ธ์ฝ”๋”์™€ ๋””์ฝ”๋”๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ธ์ฝ”๋”๋Š” ์†ก์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋””์ฝ”๋”๋Š” ์ˆ˜์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

10.2 ๋””์ฝ”๋”

์ด ํด๋ž˜์Šค๋Š” ๋‘ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค:

  • ๋ฐ”์ดํŠธ๋ฅผ ๋ฉ”์‹œ์ง€๋กœ ๋””์ฝ”๋”ฉํ•˜๋Š” ByteToMessageDecoder์™€ ReplayingDecoder

  • ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€ ํ˜•์‹์„ ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€ ํ˜•์‹์œผ๋กœ ๋””์ฝ”๋”ฉํ•˜๋Š” MessageToMessageDecoder

๋””์ฝ”๋”๋Š” ์ˆ˜์‹  ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ํ˜•์‹์—์„œ ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ฑ…์ž„์„ ์ง€๊ธฐ ๋•Œ๋ฌธ์—, Netty์˜ ๋””์ฝ”๋”๋Š” ChannelInboundHandler๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

10.2.1 ์ถ”์ƒ ํด๋ž˜์Šค ByteToMessageDecoder

๋ฐ”์ดํŠธ๋ฅผ ๋ฉ”์‹œ์ง€๋กœ ๋˜๋Š” ๋‹ค๋ฅธ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋กœ ๋””์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์—, Netty๋Š” ์ด๋ฅผ ์œ„ํ•œ ์ถ”์ƒ ๊ธฐ๋ณธ ํด๋ž˜์Šค์ธ ByteToMessageDecoder๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

class ToIntegerDecoder : ByteToMessageDecoder() {
    override fun decode(ctx: ChannelHandlerContext, `in`: ByteBuf, out: List<Any>) {
        if (`in`.readableBytes() >= 4) {
            out + `in`.readInt()
        }
    }
}

10.2.2 ์ถ”์ƒ ํด๋ž˜์Šค ReplayingDecoder

ReplayingDecoder๋Š” ByteToMessageDecoder๋ฅผ ํ™•์žฅํ•˜์—ฌ readableBytes()๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š”๋ฅผ ์—†์•ฑ๋‹ˆ๋‹ค.

์ด๋Š” ๋“ค์–ด์˜ค๋Š” ByteBuf๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ ByteBuf ๊ตฌํ˜„์ธ ReplayingDecoderBuffer๋กœ ๋ž˜ํ•‘ํ•˜์—ฌ ๋‚ด๋ถ€์ ์œผ๋กœ ์ด ํ˜ธ์ถœ์„ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ๋‹ฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

abstract class ReplayingDecoder<S> : ByteToMessageDecoder()

์—ฌ๊ธฐ์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ S๋Š” ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•  ํ˜•์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ Void๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

class ToIntegerDecoder2 : ReplayingDecoder<Void>() {
    @Throws(Exception::class)
    override fun decode(ctx: ChannelHandlerContext, `in`: ByteBuf, out: MutableList<Any>) {
        out.add(`in`.readInt()) // 4๋ฐ”์ดํŠธ๋ฅผ ์ฝ์–ด ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ ํ›„ `out` ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
    }
}

ReplayingDecoder๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ByteToMessageDecoder๋ณด๋‹ค ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•ด์ง€์ง€๋งŒ, ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ณต์žก์„ฑ์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๋Š” ํ•œ ByteToMessageDecoder๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

10.3.2 ์ถ”์ƒ ํด๋ž˜์Šค MessageToMessageEncoder

์ด์ œ ๋ฉ”์‹œ์ง€ ํ˜•์‹์„ ๋ณ€ํ™˜ํ•˜๋Š” MessageToMessageEncoder๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์ฃผ๋กœ ํ•œ ํ˜•์‹์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค๋ฅธ ํ˜•์‹์˜ ๋ฉ”์‹œ์ง€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

abstract class MessageToMessageEncoder<I> : ChannelOutboundHandlerAdapter()
class IntegerToStringEncoder : MessageToMessageEncoder<Int>() {
    @Throws(Exception::class)
    override fun encode(ctx: ChannelHandlerContext, msg: Int, out: MutableList<Any>) {
        out.add(msg.toString()) // ์ •์ˆ˜๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ `out` ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
    }
}

10.4 ์ถ”์ƒ ์ฝ”๋ฑ ํด๋ž˜์Šค

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

Netty์˜ ์ถ”์ƒ ์ฝ”๋ฑ ํด๋ž˜์Šค๋Š” ์ด๋Ÿฌํ•œ ๋ชฉ์ ์œผ๋กœ ์œ ์šฉํ•˜๋ฉฐ, ๋””์ฝ”๋”์™€ ์ธ์ฝ”๋” ์Œ์„ ํ•จ๊ป˜ ๋ฌถ์–ด ๋‘ ๊ฐ€์ง€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

10.4.1 ์ถ”์ƒ ํด๋ž˜์Šค ByteToMessageCodec

ByteToMessageCodec์€ ๋ฐ”์ดํŠธ๋ฅผ ๋ฉ”์‹œ์ง€๋กœ ๋””์ฝ”๋”ฉํ•˜๊ณ , ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค์‹œ ๋ฐ”์ดํŠธ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ
์„ค๋ช…

decode()

๋ฐ”์ดํŠธ๋ฅผ ๋ฉ”์‹œ์ง€๋กœ ๋””์ฝ”๋”ฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

decodeLast()

์ฑ„๋„์ด ๋น„ํ™œ์„ฑ ์ƒํƒœ๊ฐ€ ๋  ๋•Œ ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

encode()

๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ”์ดํŠธ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

10.4.2 ์ถ”์ƒ ํด๋ž˜์Šค MessageToMessageCodec

MessageToMessageCodec์€ ํ•œ ๋ฉ”์‹œ์ง€ ํ˜•์‹์„ ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€ ํ˜•์‹์œผ๋กœ ๋””์ฝ”๋”ฉํ•˜๊ณ , ๋‹ค์‹œ ์›๋ž˜ ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

abstract class MessageToMessageCodec<INBOUND_IN, OUTBOUND_IN> : ChannelDuplexHandler()

Last updated

Was this helpful?