Confluent Schema Registry๋ก ์คํค๋ง ๊ด๋ฆฌ: Avro ์คํค๋ง ์ฌ์ฉ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ
Confluent Schema Registry ๋ Kafka ๋ฐ์ดํฐ์ ์คํค๋ง๋ฅผ ์ค์์์ ๊ด๋ฆฌ ํ๊ณ , ๋ฐ์ดํฐ์ ํธํ์ฑ์ ๋ณด์ฅ ํ๋ ์ค์ํ ๋๊ตฌ์ ๋๋ค. Kafka์ ํจ๊ป Avro , JSON , Protobuf ๊ฐ์ ๋ฐ์ดํฐ ํฌ๋งท์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ์คํค๋ง๋ฅผ ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ์คํค๋ง์ ๋ฒ์ ๊ด๋ฆฌ ์ ํธํ์ฑ ์ ์ฑ ์ ์ ์ฉํ์ฌ ์์คํ ์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ต๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ Schema Registry ์ ์๊ฐ์ ํจ๊ป, ์คํค๋ง ๋ฒ์ ๊ด๋ฆฌ ๋ฐฉ๋ฒ, ์คํ๋ง ๋ถํธ์์ Avro ์คํค๋ง ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์คํค๋ง ์ ์ฑ ์ ์ด๋ป๊ฒ ์ค์ ํ๋์ง ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
1. Schema Registry ์๊ฐ
Schema Registry ๋ Kafka์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ์คํค๋ง ๋ฅผ ์ค์์์ ๊ด๋ฆฌํ๋ ์๋น์ค์ ๋๋ค. ๊ฐ ์คํค๋ง๋ ๊ณ ์ ์ ID ๋ก ๋ฑ๋ก๋์ด, Kafka ํด๋ฌ์คํฐ์ ๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์์ ํด๋น ์คํค๋ง๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ ์งํ๊ณ , ๋ฐ์ดํฐ ๊ฐ์ ํธํ์ฑ ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
Schema Registry์ ์ฃผ์ ๊ธฐ๋ฅ
- ์คํค๋ง ์ค์ ๊ด๋ฆฌ : ๋ชจ๋ ์คํค๋ง๋ฅผ ํ ๊ณณ์์ ๊ด๋ฆฌํ์ฌ, ๋ฐ์ดํฐ ๋ณํ๊ณผ ํธํ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ๋ฒ์ ๊ด๋ฆฌ : ์คํค๋ง์ ๋ค์ํ ๋ฒ์ ์ ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ ํ๋ฆ์์ ์ ๋ฒ์ ์ ์คํค๋ง๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
- ํธํ์ฑ ์ ์ฑ : ์คํค๋ง ๊ฐ์ ํธํ์ฑ์ ์ ์งํ๋ ์ ์ฑ ์ ์ค์ ํ์ฌ ์์คํ ์์ ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
2. ์คํค๋ง์ ๋ฒ์ ๊ด๋ฆฌ์ ํธํ์ฑ ์ ์ง
Kafka ์์คํ ์์ ์คํค๋ง๊ฐ ๋ณ๊ฒฝ๋ ๋, ์คํค๋ง ํธํ์ฑ ์ ์ ์งํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค. Confluent Schema Registry ๋ ์ฌ๋ฌ ์คํค๋ง ๋ฒ์ ์ ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ๊ฐ ๋ฒ์ ๊ฐ์ ํธํ์ฑ์ ์ ์งํ๋๋ก ์ ์ฑ ์ ์ค์ ํ ์ ์์ต๋๋ค.
์คํค๋ง ํธํ์ฑ ์ ์ฑ ์ ์ข ๋ฅ
- BACKWARD : ์ ์คํค๋ง๊ฐ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋๋ก ๊ฐ์ .
- FORWARD : ์ด์ ์คํค๋ง๊ฐ ์ ์คํค๋ง์ ํธํ๋๋๋ก ๊ฐ์ .
- FULL : ์๋ฐฉํฅ์ผ๋ก ํธํ์ฑ์ ์ ์ง.
์คํค๋ง ๋ฑ๋ก ์์
curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{"schema": "{\"type\":\"record\",\"name\":\"User\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"age\",\"type\":\"int\"}]}"}' \
http://localhost:8081/subjects/User-value/versions
์ค๋ช :
- ์ ๋ช ๋ น์ User ๋ผ๋ ์คํค๋ง๋ฅผ Schema Registry ์ ๋ฑ๋กํ๋ ์์์ ๋๋ค.
- ์ด ์คํค๋ง๋ name ๊ณผ age ํ๋๋ฅผ ๊ฐ์ง Avro ํ์ ์ ๋ ์ฝ๋์ ๋๋ค.
์คํค๋ง ๋ฒ์ ๊ด๋ฆฌ ์์
curl -X GET http://localhost:8081/subjects/User-value/versions
- ํด๋น ๋ช ๋ น์ ์ฌ์ฉํ๋ฉด, User ์คํค๋ง์ ๋ชจ๋ ๋ฒ์ ์ ์กฐํํ ์ ์์ต๋๋ค.
3. ์คํ๋ง ๋ถํธ์์ Avro ์คํค๋ง ์ฌ์ฉ
์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ Avro ํฌ๋งท์ ์ฌ์ฉํ์ฌ Kafka ๋ฉ์์ง๋ฅผ ์ง๋ ฌํ/์ญ์ง๋ ฌํํ ์ ์์ต๋๋ค. Spring Kafka ์ Confluent Schema Registry ๋ฅผ ์ฐ๋ํ๋ฉด, ์คํค๋ง ๊ด๋ฆฌ๊ฐ ๋์ฑ ์ฌ์์ง๋๋ค.
์คํ๋ง ๋ถํธ ์ค์ ์์
spring:
kafka:
bootstrap-servers: localhost:9092
properties:
schema.registry.url: http://localhost:8081
consumer:
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: io.confluent.kafka.serializers.KafkaAvroDeserializer
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: io.confluent.kafka.serializers.KafkaAvroSerializer
Avro ๋ฉ์์ง ์์
// Avro ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์์ง ์์ฑ
public class AvroProducer {
@Autowired
private KafkaTemplate<String, User> kafkaTemplate;
public void sendMessage() {
User user = User.newBuilder().setName("John Doe").setAge(30).build();
kafkaTemplate.send("user-topic", user);
}
}
์ค๋ช :
- KafkaAvroSerializer ์ KafkaAvroDeserializer ๋ฅผ ์ฌ์ฉํ์ฌ Avro ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํ/์ญ์ง๋ ฌํํฉ๋๋ค.
- Schema Registry URL์ ์ง์ ํ์ฌ ์คํค๋ง๋ฅผ ์ค์์์ ๊ด๋ฆฌํ๋๋ก ์ค์ ํฉ๋๋ค.
4. ์คํค๋ง ์ ์ฑ ์ ์ฉ ๋ฐฉ๋ฒ
์คํค๋ง ํธํ์ฑ ์ ์ ์งํ๊ธฐ ์ํด์๋ ์ ์ ํ ์ ์ฑ ์ ์ค์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํธํ์ฑ ์ ์ฑ ์ ์ค์ ํ๋ฉด, ๋ฐ์ดํฐ ํ๋ฆ์์ ์คํค๋ง ๋ณ๊ฒฝ ์ ๋ฐ์ดํฐ ์์ค ์ด๋ ๋นํธํ์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์คํค๋ง ํธํ์ฑ ์ ์ฑ ์ค์ ์์
curl -X PUT -H "Content-Type: application/vnd.schemaregistry.v1+json" \
--data '{"compatibility": "BACKWARD"}' \
http://localhost:8081/config/User-value
์ค๋ช :
- BACKWARD ํธํ์ฑ ์ ์ฑ ์ ์ค์ ํ์ฌ, ์๋ก์ด ์คํค๋ง ๋ฒ์ ์ด ์ด์ ์คํค๋ง ๋ฒ์ ๊ณผ ํธํ๋๋๋ก ํฉ๋๋ค.
Schema Registry ํธ๋ ๋ ๋ฐ ํต๊ณ
Confluent Schema Registry ๋ ์ ์ ๋ ๋ง์ ๊ธฐ์ ์์ ์ฌ์ฉ๋๊ณ ์์ผ๋ฉฐ, ํนํ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๊ณผ ํธํ์ฑ ์ ์ ์งํด์ผ ํ๋ ๋๊ท๋ชจ ์์คํ ์์ ์ค์ํ๊ฒ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. ์ต๊ทผ ๋ฐ์ดํฐ์ ๋ฐ๋ฅด๋ฉด, ์คํค๋ง ๊ด๋ฆฌ ๋ฅผ ์๋ํํ ๊ธฐ์ ์ ๋ฐ์ดํฐ ์ค๋ฅ ๊ฐ 50% ์ด์ ๊ฐ์ํ๊ณ , ์์คํ ์ ๊ทธ๋ ์ด๋ ๊ณผ์ ์์ ๋ฐ์ดํฐ ์์ค ์ด ๊ฑฐ์ ์์๋ค๊ณ ๋ณด๊ณ ๋ฉ๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ (FAQ)
Q1. Schema Registry๋ ์ ํ์ํ๊ฐ์?
A1. Schema Registry ๋ Kafka์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ์ ์คํค๋ง๋ฅผ ์ค์์์ ๊ด๋ฆฌ ํ๊ณ , ๋ฐ์ดํฐ์ ํธํ์ฑ ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ , ์์คํ
๊ฐ ๋นํธํ์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
Q2. ์คํค๋ง ํธํ์ฑ ์ ์ฑ
์ ์ด๋ป๊ฒ ์ค์ ํ๋์?
A2. Schema Registry ์์ ์ ๊ณตํ๋ API๋ฅผ ํตํด BACKWARD , FORWARD , FULL ๋ฑ์ ํธํ์ฑ ์ ์ฑ
์ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์คํค๋ง ๋ณ๊ฒฝ ์์๋ ์์คํ
์ ์์ ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
Q3. ์คํ๋ง ๋ถํธ์์ Avro ์คํค๋ง๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
A3. Spring Kafka ์ Schema Registry ๋ฅผ ์ฐ๋ํ์ฌ, KafkaAvroSerializer ์ KafkaAvroDeserializer ๋ฅผ ์ฌ์ฉํ๋ฉด Avro ์คํค๋ง๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. Schema Registry URL์ ์ค์ ํ์ฌ ์คํค๋ง๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
Q4. ์คํค๋ง์ ๋ฒ์ ๊ด๋ฆฌ๋ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์?
A4. Schema Registry ๋ ๊ฐ ์คํค๋ง์ ๋ํด ๋ฒ์ ๊ด๋ฆฌ ๋ฅผ ์ง์ํ๋ฉฐ, ์คํค๋ง ๋ณ๊ฒฝ ์ ์๋ก์ด ๋ฒ์ ์ ๋ฑ๋กํ์ฌ ์ฌ์ฉํฉ๋๋ค. ๋ฒ์ ๊ฐ ํธํ์ฑ ์ ์ฑ
์ ์ค์ ํ์ฌ ์คํค๋ง๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
Q5. Schema Registry๋ฅผ ํตํด ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋์?
A5. Schema Registry ๋ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง , ํธํ์ฑ ๋ฌธ์ ๋ฐฉ์ง , ์คํค๋ง ๊ด๋ฆฌ ์๋ํ ์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด๋ฅผ ํตํด ์์คํ
๊ฐ ๋ฐ์ดํฐ ํ๋ฆ์ ์์ ์ ์ผ๋ก ์ ์งํ ์ ์์ต๋๋ค.
์ด ํฌ์คํ ์์๋ Confluent Schema Registry ๋ฅผ ์ฌ์ฉํ์ฌ ์คํค๋ง ๊ด๋ฆฌ ์ ํธํ์ฑ ์ ์ง ๋ฐฉ๋ฒ์ ๋ค๋ค์ต๋๋ค. ์ด๋ฅผ ํตํด Kafka ์์คํ ์์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ , ์๋ก์ด ์คํค๋ง๋ฅผ ์์ ์ ์ผ๋ก ๋์ ํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๋๊ธ