X Tutup
Skip to content

Latest commit

Β 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Β 
Β 

README.md

[μ•„μ΄ν…œ 64] κ°μ²΄λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λΌ

μš”μ•½

  • λ§€κ°œλ³€μˆ˜λΏ μ•„λ‹ˆλΌ λ°˜ν™˜κ°’, λ³€μˆ˜, ν•„λ“œλ₯Ό μ „λΆ€ μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ μ„ μ–Έν•˜λΌ.
  • μ ν•©ν•œ μΈν„°νŽ˜μ΄μŠ€κ°€ μ—†λ‹€λ©΄ 클래슀의 계측ꡬ쑰 쀑 κ°€μž₯ μƒμœ„μ˜ 클래슀λ₯Ό μ‚¬μš©ν•˜λΌ.
// 쒋은 μ˜ˆμ‹œ
Set<Son> sonSet = new LinkedHashSet<>();

// λ‚˜μœ μ˜ˆμ‹œ
LinkedHashSet<Son> sonSet = new LinkedHashSet<>();

μ†Œκ°

  • SOLID 원칙 쀑 λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 법칙이 λ– μ˜¬λžλ‹€.
  • Spring 의 DI(Dependency Injection) κ°€ λ– μ˜¬λžλ‹€.

DI(Dependency Injection)

ν† λΉ„μ˜ μŠ€ν”„λ§, κΉ€μ˜ν•œλ‹˜μ˜ μŠ€ν”„λ§ κ°•μ˜λ₯Ό μˆ˜κ°•ν•˜λ©΄μ„œ μ •λ¦¬ν•œ λ‚΄μš©μ„ @kses1010 λ‹˜μ΄ μž‘μ„±

μ œμ–΄μ˜ μ—­μ „ (IoC: Inversion of Control)

  • AppConfigκ°€ λ“±μž₯ ν›„ κ΅¬ν˜„ κ°μ²΄λŠ” μžμ‹ μ˜ λ‘œμ§μ„ μ‹€ν–‰ν•˜λŠ” μ—­ν• λ§Œ ν•œλ‹€. ν”„λ‘œκ·Έλž¨μ˜ μ œμ–΄ 흐름은 AppConfigκ°€ λ‹΄λ‹Ήν•œλ‹€. β†’ orderServiceImpl은 ν•„μš”ν•œ μΈν„°νŽ˜μ΄μŠ€λ“€μ„ ν˜ΈμΆœν•˜μ§€λ§Œ μ–΄λ–€ κ΅¬ν˜„ 객체듀이 싀행될지 λͺ¨λ¦„.
  • ν”„λ‘œκ·Έλž¨μ˜ μ œμ–΄ 흐름을 직접 μ œμ–΄ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ™ΈλΆ€μ—μ„œ κ΄€λ¦¬ν•˜λŠ” 것 β†’ μ œμ–΄μ˜ μ—­μ „(IoC)

ν”„λ ˆμž„μ›Œν¬ vs 라이브러리

  • ν”„λ ˆμž„μ›Œν¬: λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œλ₯Ό μ œμ–΄, λŒ€μ‹  μ‹€ν–‰ν•˜λ©΄ ν”„λ ˆμž„μ›Œν¬(JUnit)
  • 라이브러리: λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œκ°€ 직접 제의 흐름을 λ‹΄λ‹Ή. (객체 β†’ JSON으둜 λ°”κΎΈκΈ°)

μ˜μ‘΄κ΄€κ³„ μ£Όμž…(DI: Dependency Injection)

  • μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜κΈ° λ•Œλ¬Έμ— μ‹€μ œ μ–΄λ–€ κ΅¬ν˜„ 객체가 μ‚¬μš©λ μ§€λŠ” λͺ¨λ₯Έλ‹€.
  • μ˜μ‘΄κ΄€κ³„λŠ” 정적인 클래슀 의쑴 관계와 μ‹€ν–‰ μ‹œμ μ— κ²°μ •λ˜λŠ” 동적인 객체(μΈμŠ€ν„΄μŠ€) 의쑴 관계 λ‘˜μ„ λΆ„λ¦¬ν•΄μ„œ 생각해야 ν•œλ‹€.

정적인 클래슀 의쑴 관계

import μ½”λ“œλ§Œ 보고 μ˜μ‘΄κ΄€κ³„λ₯Ό μ‰½κ²Œ νŒλ‹¨ν•  수 μžˆλ‹€.

β†’ 정적인 μ˜μ‘΄κ΄€κ³„λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜μ§€ μ•Šμ•„λ„ 뢄석할 수 μžˆλ‹€. image

public class AppConfig {

    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    private MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }
    // κ³ μ • 할인 μ •μ±…
    public DiscountPolicy discountPolicy() {
        return new FixDiscountPolicy();
    }
}

// OrderServiceImpl.class
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;
    }
}

이제 μ—¬κΈ°μ„œ OrderSeviceImplμ—μ„œ κ³ μ • 할인 정책이 μ•„λ‹Œ ν• μΈμœ¨ μ •μ±…μœΌλ‘œ λ³€κ²½ν•  경우

public DiscountPolicy discountPolicy() {
//        return new FixDiscountPolicy();
        return new RateDiscountPolicy();
}

둜만 λ°”κΎΈλ©΄ λ©λ‹ˆλ‹€. μ„œλΉ„μŠ€ 둜직인 OrderServiceImplμ—μ„œ λ°”κΏ€ ν•„μš”κ°€ μ—†κ² μ£ ? 이건 μžλ°”λ‘œμ§μ΄κ³  μ—¬κΈ°μ„œ λ§Œμ•½ μŠ€ν”„λ§μœΌλ‘œ μ „ν™˜ν•œλ‹€λ©΄

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    @Bean
    public DiscountPolicy discountPolicy() {
//        return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }
}

둜 μ• λ„ˆν…Œμ΄μ…˜μœΌλ‘œ 등둝이 κ°€λŠ₯ν•©λ‹ˆλ‹€. κΉ€μ˜ν•œλ‹˜ κ°•μ˜μ—μ„œλŠ” xmlμ—μ„œ μ• λ„ˆν…Œμ΄μ…˜μœΌλ‘œ λ°”κΎΈλŠ” 좔세라고 ν•˜μ…¨κ³ , xml을 μ“΄λ‹€κ³  ν•˜λ©΄ μ•„λ§ˆ λ ˆκ±°μ‹œμͺ½μ΄ 많이 μ“Έ λ“―ν•˜λ„€μš”. IoCλŠ” μ œμ–΄μ˜ 역전이며, DIλŠ” μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ§€μ›ν•˜λŠ” IoC의 ν˜•νƒœλΌκ³  μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€. μžμ„Έν•œκ±΄ μΈν”„λŸ°μ˜ κΉ€μ˜ν•œλ‹˜ κ°•μ˜ λ˜λŠ” ν† λΉ„μ˜ μŠ€ν”„λ§μ„ μΆ”μ²œν•©λ‹ˆλ‹€!

X Tutup