๐Ÿถ๐Ÿพ/backend

[spring] loc, DI, ์ปจํ…Œ์ด๋„ˆ

onieyh 2023. 11. 6. 14:20

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ์„ ์ˆ˜๊ฐ•ํ•˜๋ฉด์„œ ๋‚˜์˜จ ๊ฐœ๋…์ด๋‹ค.

 

Appconfig๋ฅผ ๋งŒ๋“ค์–ด์„œ ์—ฐ๊ฒฐํ•ด์ฃผ๊ธฐ ์ „์—๋Š” OrderServiceImpl ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์งฐ์—ˆ๋‹ค.

public class OrderServiceImpl implements OrderService {
    private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
    private final MemberRepository memberRepository = new MemoryMemberRepository();
    ...
}

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์งœ๊ฒŒ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ(OrderServiceImpl)์—์„œ

DiscountPolicy์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค ์ฝ”๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๋„ ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด OCP, DIP๋ฅผ ์œ„๋ฐ˜ํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๋ฅผ ์˜์กดํ•˜์ง€ ์•Š๊ฒŒ ์งœ๊ธฐ ์œ„ํ•ด์„œ, ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋Œ€์‹  ์ƒ์„ฑํ•˜๊ณ  ์ฃผ์ž…ํ•˜๋Š” Appconfig๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค.

public class Appconfig {
	public MemberRepository memberRepository() {
    	return new MemoryMemberRepository();
    }
    
    public DiscountPolicy discountPolicy() {
    	return new FixDiscountPolicy();
    }
    
    public OrderService orderService() {
    	return new OrderServiceImpl(memberRepository(), discountPolicy());
    }
    
    ...
}

 

public class OrderServiceImpl implements OrderService {
    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
    
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
    	this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
   }
   
   ...
}

 

์ด๋Ÿฐ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด OrderServiceImpl์€ ํ•„์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ํ˜ธ์ถœํ•˜์ง€๋งŒ ์–ด๋–ค ๊ตฌํ˜„ ๊ฐ์ฒด๋“ค์ด ์‹คํ–‰๋ ์ง€ ๋ชจ๋ฅธ๋‹ค.

( โžก๏ธ discountPolicy๊ฐ€ Fix์ธ์ง€ Rate์ธ์ง€ OrderServiceImpl๋Š” ์•Œ์ง€ ๋ชปํ•จ, DIP)

๊ทธ๋ฆฌ๊ณ  ์†Œํ”„ํŠธ์›จ์–ด ์š”์†Œ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ํ™•์žฅํ•ด๋„ ์‚ฌ์šฉ ์˜์—ญ์˜ ๋ณ€๊ฒฝ์€ ๋‹ซํ˜€์žˆ๊ฒŒ ๋œ๋‹ค. (OCP)

 

โœ”๏ธ ์ฆ‰, ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด ๋ชจ๋‘ Appconfig์—๊ฒŒ ์žˆ๋‹ค.

๐Ÿ“ ์ด๋ ‡๊ฒŒ ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ดํ๋ฆ„์„ ์ง์ ‘ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ œ์–ด์˜ ์—ญ์ „(loC)์ด๋ผ ํ•œ๋‹ค.

 

 

 

 

 

์˜์กด๊ด€๊ณ„ ์ฃผ์ž… DI

์˜์กด๊ด€๊ณ„๋Š” ์ •์ ์ธ ํด๋ž˜์Šค ์˜์กด ๊ด€๊ณ„์™€, ์‹คํ–‰ ์‹œ์ ์— ๊ฒฐ์ •๋˜๋Š” ๋™์ ์ธ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค) ์˜์กด ๊ด€๊ณ„ ๋‘˜์„ ๋ถ„๋ฆฌํ•ด ์ƒ๊ฐํ•ด์•ผํ•œ๋‹ค.

 

์ •์ ์ธ ํด๋ž˜์Šค ์˜์กด ๊ด€๊ณ„ 

โœ”๏ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋ถ„์„ ๊ฐ€๋Šฅ

โœ”๏ธ OrderServiceImpl์€ MemberRepositiry์™€ DiscountPolicy์— ์˜์กด 

๐Ÿ“ ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค ์˜์กด๊ด€๊ณ„๋งŒ์œผ๋กœ๋Š” ์‹ค์ œ ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ OrderServiceImpl์— ์ฃผ์ž… ๋  ์ง€ ์•Œ ์ˆ˜ ์—†์Œ

 

โœ”๏ธ ๋Ÿฐํƒ€์ž„(์‹คํ–‰ ์‹œ์ )์— ์™ธ๋ถ€์—์„œ ์‹ค์ œ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•ด์„œ

     ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์‹ค์ œ ์˜์กด๊ด€๊ณ„๊ฐ€ ์—ฐ๊ฒฐ ๋˜๋Š” ๊ฒƒ์„ ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž… ์ด๋ผ๊ณ  ํ•จ 

โœ”๏ธ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์ƒ์˜ ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

( โžก๏ธ OrderServiceImpl์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  DiscountPolicy์˜ ๊ตฌํ˜„ ๊ฐ์ฒด์ธ Fix~ ์™€ Rate ์ค‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ)

๐Ÿ“ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •์ ์ธ ํด๋ž˜์Šค ์˜์กด๊ด€๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ๋™์ ์ธ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ์˜์กด ๊ด€๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

Appconfig ์ฒ˜๋Ÿผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋ฉฐ ์˜์กด๊ด€๊ณ„๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์„ loC ์ปจํ…Œ์ด๋„ˆ, DI ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ ํ•œ๋‹ค. 

๋ฐ˜์‘ํ˜•