상세 컨텐츠

λ³Έλ¬Έ 제λͺ©

[μŠ€ν”„λ§1] 객체 지ν–₯ 섀계와 μŠ€ν”„λ§, DI

22-23/22-23 Spring 1

by YUZ 유즈 2022. 9. 29. 10:00

λ³Έλ¬Έ

728x90

πŸ” μŠ€ν”„λ§μ˜ 탄생 λ°°κ²½

2000λ…„λŒ€ 초반, μžλ°” κ°œλ°œμžλ“€μ€ EJBλΌλŠ” μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ λͺ¨λΈμ„ μ‚¬μš©ν–ˆλ‹€.

μœ μ—°ν•¨μ„ 찾아보기 νž˜λ“  μ •ν˜•ν™”λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ, μžλ°” κ°œλ°œμžλ“€μ€ 객체 지ν–₯ μ–Έμ–΄λ₯Ό μ‚¬μš©ν•¨μ—λ„ 객체 지ν–₯적인 μ„œλ²„ κ°œλ°œμ„ μ΄μ–΄λ‚˜κ°€λŠ” 것이 쉽지 μ•Šμ•˜κ³  심지어 λŠλ Έλ‹€.

그러던 무렡, 이에 λΆˆλ§Œμ„ 가진 λͺ‡ 개발자의 λ…Έλ ₯으둜 λ“œλ””μ–΄ 'μŠ€ν”„λ§'이 세상에 λ‚˜μ˜¨λ‹€. ν˜„μž¬λŠ” μŠ€ν”„λ§κ³Ό ν•¨κ»˜ JPA, ν•˜μ΄λ²„λ„€μ΄νŠΈκ°€ 많이 μ‚¬μš©λ˜κ³  μžˆλ‹€.

πŸ” μŠ€ν”„λ§ κ°œλ°œμ„ λ•λŠ” λ‹€μ–‘ν•œ 도ꡬ

  • μŠ€ν”„λ§ 데이터 : 각쒅 DB의 CRUDλ₯Ό λ•λŠ” 기술(예: μŠ€ν”„λ§ 데이터 JPA)
  • μŠ€ν”„λ§ μ„Έμ…˜ : μ„Έμ…˜ κΈ°λŠ₯을 νŽΈλ¦¬ν•˜κ²Œ λ•λŠ” 기술
  • μŠ€ν”„λ§ μ‹œνλ¦¬ν‹° : λ³΄μ•ˆ κΈ°λŠ₯ 편의 기술
  • μŠ€ν”„λ§ Rest Docs : API λ¬Έμ„œν™” 및 ν…ŒμŠ€νŠΈ κ°„νŽΈν™” 기술
  • μŠ€ν”„λ§ 배치 : 배치 μ²˜λ¦¬μ— νŠΉν™”λœ 기술
    • 배치 처리 : 1000만 건의 데이터λ₯Ό λ³€κ²½ν•΄μ•Ό ν•  λ•Œ n개 λ‹¨μœ„λ‘œ μͺΌκ°œμ„œ μž‘μ—…ν•˜λŠ” 것
  • μŠ€ν”„λ§ ν΄λΌμš°λ“œ : ν΄λΌμš°λ“œ κΈ°λŠ₯을 νŽΈλ¦¬ν•˜κ²Œ λ•λŠ” 기술

πŸ” μŠ€ν”„λ§ λΆ€νŠΈ

μŠ€ν”„λ§ λΆ€νŠΈλž€, μŠ€ν”„λ§μ„ νŽΈν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ—¬λŸ¬ 가지 초기 μ„ΈνŒ…κ³Ό 관리λ₯Ό λ„μ™€μ£ΌλŠ” 도ꡬ이닀.

starter 쒅속성을 μ œκ³΅ν•˜κ±°λ‚˜ μ„œλ“œνŒŒν‹° 라이브러리 쀑 μ›ν•˜λŠ” 것을 κ³ λ₯΄λ©΄ 이것듀이 ν¬ν•¨λœ μƒˆ ν”„λ‘œμ νŠΈλ₯Ό 생성해쀀닀.

κ²Œλ‹€κ°€ Tomcat 같은 λ‚΄μž₯ μ›Ή μ„œλ²„λ„ 가지고 μžˆμ–΄ λ³„λ„λ‘œ μ›Ή μ„œλ²„μ— 올릴 ν•„μš”κ°€ μ—†λ‹€.

πŸ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°

