- ๊ฐ์ฒด์งํฅ์ ์ค๊ณ๋ฅผ ์งํฅํ๋ค.
- SpringBoot ๋ฅผ ๋ชจ๋ฐฉํ์ฌ, ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ค.
- ์์ผ์ ํ์ฉํ์ฌ ์ค์๊ฐ ํต์ ์ ๊ตฌํํ๋ค.
์๋ฒ์ ๋ฉ์ธ ํจํค์ง
ServerThread ๋ฅผ Daemon Thread๋ก ํธ์ถํ์ฌ ๊ฐ ์์ผ์ ๊ด๋ฆฌํ๋ฉฐ,HashMap<Long, PrintWriter> ์ธ์คํด์ค๋ฅผ public static ํ๊ฒ ์ ์ธํ์ฌuserId: Long, ์ฐ๊ฒฐ๋ ์์ผ์ out: PrintWriter๋ฅผ ๊ด๋ฆฌํ๋ค.HashMap<Long, PrintWriter> onlineUser; // userId: Key, out: Value ๋ก ๊ด๋ฆฌ
Socket client = new ServerSocket(8000).accept(); // ์์ผ ์ฐ๊ฒฐ ํ์ ๋ (ํด๋ผ์ด์ธํธ ์ ์)
out = new PrintWriter(client.getOutputStream(), true, StandardCharsets.UTF_8);
userId = login(User body).getUserId(); // DB์์ ์ ์ ์ ๋ณด ๊ฐ์ ธ์ฌ ๋ (๋ก๊ทธ์ธ)
onlineUser.put(userId, out);
- ํ๋กํ ์ฝ Header String์ ์ฒ๋ฆฌํ๋ค.
- Singleton Pattern / DI ๋ฅผ ์ ์ฉํ์๋ค.
void callService ๋ฉ์๋๋ฅผ ์ ์ธํด, ๊ตฌํ์ ๊ฐ์ ํ๋ค.package main.src.Controller;
public interface DefaultController {
void callService(String header, String body, PrintWriter out);
}
ProxyPattern์ ์ ์ฉํ์ฌ path ๋ณ๋ก ์์กด์ฑ์ ์ฃผ์ ํ๋ ์ปจํธ๋กค๋ฌ์ด๋ค.
์์
callService ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.package main.src.Controller;
public class ProxyController implements DefaultController {
DefaultController controller;
/**
* request[0] (header) == "POST /user"
* request[1] (body) == "username:username1,password:password1,nickname:nickname1"
*/
@Override
public void callService(String header, String body) {
switch (header.split(" ")[1]) { // path
case "/user":
controller = UserController.getInstance();
break;
case "/room":
controller = RoomController.getInstance();
break;
case "/chat":
controller = ChatController.getInstance();
break;
default: ; // ์๋ชป๋ ์์ฒญ
}
controller.callService(header.split(" ")[0], body);
}
}
path == โ/userโpackage main.src.Controller;
import main.src.Service.UserService;
public class UserController implements DefaultController {
private static UserController instance = new UserController();
private UserController() {}
public static UserController getInstance() {
return instance;
}
UserService userService = UserService.getInstance();
@Override
public void callService(String header, String body) {
switch (header) {
case "GET": userService.login(body); break;
case "POST": userService.signUp(body); break;
case "PATCH": userService.logout(body); break;
default: userService.methodError();
}
}
}
path == โ/roomโpath == โ/chatโ