웹서비스 로그인은 전형적인 방식이 있다.
POST로
{
id:"hong_gil_dong",
pw:"password1234",
...
}
을 날리면 서버가 DB에서 비번 맞춰보고 맞으면 로그인 아니면 우리집에 왜 왔니? 하면 된다.
그런데 이건 웹 프로그램 짤 때고...
Pub/Sub Broker 세상에서는 어떻게 하지?😒😒
다 아는 얘기 한번 해보자.
Broker 방식은 복덕방하고 똑같다.
방구하러 온 사람이 떡방 할배에게 말한다.
여기 현대빌라 203혼데요, 저희 이번에 나가서 집 내놔요. 방 3개고 재작년에 지은 신축이예요.
전번은 010-1234-5678이고, 제가 일을 해서 집은 저녁 7시 이후 보여줄 수 있어요.
집 내 놓는다는 말이다.
유식하게 이를 pub 이라 한다.
2인 가족이 살건데요.
채광 좋고, 단독 전세 나오면 연락해주세요.
집 구하니, 연락 달라는 말이다.
유식하게 sub이라 한다.
떡방 할배가 장부 뒤져 그런 집이 있으면 이분한테 연락한다.
즉 pub 날리는거다.
어, 할배가 sub도 받고, pub도 날리고 혼자 다하네.☎☎
이제 pub/sub이 방향의 문제임을 눈치챘을 것이다.
sub한 놈한테 pub하는거다.
pub 받을려면 sub해 놔야한다.
같은 말이다.😁😁
자 이제 로그인 문제로 돌아와보자.
위 그림은 login 요청하고, login 응답하는거다.
Broker는 둘만 있는 세상이 아니다.
Broker 한테 로그인 처리 해달라고 하면 화낸다.
웹서버 방식이 아니라, 쉽지 않다.
오똑케하면 이 문제를 해결할 것인가?
물론 Broker 자체에 로그인 기능이 있지만, 그건 떡방 할배 사무실 이름이랑 전번이다.
우리가 원하는 건, DB에 있는 사용자 정보에 접근해서 거기랑 맞춰보는거다.
떡방 아저씨 입장에선 모두가 client다.
집을 구하는 사람도 client고, 집을 내놓는 사람도 cleint다.
왜?
둘 다 돈을 주니까...😁😁😁
왓어 원더플 월더 다.
Broker 세상에는 client만 있고, server 는 없다.
다들 돈 낸는 client라고 일은 안하고, 다리 꼬고 앉아 있다.
누가 로그인 처리할 것인가? 방법이 없을까?
있다.
client 중 한 놈을 패서 server로 만들자.
그냥 그 client 이름을 server라 붙이면 된다. 인자부터 니가 server 해👊👊👊
진실의 방을 다녀오고 나면 다음과 같이 고분고분해진다.
- sub server/login : server/login으로 들어오는 건 내가 처리할께😢
- pub server/login : server님, 저 login할래요😄
됐다.
borker로 server/client 만들었다.
사실 한 놈 뚜까 패서 server 시켰다.😁😁😁😁😁😁
이제 server가 비번 맞춰보고 login 해줄지 말지 응답하면 된다.
자, 이제 User는 login 응답만 받으면 된다.
엥. 근데 응답 콜은 어떻게 받지?
맛집 앞에서 줄만 잘 선다고 끝 아니다.
아무리 기다려도 안 부를 수 있다.
뒤에 온 놈이 먼저 들어가는 더러운 꼴 볼 수 있단 말이다.
대기책자📝에 이름이랑 전번 써놔야 여친한테 사랑💏받는다.
Broker 세상도 마찬가지다.
응답 콜 받겠다고 미리 등록(sub)해야 한다.
- sub server/login : server/login으로 들어오는 건 내가 처리할께
- sub clients/client1 : 결과는 clients/client1 로 주세요
- pub server/login : server님, 저 login할래요
- pub clients/client1 : clients/client1 DB에 있는 패스워드랑 다른데...너 누구냐?
Broker는 왼손으로 요청 받아서, 오른손으로 전달해주는 역할을 한다.
내용에는 관심없다.
거의 예수님, 부처님 수준이다.
다만 어떤 놈이 어떤 것 받아 본다고 했더라(sub) 하는 놓은 노트📝 한권 들고 있다.
누가 뭘 구독하고 있는지?
또 있다. sub하는 놈들이 여럿일 수 있으니
누가 지금 연결되어 있는지
주기적으로 체크✅도 한다. 변심하고 딴 맛집 간 놈 없는지...
어떤 놈은 가면 간다 말을 하기도 한다.
이걸 유식하게 LWT라 한다. 나중에 나온다.
글 쓰는 이가 그냥 설렁설렁 대충 주절거리는 것 같지만, 나름 깊은 뜻이 쪼금 있다.
여기까지 온다고 고생들 했다.
이제 코드로 함 만들어 보자.
그래도 명색이 프로_글래머💪인데.
const mqtt = require("mqtt");
const client = mqtt.connect("mqtt://localhost");
const user = { id: 'client1', pwd: 'pwd' };
client.on("connect", () => {
client.subscribe("clients/client1");
client.publish("server/login", JSON.stringify(user));
});
client.on("message", (topic, message) => {
console.log(message.toString());
client.end();
});
예외 처리 왜 안하냐구?
할 줄 몰라서 안한다고 생각하면, 당신은 천재다.
그런 거는 나중에 돈 받고 만들 때 하면 된다.
괜히 Code Reading만 어렵더라.
const mqtt = require("mqtt");
const server = mqtt.connect("mqtt://localhost");
server.on("connect", () => {
server.subscribe("server/login");
});
server.on("message", (topic, message) => {
let data = JSON.parse(message);
let client_topic = 'clients/' + data.id;
if (data.pwd === 'pwd') {
let res = { msg: 'login ok' };
server.publish(client_topic, JSON.stringify(res));
} else {
let res = { msg: 'login fail' };
server.publish(client_topic, JSON.stringify(res));
}
});
떡방이라고 했다가 혼났다.
부동산중계인
재밌는 그림으로 쉽게 설명해주시니 어려워도 웃으며 따라가네요.
감사합니다.