πŸ“Œ λͺ©ν‘œ

ν”„λ‘œκ·Έλž˜λ°μ„ λͺ…λ Ήμ–΄μ˜ λ‚˜μ—΄μ΄λΌ μƒκ°ν•˜μ§€ μ•Šκ³  ‘객체’의 묢음이라고 μƒκ°ν•˜κ³  κ°μ²΄λ“€μ˜ 독립적이고, λ•Œλ‘œλŠ” 쒅속적인 μƒν˜Έμž‘μš©μ„ 톡해 ν”„λ‘œκ·Έλž¨μ„ κ΅¬μ„±ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•œλ‹€.

 

πŸ“Œ λ‹€ν˜•μ„±

각 객체듀은 μœ μ—°ν•˜κ³  변경이 쉽도둝 λ§Œλ“œλŠ” 것이 μž₯점이며, μ΄λŸ¬ν•œ 이유둜 λŒ€κ·œλͺ¨ ν”„λ‘œμ νŠΈμ— 많이 ν™œμš©λœλ‹€.

객체 지ν–₯ μ–Έμ–΄μ˜ κ°€μž₯ 큰 특μž₯점인 'λ‹€ν˜•μ„±'도 빼놓을 수 μ—†λ‹€.

객체λ₯Ό 섀계할 λ•Œ λΆ€λͺ¨κ²©μΈ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ¨Όμ € μ„€κ³„ν•˜κ³ , μΈν„°νŽ˜μ΄μŠ€μ˜ νŠΉμ„±μ„ κ°–κ³  μžˆλŠ” κ΅¬ν˜„ 객체(클래슀)λ₯Ό 톡해 λΉ„μŠ·ν•˜μ§€λ§Œ λ‹€λ₯Έ μ—¬λŸ¬ 가지 ν˜•μ§ˆμ˜ 객체λ₯Ό 생성할 수 μžˆλ‹€λŠ” 점이 νŠΉμ§•μ΄λ‹€.

πŸ” SOLID 원칙

  1. SRP 단일 μ±…μž„ 원칙(Single responsibility principle)
    • ν•œ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•Ό ν•œλ‹€.
    • λ³€κ²½ν•  λ•Œ λ§Žμ€ 뢀뢄을 λ³€κ²½ν•˜μ§€ μ•ŠλŠ”μ§€ μ—¬λΆ€κ°€ μ€‘μš”ν•˜λ‹€. κ·Έλ ‡λ‹€κ³  λͺ¨λ“  κΈ°λŠ₯을 λ‹€ μͺΌκ°œλ©΄ κ³€λž€ν•˜λ‹€. κ·Έλ ‡λ‹€κ³  ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— λ„ˆλ¬΄ λ§Žμ€ μ±…μž„μ΄ λ“€μ–΄κ°€μ„œλ„ μ•ˆ λœλ‹€. μ μ ˆν•œ 양을 μœ μ§€ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.
  2. OCP 개방-폐쇄 원칙(Open/closed principle)
    • μ†Œν”„νŠΈμ›¨μ–΄μ˜ μš”μ†ŒλŠ” ν™•μž₯μ—λŠ” μ—΄λ € μžˆμœΌλ‚˜ λ³€κ²½μ—λŠ” λ‹«ν˜€μ•Ό ν•œλ‹€.
    • λ‹€ν˜•μ„±
      • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ‘μƒˆλ‘œμš΄ 클래슀’λ₯Ό 톡해 μƒˆλ‘œμš΄ κΈ°λŠ₯을 ν™•μž₯ν•œλ‹€.
      • κΈ°μ‘΄ ν΄λž˜μŠ€λŠ” κ±΄λ“œλ¦¬μ§€ μ•ŠλŠ”λ‹€.
  3. LSP λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙
    • ν”„λ‘œκ·Έλž¨μ˜ κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ 정확성을 κΉ¨λœ¨λ¦¬μ§€ μ•ŠμœΌλ©΄μ„œ ν•˜μœ„ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ‘œ λ°”κΏ€ 수 μžˆμ–΄μ•Ό ν•œλ‹€.
    • λ‹€ν˜•μ„±μ—μ„œ ν•˜μœ„ ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€ κ·œμ•½μ„ λ‹€ μ§€μΌœμ•Ό ν•œλ‹€.
  4. ISP μΈν„°νŽ˜μ΄μŠ€ 지원 원칙
    • κΈ°λŠ₯에 맞게 μΈν„°νŽ˜μ΄μŠ€λ„ μ λ‹Ήνžˆ μͺΌκ°œμ•Ό ν•œλ‹€.
  5. DIP μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙
    • κ΅¬ν˜„ ν΄λž˜μŠ€μ— μ˜μ‘΄ν•˜μ§€ 말고 μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•΄μ•Ό ν•œλ‹€.
    • λ§Œμ•½μ— κ΅¬ν˜„ ν΄λž˜μŠ€κΉŒμ§€ μ˜μ‘΄ν•˜κ³  μžˆλ‹€λ©΄, κ΅¬ν˜„ 클래슀λ₯Ό λ³€κ²½ν–ˆμ„ λ•Œ κ·Έ 뢀뢄도 ν•¨κ»˜ λ³€κ²½ν•΄μ£Όμ–΄μ•Ό ν•˜λ―€λ‘œ DIP μœ„λ°˜μ΄λ‹€.

