Open ChoiSeEun opened 11 months ago
Service Locator๊ณผ Dependency Injection (DI) ํจํด์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ์ฒด์ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋์์ธ ํจํด์ด๋ค.
์ด ์ค, Service Locator ํจํด์ ์กฐ๊ธ๋ง ๊ฒ์ํด๋ ์ํฐ ํจํด์ด๋์ ๋ํ ์๋ฌธ์ ๊ฐ๋ ๊ธ๋ค์ด ๋ง์ด ๋ณด์ธ๋ค.
Service Locatorํจํด์ ๋ช ๊ฐ์ง ์ด์ ๋ค๋ก ๋นํ๋ฐ๊ธฐ๋ ํ์ง๋ง, ํน์ ์ํฉ์์๋ ์์ฃผ ์ ์ฉํ๊ฒ ์ฐ์ด๊ธฐ๋ ํ๋ ํจํด์ด๋ค. ํ์ง๋ง, ๋ง์ ์ฌ๋๋ค์ Dependency Injection (DI) ํจํด์ด Service Locator์ ํจํด์ ๋จ์ ์ ํด๊ฒฐํ๋ฉด์, ์ฝ๋์ ์์กด์ฑ ์ฃผ์ ์ ๋์ฑ ๋ช ํํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค๊ณ ๋ฏฟ๋๋ค.
๊ทธ๋ฌ๋ฉด, Service Locatorํจํด๊ณผ DI ํจํด์ ๋ํด ์ด๋ค ์ฐจ์ด๊ฐ ์๋ ์ง ์์๋ณด์.
์์ ๊ฐ์ด ์ข ์์ฑ์ด ์๋ ํด๋์ค๋ค์์, new๋ก ๊ฐ์ฒด๊ฐ์ ์ข ์์ฑ์ ์ฐ๊ฒฐํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
ํด๋์ค๊ฐ ์์ฒด์ ์ผ๋ก ์ข ์์ฑ์ ์์ฑํ๊ฑฐ๋ ์ด๊ธฐํ ํ๋ ๊ฒฝ์ฐ, ๊ทธ ํด๋์ค๋ ์๋์ ์ ๋ฌด(1)์ ์ข ์์ฑ ๊ด๋ฆฌ(2)์ ๋ ๊ฐ์ง ์ฑ ์์ ์ง๊ฒ ๋๋ค. ์ด๋ ๊ฐ์ฒด์งํฅ ์ค๊ณ ์์น์ธ "๋จ์ผ ์ฑ ์ ์์น"์ ์๋ฐฐํ๋ ์ผ์ด๋ฉฐ, ํด๋์ค๋ ๋จ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผํ๋ค.
๋ํ, ํน์ ์ข ์์ฑ์ด ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์์กดํ๊ฒ ๋๋ค๋ฉด, ๊ทธ ์ข ์์ฑ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ๋์ฒดํ๊ธฐ ์ด๋ ค์์ง๊ณ , ํด๋์ค ๊ฐ์ ์ข ์์ฑ ์ฌ์ด์ ๊ฐํ ๊ฒฐํฉ์ด ๋ฐ์ํ๊ฒ ๋์ด ์์คํ ์ ์ฒด์ ์ ์ฐ์ฑ์ ์ ํ์ํค๊ฒ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํจํด์ด Service Locator ํจํด๊ณผ, DI ํจํด์ธ ๊ฒ์ด๋ค.
Service Locator ํจํด์ ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ ๊ฐ์ ์์กด์ฑ์ ์ค์ด๋ ๋์์ธ ํจํด์ด๋ค.
์ฝ๊ฒ ๋งํด, ๊ฐ์ฒด์ ์์กด์ฑ์ ์ค์์ ์ฅ์(Service Locator)์ ์ ์ฅํด ๋๊ณ , ํ์ํ ๋๋ง๋ค ์ฐพ์์ ์ฐ๋ ํจํด์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค.
public interface MessageService {
void sendMessage(String message);
}
public class EmailService implements MessageService {
public void sendMessage(String message) {
System.out.println("Email sent: " + message);
}
}
public class ServiceLocator { // ์ค์ ๊ด๋ฆฌ ์ ์ฅ์
private static Map<String, MessageService> services = new HashMap<>(); // key : value๋ก ๊ด๋ฆฌ
public static void registerService(String name, MessageService service) {
services.put(name, service);
}
public static MessageService getService(String name) {
return services.get(name);
}
}
public class Notification {
public void notify(String message) {
MessageService service = ServiceLocator.getService("emailService"); // ์์กด์ฑ ๊ฐ์ ธ์ค๊ธฐ
service.sendMessage(message);
}
}
public class Application {
public static void main(String[] args) {
ServiceLocator.registerService("emailService", new EmailService());
Notification notification = new Notification();
notification.notify("ํ๋ฐ์ฌ๋์ ์์ธ์?");
}
}
์ด๋ ๊ฒ Notification ํด๋์ค๋ ServiceLocator๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์๋น์ค๋ฅผ ๊ฒ์ํ๊ณ ์๋ค. ์ด๋ ๊ฒ ๋๋ฉด Notification ๊ณผ ServiceLocator ๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋ฐ์๊ฒ ๋๋ค.
์ฅ์ :
๋จ์ :
๋ฌธ์ ์ :
Service Locator๋ ํจํด์ ์ผ๋ฐ์ ์ผ๋ก ์๋น์ค ์์ฒญ์ ๋ฐํ์์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์, ์ผ๋ถ ๋ฌธ์ ์ ์ด๋ ์ค๋ฅ๋ ์ปดํ์ผ ์๊ฐ์์ ๋ฐ๊ฒฌ๋์ง ์๊ณ ๋ฐํ์์์๋ง ๋ํ๋ ์ ์๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ํ์๋ก ํ๋ ์๋น์ค๋ง ์ฐพ๊ธฐ ์ํด ์๋น์ค ๋ก์ผ์ดํฐ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด, ํด๋ผ์ด์ธํธ๋ ์ค์ ๋ก ํ์ํ์ง ์์ ์ฌ๋ฌ ๋ค๋ฅธ ์๋น์ค์ ๋ํ ๋ฉ์๋๋ ์ ๊ทผ ๋ฐฉ๋ฒ์๋ ์์กดํ๊ฒ ๋ ์ ์๋ค. ์ด๋ก ์ธํด ์๋น์ค ๋ก์ผ์ดํฐ๋ ๋ฒ์ฉ์ ์ด๊ณ "๊ณผ๋ํ๊ฒ ํฐ" ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ฒ ๋ ์ ์์ผ๋ฉฐ, ์ด๋ ISP(์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น)์ ์ฃผ์ ๊ฐ๋ ์ ๋ฐํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, Service Locator ํจํด์ ํน์ ์ํฉ์์ ์๋น์ค์ ๊ฒฐํฉ๋๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ง๋ง, ๊ณผ๋ํ๊ฒ ์์กดํ๊ฒ ๋๋ฉด ์ฌ๋ฌ ๋ฌธ์ ์ ์ ์ ๋ฐํ ์ ์๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ ์ ์ํฉ๊ณผ ๋ชฉ์ ์ ๋ช ํํ๊ฒ ํ๋จํ๊ณ ์ ์ฉํด์ผ ํ๋ค.
Dependency Injection(DI) = ์์กด์ฑ ์ฃผ์ ์์กด์ฑ ์ฃผ์ ์ ๊ฐ์ฒด๊ฐ ์์ ์ ์ข ์์ฑ์ ์ง์ ์์ฑํ๊ฑฐ๋ ๊ฒ์ํ๋ ๋์ ์ธ๋ถ์์ ์ข ์์ฑ์ ์ ๊ณต๋ฐ๋ ๋ฐฉ์์ด๋ค. ์ข ์์ฑ์ ์ฃผ๋ก, ์์ฑ์์ฃผ์ , ์ธํฐ์ฃผ์ , ํ๋์ฃผ์ ๋ฑ์ด ์๋ค.
public interface MessageService {
void sendMessage(String message);
}
public class EmailService implements MessageService {
public void sendMessage(String message) {
// send email
System.out.println("Email sent: " + message);
}
}
public class Notification {
private final MessageService service;
public Notification(MessageService service) {
this.service = service;
}
public void notify(String message) {
service.sendMessage(message);
}
}
public class Application {
public static void main(String[] args) {
MessageService emailService = new EmailService();
Notification notification = new Notification(emailService);
notification.notify("Hello via Email!");
}
}
์ฌ๊ธฐ์๋ Notification ํด๋์ค๊ฐ MessageService์ ํน์ ๊ตฌํ์ ์์กดํ์ง ์๋๋ค. ๋์ , ์ธ๋ถ์์ ์ฃผ์ ๋ ์ข ์์ฑ์ ์ฌ์ฉํ๋ค.
DI๋ Service Locator์์์ ๋ฌธ์ ๋ฅผ ์ด๋์ ๋ ํด๊ฒฐ์ ํ์ง๋ง, ์ข ์์ฑ์ ๊ตฌ์ฑํ๊ณ ์์ฑํ๋ ์ ์ฉ ํด๋์ค๊ฐ ์ฌ์ ํ ์กด์ฌํ๋ ํจํด์ด๋ค.
์ฅ์ :
๋จ์ :
ref. ์๋น์ค ๋ก์ผ์ดํฐ๋ ์ํฐํจํด์ด๋ค. https://edykim.com/ko/post/service-locator-is-an-antipattern/
๐ ๋ฌธ์
p.425 ~ 426
์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒ ์ ํ์ธํด์ผ ํ ํจํด ๋ฐ ์ํคํ ์ฒ์ ๊ดํด ์๊ธฐ ํ๊ณ ์์ต๋๋ค. ์ด ์ค Service Locator ํจํด์ ๋ํด์ ์ ์๊ณ ์์ผ๋ฉด ์ฌ๋ฌ๋ชจ๋ก ๋์์ด ๋์ง ์์๊น ์๊ฐ์ด ๋ค์์ต๋๋ค. ์ ๊น ๊ฒ์ํด๋ณด๋ DI (#2)์ ํจ๊ป ์ธ๊ธ๋๋๋ฐ , ๋ถ๋ด์ด ๋์ง ์๋๋ค๋ฉด ์ฐ๊ดํด์ ๊ฐ์ด ์ ๋ฆฌํด๋ด๋ ์ข์ง ์์๊น ํฉ๋๋ค!โ๏ธ ์ ์ ๋ฐฐ๊ฒฝ
์ด์ ์ ๋์์ธ ํจํด ์ฐพ์๋ณด๋ฉด์ ๋ชป ๋ณธ ํจํด์ด๊ธฐ๋ ํ๊ณ , ๋ง์นจ ๋ DI์ ํจ๊ป ์ธ๊ธ๋๊ธธ๋ ์ด์ ์คํ๋ง์ (์ฒ์) ๋ฐฐ์ฐ๋ ์ง๊ธ ์์ฆ์ ๋ค ๊ฐ์ด ์ ๋ฆฌํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์ ์ ์ ํ์ต๋๋ค.
๐บ ๊ด๋ จ ์ฑํฐ ๋ฐ ๋ ํผ๋ฐ์ค
Story24. ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ๊ฒํด์ผ ํ ๋์๋ค
๐ณ ๋น๊ณ
(only ํฌ๋ง์ฌํญ) ๊ฐ๋ฅํ๋ค๋ฉด ์ค์ ์ฝ๋์์ ํจํด์ ํ์ธํด๋ณผ ์ ์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค !