SSARTEL-10th / JPTS_bookstudy

"๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•  ์ž๋ฐ” ์„ฑ๋Šฅ ํŠœ๋‹ ์ด์•ผ๊ธฐ" ์™„์ „ ์ •๋ณต
7 stars 0 forks source link

Service Locator ํŒจํ„ด์ด๋ž€ ? #23

Open ChoiSeEun opened 11 months ago

ChoiSeEun commented 11 months ago

๐Ÿ‘ ๋ฌธ์ œ

p.425 ~ 426 ์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ ๊ฒ€ ์‹œ ํ™•์ธํ•ด์•ผ ํ•  ํŒจํ„ด ๋ฐ ์•„ํ‚คํ…์ฒ˜์— ๊ด€ํ•ด ์–˜๊ธฐ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ค‘ Service Locator ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ์ž˜ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์—ฌ๋Ÿฌ๋ชจ๋กœ ๋„์›€์ด ๋˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ž ๊น ๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ DI (#2)์™€ ํ•จ๊ป˜ ์–ธ๊ธ‰๋˜๋˜๋ฐ , ๋ถ€๋‹ด์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์—ฐ๊ด€ํ•ด์„œ ๊ฐ™์ด ์ •๋ฆฌํ•ด๋ด๋„ ์ข‹์ง€ ์•Š์„๊นŒ ํ•ฉ๋‹ˆ๋‹ค!

โœˆ๏ธ ์„ ์ • ๋ฐฐ๊ฒฝ

์ด์ „์— ๋””์ž์ธ ํŒจํ„ด ์ฐพ์•„๋ณด๋ฉด์„œ ๋ชป ๋ณธ ํŒจํ„ด์ด๊ธฐ๋„ ํ•˜๊ณ , ๋งˆ์นจ ๋˜ DI์™€ ํ•จ๊ป˜ ์–ธ๊ธ‰๋˜๊ธธ๋ž˜ ์ด์ œ ์Šคํ”„๋ง์„ (์ฒ˜์Œ) ๋ฐฐ์šฐ๋Š” ์ง€๊ธˆ ์‹œ์ฆŒ์— ๋‹ค ๊ฐ™์ด ์ •๋ฆฌํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ ์„ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“บ ๊ด€๋ จ ์ฑ•ํ„ฐ ๋ฐ ๋ ˆํผ๋Ÿฐ์Šค

Story24. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ ๊ฒ€ํ•ด์•ผ ํ•  ๋Œ€์ƒ๋“ค

๐Ÿณ ๋น„๊ณ 

(only ํฌ๋ง์‚ฌํ•ญ) ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์‹ค์ œ ์ฝ”๋“œ์—์„œ ํŒจํ„ด์„ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค !

olrlobt commented 11 months ago

Service Locator ํŒจํ„ด๊ณผ DI

๋“ค์–ด๊ฐ€๋ฉฐ,

Service Locator๊ณผ Dependency Injection (DI) ํŒจํ„ด์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ์ฒด์˜ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

์ด ์ค‘, Service Locator ํŒจํ„ด์€ ์กฐ๊ธˆ๋งŒ ๊ฒ€์ƒ‰ํ•ด๋„ ์•ˆํ‹ฐ ํŒจํ„ด์ด๋ƒ์— ๋Œ€ํ•œ ์˜๋ฌธ์„ ๊ฐ–๋Š” ๊ธ€๋“ค์ด ๋งŽ์ด ๋ณด์ธ๋‹ค.

Service LocatorํŒจํ„ด์€ ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋“ค๋กœ ๋น„ํŒ๋ฐ›๊ธฐ๋„ ํ•˜์ง€๋งŒ, ํŠน์ • ์ƒํ™ฉ์—์„œ๋Š” ์•„์ฃผ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ด๊ธฐ๋„ ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ํ•˜์ง€๋งŒ, ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ Dependency Injection (DI) ํŒจํ„ด์ด Service Locator์˜ ํŒจํ„ด์˜ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๋ฉด์„œ, ์ฝ”๋“œ์˜ ์˜์กด์„ฑ ์ฃผ์ž…์„ ๋”์šฑ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋ฉด, Service LocatorํŒจํ„ด๊ณผ DI ํŒจํ„ด์— ๋Œ€ํ•ด ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ์ง€ ์•Œ์•„๋ณด์ž.

์˜์กด์„ฑ ์ฃผ์ž…

img

์œ„์™€ ๊ฐ™์ด ์ข…์†์„ฑ์ด ์žˆ๋Š” ํด๋ž˜์Šค๋“ค์—์„œ, new๋กœ ๊ฐ์ฒด๊ฐ„์˜ ์ข…์†์„ฑ์„ ์—ฐ๊ฒฐํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

img_1

ํด๋ž˜์Šค๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์ข…์†์„ฑ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๊ฒฝ์šฐ, ๊ทธ ํด๋ž˜์Šค๋Š” ์›๋ž˜์˜ ์—…๋ฌด(1)์™€ ์ข…์†์„ฑ ๊ด€๋ฆฌ(2)์˜ ๋‘ ๊ฐ€์ง€ ์ฑ…์ž„์„ ์ง€๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™์ธ "๋‹จ์ผ ์ฑ…์ž„ ์›์น™"์„ ์œ„๋ฐฐํ•˜๋Š” ์ผ์ด๋ฉฐ, ํด๋ž˜์Šค๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผํ•œ๋‹ค.

๋˜ํ•œ, ํŠน์ • ์ข…์†์„ฑ์ด ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์— ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๊ทธ ์ข…์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋Œ€์ฒดํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๊ณ , ํด๋ž˜์Šค ๊ฐ„์˜ ์ข…์†์„ฑ ์‚ฌ์ด์— ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์–ด ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์œ ์—ฐ์„ฑ์„ ์ €ํ•˜์‹œํ‚ค๊ฒŒ ๋œ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์ด Service Locator ํŒจํ„ด๊ณผ, DI ํŒจํ„ด์ธ ๊ฒƒ์ด๋‹ค.

Service Locator

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 ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋ฐœ์ƒ๊ฒŒ ๋œ๋‹ค.

img_2

์žฅ์ :

๋‹จ์ :

๋ฌธ์ œ์  :

  1. Service Locator๊ฐ€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์˜ค๋ฅ˜๋ฅผ ๋Ÿฐํƒ€์ž„์œผ๋กœ ๋ฏธ๋ฃฌ๋‹ค.

Service Locator๋Š” ํŒจํ„ด์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋น„์Šค ์š”์ฒญ์„ ๋Ÿฐํƒ€์ž„์— ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๋ถ€ ๋ฌธ์ œ์ ์ด๋‚˜ ์˜ค๋ฅ˜๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์—์„œ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š๊ณ  ๋Ÿฐํƒ€์ž„์—์„œ๋งŒ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋‹ค.

  1. ์„œ๋น„์Šค ๋กœ์ผ€์ดํ„ฐ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™์„ ์œ„๋ฐ˜ ํ–ˆ๋‹ค๋Š” ๋น„๋‚œ์„ ๋ฐ›์•˜๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ์„œ๋น„์Šค๋งŒ ์ฐพ๊ธฐ ์œ„ํ•ด ์„œ๋น„์Šค ๋กœ์ผ€์ดํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ๋Š” ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ๋‚˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์—๋„ ์˜์กดํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์„œ๋น„์Šค ๋กœ์ผ€์ดํ„ฐ๋Š” ๋ฒ”์šฉ์ ์ด๊ณ  "๊ณผ๋„ํ•˜๊ฒŒ ํฐ" ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ISP(์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™)์˜ ์ฃผ์š” ๊ฐœ๋…์— ๋ฐ˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ๋‹ค.

  1. ์ทจ์•ฝ์„ฑ
  2. ๊ฐ•ํ•œ ๊ฒฐํ•ฉ

๊ฒฐ๋ก ์ ์œผ๋กœ, Service Locator ํŒจํ„ด์€ ํŠน์ • ์ƒํ™ฉ์—์„œ ์„œ๋น„์Šค์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ณผ๋„ํ•˜๊ฒŒ ์˜์กดํ•˜๊ฒŒ ๋˜๋ฉด ์—ฌ๋Ÿฌ ๋ฌธ์ œ์ ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ ์‹œ ์ƒํ™ฉ๊ณผ ๋ชฉ์ ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํŒ๋‹จํ•˜๊ณ  ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.

Dependency Injection(DI)

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์˜ ํŠน์ • ๊ตฌํ˜„์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹ , ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋œ ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค.

img_3

DI๋Š” Service Locator์—์„œ์˜ ๋ฌธ์ œ๋ฅผ ์–ด๋Š์ •๋„ ํ•ด๊ฒฐ์€ ํ•˜์ง€๋งŒ, ์ข…์†์„ฑ์„ ๊ตฌ์„ฑํ•˜๊ณ  ์ƒ์„ฑํ•˜๋Š” ์ „์šฉ ํด๋ž˜์Šค๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

์žฅ์ :

๋‹จ์ :

ref. ์„œ๋น„์Šค ๋กœ์ผ€์ดํ„ฐ๋Š” ์•ˆํ‹ฐํŒจํ„ด์ด๋‹ค. https://edykim.com/ko/post/service-locator-is-an-antipattern/