πŸ” SOLID 원칙을 μ§€ν‚€λŠ” μŠ€ν”„λ§ μ½”λ“œλž€?

κ°•μ˜μ—μ„œλŠ” λ‹€ν˜•μ„±μ„ ν™œμš©ν•œ μ½”λ“œλ₯Ό μ†Œκ°œν•œλ‹€. μ„€λͺ…을 μœ„ν•΄ κ°•μ˜ 자료λ₯Ό μ²¨λΆ€ν•œλ‹€.

 

μ—¬κΈ°μ—μ„œ μ£Όλͺ©ν•΄μ•Ό ν•  뢀뢄은 νšŒμ› μ €μž₯μ†Œμ™€ 할인 정책이닀. 'νšŒμ› μ €μž₯μ†Œ μ—­ν• 'κ³Ό '할인 μ •μ±… μ—­ν• (DiscountPolicy)'은 μΈν„°νŽ˜μ΄μŠ€λ‘œ, ν•˜μœ„μ˜ μ €μž₯μ†Œμ™€ 정책은 κ΅¬ν˜„ 클래슀둜 λ§Œλ“€μ–΄μ Έ μžˆλ‹€.

μ΄λ•Œ μ €μž₯μ†Œμ™€ 정책을 원할 λ•Œλ§ˆλ‹€ λ³€κ²½ν•˜κ³ , λ™μ‹œμ— 적은 μˆ˜μ •μœΌλ‘œ 정말 ν•„μš”ν•œ κ³³μ—λ§Œ 변경점을 μ£ΌλŠ” 것이 λͺ©ν‘œλ‹€.

μš°λ¦¬κ°€ μ§€κΈˆκΉŒμ§€ μž‘μ„±ν–ˆλ˜ μ½”λ“œμ˜ λͺ¨μŠ΅μ€ μ•„λž˜μ™€ κ°™λ‹€.

 

private final DiscountPolicy discountPolicy = new FixDiscountPolicy();

이 μ½”λ“œ μžμ²΄κ°€ λ¬Έμ œκ°€ λ˜μ§€λŠ” μ•Šμ§€λ§Œ, 이 μ½”λ“œκ°€ ν΄λΌμ΄μ–ΈνŠΈλ‹¨μ—μ„œ μ‹€ν–‰λœλ‹€λ©΄ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.(OCP μœ„λ°˜)

μš°λ¦¬λŠ” μ„œλ²„μ—μ„œμ˜ 변경점을 ν΄λΌμ΄μ–ΈνŠΈ λͺ¨λ₯΄κ²Œ μ μš©ν•˜λŠ” κ±Έ λͺ©ν‘œλ‘œ ν–ˆλŠ”λ°, 이 μ½”λ“œκ°€ ν΄λΌμ΄μ–ΈνŠΈμ— μžˆλŠ” κ±°λ‹€.

ν΄λΌμ΄μ–ΈνŠΈ μž…μž₯μ—μ„œλŠ” 할인 정책이 μ–΄λ–€ 것이든 상관없이 'ν΄λΌμ΄μ–ΈνŠΈκ°€ μ›ν•˜λŠ” 할인이 적용되면 λ˜λŠ”λ°', μ΄λ ‡κ²Œ 되면 ν΄λΌμ΄μ–ΈνŠΈκ°€ 직접 μ •μ•‘ 할인 정책을 μ‚¬μš©ν•  건지, μ •λ₯  할인 정책을 μ‚¬μš©ν•  건지 μ •ν•˜λŠ” 꼴이 λ˜λ‹ˆ 말이닀.

 

'λ‚œ μ •λ₯  할인 μ •μ•‘ 할인 그게 뭔지 λͺ¨λ₯΄κ² κ³  10% 할인해달라고~'

 

λ¬Έμ œκ°€ ν•˜λ‚˜ 더 μžˆλ‹€. 이게 더 ν™•μ‹€ν•œ λ¬Έμ œλ‹€.

μΈν„°νŽ˜μ΄μŠ€ DiscountPolicy와 이λ₯Ό κ΅¬ν˜„ν•œ κ΅¬ν˜„ 클래슀 FixDiscountPolicyκ°€ μ‘΄μž¬ν•œλ‹€λŠ” 점이닀. μ•„κΉŒ 봀던 SOLID 원칙 쀑 DIPλ₯Ό μœ„λ°˜ν•œ 것이닀. 그럼 κ²°κ΅­ μ•„λž˜μ™€ 같은 μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜λΌλŠ” 건가?

private DiscountPolicy discountPolicy;

λΉ„μŠ·ν•˜λ‹€. 근데, 그럼 μ–΄λ–€ 할인 정책을 μ‚¬μš©ν•˜λŠ”μ§€λŠ” μ–Έμ œ μ•Œκ²Œ λ˜μ§€?

μƒμ„±μžλ₯Ό 톡해 μ˜μ‘΄μ„±μ„ μ£Όμž…ν•˜λŠ” μž‘μ—…μ΄ μ΄λ•Œ μΌμ–΄λ‚œλ‹€. 이λ₯Ό DI(Dependency Injection)이라고 ν•œλ‹€.

 

그리고 μ΄λŸ¬ν•œ μž‘μ—…μ„ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ…λ¦½μ‹œν‚€κΈ° μœ„ν•΄ AppConfig νŒŒμΌμ„ λ§Œλ“€μ–΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 전체 λ™μž‘ 방식을 κ΅¬μ„±ν•˜λ„λ‘ ν•œλ‹€. 이λ₯Ό 기반으둜

 

1) μƒμ„±μžλ₯Ό ν†΅ν•œ μ˜μ‘΄μ„± μ£Όμž…

    private final DiscountPolicy discountPolicy;

    public OrderServiceImpl(DiscountPolicy discountPolicy) {
        this.discountPolicy = discountPolicy;
    }

2) AppConfig 파일 λ‚΄μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈ μ‹€ν–‰ν•˜λ©° μ›ν•˜λŠ” 클래슀λ₯Ό μƒμ„±μž νŒŒλΌλ―Έν„°λ‘œ μ‚½μž…

public OrderService orderService() {
        return new OrderServiceImpl(new FixDiscountPolicy());
}

3) μ‹€ν–‰ 및 ν…ŒμŠ€νŠΈ μ‹œμ— AppConfigλ₯Ό μ„ μ–Έν•˜μ—¬ κ·Έ μ•ˆμ˜ orderService 호좜

AppConfig appConfig = new AppConfig();
OrderService orderService = appConfig.orderService();

μ΄λ ‡κ²Œ μ‹€ν–‰ν•΄μ£Όλ©΄ OCP, DIP μœ„λ°˜ μš”μ†Œκ°€ μ œκ±°λœλ‹€.

❓ ν€΄μ¦ˆ

  1. μŠ€ν”„λ§ λΆ€νŠΈλž€?
  2. SOLID 원칙 5κ°€μ§€λŠ” 무엇인가?
  3. 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ μž₯점 쀑 상속을 톡해 ν•˜λ‚˜μ˜ 객체가 μ—¬λŸ¬ μ’…λ₯˜κ°€ 될 수 μžˆλ‹€λŠ” νŠΉμ§•μ€?
  4. μŠ€ν”„λ§ 도ꡬ 쀑 μŠ€ν”„λ§ λ°μ΄ν„°μ˜ μ˜ˆμ‹œλŠ”?
  5. DIP 의쑴 관계 μ—­μ „ 원칙을 μœ„λ°˜ν•˜λŠ” μ˜ˆμ‹œλ₯Ό λ§ν•΄λ³΄μž.

 

ν•΄λ‹Ή ν¬μŠ€νŠΈλŠ” μŠ€ν”„λ§ 핡심 원리 - 기본편 κ°•μ˜ λ‚΄μš©μ„ μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 


Spring 1

Editor : PORO

728x90

κ΄€λ ¨κΈ€ 더보기