Skip to content

KimJaeChang/spring-study

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

60 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

μŠ€ν”„λ§ μž…λ¬Έ

  • MVC와 ν…œν”Œλ¦Ώ μ—”μ§„

    • μ›Ή λΈŒλΌμš°μ € -> ν†°μΊ£ μ„œλ²„ -> μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ•ˆμ— μžˆλŠ” Controllerκ°€ λ°›μ•„μ„œ viewResolver둜 μ›Ή λΈŒλΌμš°μ €λ‘œ return
  • API

    • @ResponseBody 이용
      • μ›Ή λΈŒλΌμš°μ € -> ν†°μΊ£ μ„œλ²„ -> μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ•ˆμ— μžˆλŠ” Controllerκ°€ λ°›μ•„μ„œ HttpMessateConverter둜 μ›Ή λΈŒλΌμš°μ €λ‘œ return
        • κΈ°λ³Έ 문자처리 : StringHttpMessageConverter
        • κΈ°λ³Έ 객체처리 : MappingJackson2HttpMessageConverter(JsonConverter)
  • μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”κ³Ό μžλ™ μ˜μ‘΄κ΄€κ³„ μ„€μ •

  • @Autowired
    • μƒμ„±μžμ— @Autowiredκ°€ 있으면 μŠ€ν”„λ§μ΄ μ—°κ΄€λœ 객체λ₯Ό μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ°Ύμ•„μ„œ λ„£μ–΄μ€€λ‹€.
    • μ΄λ ‡κ²Œ 객체의쑴 관계λ₯Ό μ™ΈλΆ€μ—μ„œ λ„£μ–΄μ£ΌλŠ” 것을 DI(Dependency Injection), μ˜μ‘΄μ„± μ£Όμž…μ΄λΌ ν•œλ‹€.
    • μŠ€ν”„λ§μ€ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μŠ€ν”„λ§ λΉˆμ„ 등둝할 λ•Œ, 기본으둜 '싱글톀'으둜 λ“±λ‘ν•œλ‹€(μœ μΌν•˜κ²Œ ν•˜λ‚˜λ§Œ λ“±λ‘ν•΄μ„œ κ³΅μœ ν•œλ‹€.)
    • λ”°λΌμ„œ 같은 μŠ€ν”„λ§ 빈이면 λͺ¨λ‘ 같은 μΈμŠ€ν„΄μŠ€λ‹€.
    • μ„€μ •μœΌλ‘œ 싱글톀이 μ•„λ‹ˆκ²Œ μ„€μ •ν•  수 μžˆμ§€λ§Œ, νŠΉλ³„ν•œ 경우λ₯Ό μ œμ™Έν•˜λ©΄ λŒ€λΆ€λΆ„ 싱글톀을 μ‚¬μš©ν•œλ‹€.
  • @Component
    • ν•΄λ‹Ή μ• λ…Έν…Œμ΄μ…˜μ„ μ“°λ©΄ μŠ€ν”„λ§ 빈으둜 μžλ™ λ“±λ‘λœλ‹€.
  • @Controller
    • μ»¨νŠΈλ‘€λŸ¬κ°€ μŠ€ν”„λ§ 빈으둜 μžλ™ λ“±λ‘λœ μ΄μœ λ„ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ” λ•Œλ¬Έμ΄λ‹€.
  • 주의

    • Spring Boot κΈ°μ€€
      • μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ‹œ main λ©”μ†Œλ“œκ°€ ν¬ν•¨λœ λ””λ ‰ν† λ¦¬μ—μ„œλ§Œ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ΄ μ μš©λœλ‹€.
      • λ‹€λ₯Έ λ””λ ‰ν† λ¦¬μ—μ„œλ„ 적용되게 ν•˜λ €λ©΄ @ComponentScan이 ν•„μš”ν•˜λ‹€.
  • 순수 JDBC

    • μˆœμ„œ
      1. Connection μ—°κ²° - Connection conn = getConnection();
      2. PrepareStatement 생성 - PrepareStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)
      3. νŒŒλΌλ―Έν„° μ„ΈνŒ… - pstmt.setString(1, 데이터 κ°’);
      4. ResultSet μ„ΈνŒ… - ResultSet rs = pstmt.getGeneratedKeys()
  • 주의

    • κΌ­ connection을 close ν•΄μ•Όν•œλ‹€.
  • Spring Data JPA

    • μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•œ 기본적인 CRUD
    • νŽ˜μ΄μ§• κΈ°λŠ₯ μžλ™ 제곡
  • Spring AOP

    • ProceedingJoinPoint = joinPoint.proceed()둜 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μ‹€ν–‰μ‹œκ°„ μΈ‘μ • κ°€λŠ₯

μŠ€ν”„λ§ κΈ°λ³Έ

  • Spring FrameWork

    • 핡심 기술 : μŠ€ν”„λ§ DI μ»¨ν…Œμ΄λ„ˆ, AOP, 이벀트, 기타
    • μ›Ή 기술 : μŠ€ν”„λ§ MVC, μŠ€ν”„λ§ WebFlux
    • 데이터 μ ‘κ·Ό 기술 : νŠΈλžœμž­μ…˜, JDBC, ORM지원, XML 지원
    • 기술 톡합 : μΊμ‹œ, 이메일, 원격접근, μŠ€μΌ€μ€„λ§
    • ν…ŒμŠ€νŠΈ : μŠ€ν”„λ§ 기반 ν…ŒμŠ€νŠΈ 지원
    • μ–Έμ–΄ : μ½”ν‹€λ¦°, 그루비
  • Spring Boot

    • μŠ€ν”„λ§μ„ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ 지원, μ΅œκ·Όμ—λŠ” 기본으둜 μ‚¬μš©
    • λ‹¨λ…μœΌλ‘œ μ‹€ν–‰ν•  수 μžˆλŠ” μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‰½κ²Œ 생성
    • Tomcat 같은 μ›Ή μ„œλ²„λ₯Ό λ‚΄μž₯ν•΄μ„œ λ³„λ„μ˜ 우베 μ„œλ²„λ₯Ό μ„€μΉ˜ν•˜μ§€ μ•Šμ•„λ„ 됨
    • μ†μ‰¬μš΄ λΉŒλ“œ ꡬ성을 μœ„ν•œ starter 쒅속성 제곡
    • μŠ€ν”„λ§κ³Ό 3rd parth(μ™ΈλΆ€) 라이브러리 μžλ™ ꡬ성
    • λ©”νŠΈλ¦­, μƒνƒœ 확인, μ™ΈλΆ€ ꡬ성 같은 ν”„λ‘œλ•μ…˜ μ€€λΉ„ κΈ°λŠ₯ 제곡
    • 관둀에 μ˜ν•œ κ°„κ²°ν•œ μ„€μ •
  • IOC - μ œμ–΄μ˜ μ—­μ „ (Inversion of Control)

    • ν”„λ‘œκ·Έλž¨μ˜ μ œμ–΄ 흐름을 직접 μ œμ–΄ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ™ΈλΆ€μ—μ„œ κ΄€λ¦¬ν•˜λŠ” 것을 μ œμ–΄μ˜ μ—­μ „(IOC)이라 ν•œλ‹€.
      • ex)
        • Junit
  • DI - μ˜μ‘΄κ΄€κ³„ μ£Όμž… (Dependency Injection)

  • IOC μ»¨ν…Œμ΄λ„ˆ 및 DI μ»¨ν…Œμ΄λ„ˆ

    • AppConfig 처럼 객체λ₯Ό μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λ©΄μ„œ μ˜μ‘΄κ΄€κ³„λ₯Ό μ—°κ²°ν•΄ μ£ΌλŠ”κ²ƒμ„ IOC μ»¨ν…Œμ΄λ„ˆ λ˜λŠ” DI μ»¨ν…Œμ΄λ„ˆ 라고 ν•œλ‹€.
    • μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ— μ΄ˆμ μ„ λ§žμΆ”μ–΄ μ΅œκ·Όμ—λŠ” DI μ»¨ν…Œμ΄λ„ˆλΌ ν•œλ‹€.
    • λ˜λŠ” μ–΄μƒ˜λΈ”λŸ¬, 였브젝트 νŒ©ν† λ¦¬ λ“±μœΌλ‘œ λΆˆλ¦¬κΈ°λ„ ν•œλ‹€.
  • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ

    • ApplicationContextλ₯Ό μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλΌ ν•œλ‹€.
      • ex) AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
    • ApplicationContextλŠ” μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€.
    • XML 기반으둜 λ§Œλ“€ 수 있고, μ• λ…Έν…Œμ΄μ…˜ 기반의 μžλ°” μ„€μ • 클래슀둜 λ°˜λ“€ 수 μžˆλ‹€.
    • @Configuration이 뢙은 μ„€μ • 정보 ꡬ성을 μ‚¬μš©ν•˜λ©° @Bean이 뢙은 λ©”μ†Œλ“œλ₯Ό λͺ¨λ‘ ν˜ΈμΆœν•΄μ„œ λ°˜ν™˜λœ 객체λ₯Ό μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— λ“±λ‘ν•œλ‹€ (싱글톀 방식)
    • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” νŒŒλΌλ―Έν„°λ‘œ λ„˜μ–΄μ˜¨ μ„€μ • 클래슀 정보(default : 클래슀 λͺ…μ˜ 맨 μ•žκΈ€μžλ§Œ μ†Œλ¬Έμžλ‘œ μ‚¬μš©)λ₯Ό μ‚¬μš©ν•΄μ„œ μŠ€ν”„λ§ λΉˆμ„ λ“±λ‘ν•œλ‹€.
    • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” μ„€μ • 정보λ₯Ό μ°Έκ³ ν•΄μ„œ μ˜μ‘΄κ΄€κ³„λ₯Ό μ£Όμž…(DI)ν•œλ‹€.
    • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ˜ κΈ°λ³Έ 빈 등둝방식은 μ‹±κΈ€ν†€μ΄μ§€λ§Œ μš”μ²­ν•  λ•Œ λ§ˆλ‹€ μƒˆλ‘±γ„΄ 객체λ₯Ό μƒμ„±ν•΄μ„œ λ°˜ν™˜ν•˜λŠ” κΈ°λŠ₯도 μ œκ³΅ν•œλ‹€ (빈 μŠ€μ½”ν”„)
    • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” 싱글톀 νŒ¨ν„΄μ„ μ μš©ν•˜μ§€ μ•Šμ•„λ„, 객체 μΈμŠ€ν„΄μŠ€λ₯Ό μ‹±κΈ€ν†€μœΌλ‘œ κ΄€λ¦¬ν•œλ‹€.
    • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” 싱글톀 μ»¨ν…Œμ΄λ„ˆ 역할을 ν•œλ‹€. μ΄λ ‡κ²Œ 싱글톀 객체λ₯Ό μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” κΈ°λŠ₯을 싱글톀 λ ˆμ§€μŠ€νŠΈλ¦¬λΌ ν•œλ‹€.
    • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ˜ 이런 κΈ°λŠ₯ 덕뢄에 싱글톀 νŒ¨ν„΄μ˜ λͺ¨λ“  단점을 ν•΄κ²°ν•˜λ©΄μ„œ 객체λ₯Ό μ‹±κΈ€ν†€μœΌλ‘œ μœ μ§€ν•  수 μžˆλ‹€.
      • 싱글톀 νŒ¨ν„΄μ„ μœ„ν•œ μ§€μ €λΆ„ν•œ μ½”λ“œκ°€ λ“€μ–΄κ°€μ§€ μ•Šμ•„λ„ λœλ‹€.
      • DIP, OCP, ν…ŒμŠ€νŠΈ private μƒμ„±μžλ‘œλΆ€ν„° 자유둭게 싱글톀을 μ‚¬μš©ν•  수 μžˆλ‹€.
  • μŠ€ν”„λ§ Bean

    • BeanFactory와 ApplicationContextλŠ” λͺ¨λ‘ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλΌκ³  ν•œλ‹€.
    • img_1.png
      • BeanFactory

        • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ˜ μ΅œμƒμœ„ μΈν„°νŽ˜μ΄μŠ€λ‹€.
        • μŠ€ν”„λ§ λΉˆμ„ κ΄€λ¦¬ν•˜κ³  μ‘°νšŒν•˜λŠ” μ—­ν™œμ„ λ‹΄λ‹Ήν•œλ‹€.
        • getBeanDefinitionNames() 으둜 λͺ¨λ“  빈 쑰회 κ°€λŠ₯
        • getBean(빈 name, class) 으둜 νŠΉμ • 빈 쑰회 κ°€λŠ₯
        • Role ROLE_APPLICATION : 직접 λ“±λ‘ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 빈
        • Role ROLE_INFRASTRUCTURE : μŠ€ν”„λ§μ΄ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•˜λŠ” 빈
        • getBeansOfType() 으둜 같은 class νƒ€μž…μœΌλ‘œ λ“±λ‘λœ λΉˆμ„ λͺ¨λ‘ 쑰회 κ°€λŠ₯
        • λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ getBean() μ‘°νšŒμ‹œ, μžμ‹μ΄ λ‘˜ 이상 있으면, 쀑볡 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
        • λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ getBean() μ‘°νšŒμ‹œ, μžμ‹μ΄ λ‘˜ 이상 있으면, 빈 이름을 μ§€μ •ν•˜λ©΄ 정상 μž‘λ™ν•œλ‹€.
      • ApplicationContext

        • BeanFactory κΈ°λŠ₯을 λͺ¨λ‘ μƒμ†λ°›μ•„μ„œ μ œκ³΅ν•œλ‹€. (μΈν„°νŽ˜μ΄μŠ€)
        • 빈 관리기λŠ₯ + νŽΈλ¦¬ν•œ λΆ€κ°€ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
        • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  λ•ŒλŠ” λΉˆμ€ κ΄€λ¦¬ν•˜κ³  μ‘°νšŒν•˜λŠ” κΈ°λŠ₯은 물둠이고, 수 λ§Žμ€ λΆ€κ°€κΈ°λŠ₯이 ν•„μš”ν•˜λ‹€.
          • λ©”μ‹œμ§€ μ†ŒμŠ€λ₯Ό ν™œμš©ν•œ κ΅­μ œν™” κΈ°λŠ₯

            • ex) ν•œκ΅­μ—μ„œ λ“€μ–΄μ˜€λ©΄ ν•œκ΅­μ–΄λ‘œ, μ˜μ–΄κΆŒμ—μ„œ λ“€μ–΄μ˜€λ©΄ μ˜μ–΄λ‘œ 좜λ ₯
          • ν™˜κ²½λ³€μˆ˜

            • local, dev, prod 등을 κ΅¬λΆ„ν•΄μ„œ 처리
          • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 이벀트

            • 이벀트λ₯Ό λ°œν–‰ν•˜κ³  κ΅¬λ…ν•˜λŠ” λͺ¨λΈμ„ νŽΈλ¦¬ν•˜κ²Œ 지원
          • νŽΈλ¦¬ν•œ λ¦¬μ†ŒμŠ€ 쑰회

            • file, classpath, μ™ΈλΆ€ λ“±μ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό νŽΈλ¦¬ν•˜κ²Œ 쑰회
      • BeanDefinition (μŠ€ν”„λ§ 빈 μ„€μ • 메타정보)

        • BeanDefinition을 빈 μ„€μ • 메타 정보라 ν•œλ‹€.
          • @Bean, λ‹Ή 각각 ν•˜λ‚˜μ”© 메타 정보가 μƒμ„±λœλ‹€.
        • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” 이 메타정보λ₯Ό 기반으둜 μŠ€ν”„λ§ λΉˆμ„ μƒμ„±ν•œλ‹€.
        • XML을 μ½μ–΄μ„œ BeanDefinition을 λ§Œλ“€λ©΄ λœλ‹€.
        • μžλ°” μ½”λ“œλ₯Ό μ½μ–΄μ„œ BeanDefinition을 λ§Œλ“€λ©΄ λœλ‹€.
        • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” μžλ°” μ½”λ“œμΈμ§€, XML인지 λͺ°λΌλ„ λœλ‹€. 였직 BeanDefinition만 μ•Œλ©΄ λœλ‹€.
        • BeanClassName : 생성할 빈의 클래슀 λͺ…(μžλ°” μ„€μ • 처럼 νŒ©ν† λ¦¬ μ—­ν• μ˜ λΉˆμ„ μ‚¬μš©ν•˜λ©΄ μ—†μŒ.)
        • factoryBeanName : νŒ©ν† λ¦¬ μ—­ν• μ˜ λΉˆμ„ μ‚¬μš©ν•  경우 이름, 예) appConfig
        • factoryMethodName : λΉˆμ„ 생성할 νŒ©ν† λ¦¬ λ©”μ„œνŠΈ μ§€μ •, 예) memberService
        • Scope : 싱글톀(κΈ°λ³Έκ°’)
        • lazyInit : μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλ₯Ό 생성할 λ•Œ λΉˆμ„ μƒμ„±ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μ‹€μ œ λΉˆμ„ μ‚¬μš©ν•  λ•Œ κΉŒμ§€ μ΅œλŒ€ν•œ 생성을 μ§€μ—°μ²˜λ¦¬ ν•˜λŠ”μ§€ μ—¬λΆ€
        • InitMethodName : λΉˆμ„ μƒμ„±ν•˜κ³ , μ˜μ‘΄κ΄€κ³„λ₯Ό μ μš©ν•œ 뒀에 ν˜ΈμΆœλ˜λŠ” μ΄ˆκΈ°ν™” λ©”μ„œλ“œ λͺ…
        • DestroyMethodName : 빈의 생λͺ…μ£ΌκΈ°κ°€ λλ‚˜μ„œ μ œκ±°ν•˜κΈ° 직전에 ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œ λͺ…
        • Constructor arguments, properties : μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ—μ„œ μ‚¬μš©ν•œλ‹€. (μžλ°” μ„€μ • 처럼 νŒ©ν† λ¦¬ μ—­ν• μ˜ λΉˆμ„ μ‚¬μš©ν•˜λ©΄ μ—†μŒ.)
        • img.png
    • μˆ˜λ™ 빈 생성과 μžλ™ 빈 생성
      • μˆ˜λ™ 빈과 μžλ™ 빈이 κ²ΉμΉ  λ•ŒλŠ” μˆ˜λ™ 빈 생성 ν΄λž˜μŠ€κ°€ μš°μ„  적용 img.png
      • μŠ€ν”„λ§ λΆ€νŠΈμ—μ„  μˆ˜λ™ 빈 및 μžλ™ 빈 등둝 였λ₯˜μ‹œ start ν•  λ•Œ μ—λŸ¬κ°€ λœ¬λ‹€. img.png
  • @Component

    • ν•΄λ‹Ή μ• λ…Έν…Œμ΄μ…˜μ„ 뢙이면 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μŠ€ν”„λ§ Bean으둜 λ“±λ‘λœλ‹€.
    • FilterType μ˜΅μ…˜

      • ANNOTATION : κΈ°λ³Έκ°’, μ• λ…Έν…Œμ΄μ…˜μ„ μΈμ‹ν•΄μ„œ λ™μž‘ν•œλ‹€.
      • ASSIGNABLE_TYPE : μ§€μ •ν•œ νƒ€μž…κ³Ό μžμ‹ νƒ€μž…μ„ μΈμ‹ν•΄μ„œ λ™μž‘ν•œλ‹€.
        • ex) kr.co.spring.dip.discount.FixDiscountPolicy.class
      • ASPECTJ : AspectJ νŒ¨ν„΄ μ‚¬μš©
        • ex) kr.co.spring..*Service+
      • REGEX : μ •κ·œ ν‘œν˜„μ‹
        • ex) kr.co.spring.dip.*
      • CUSTOM : TypeFilter λΌλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•΄μ„œ 처리
  • @ComponentScan

    • μ°Έκ³  : μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ„ μ‚¬μš©ν•˜λ©΄ @Configuration이 뢙은 μ„€μ • 정보도 μžλ™μœΌλ‘œ λ“±λ‘λ˜κΈ° λ•Œλ¬Έμ—, AppConfig, TestConfig λ“± μ•žμ„œ λ§Œλ“€μ–΄λ‘μ—ˆλ˜ μ„€μ • 정보도 ν•¨κ»˜ λ“±λ‘λ˜κ³ , μ‹€ν–‰λ˜μ–΄ 버린닀.
      κ·Έλž˜μ„œ excludeFiltersλ₯Ό μ΄μš©ν•΄μ„œ μ„€μ • μ •λ³΄λŠ” μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ” λŒ€μƒμ—μ„œ μ œμ™Έν–ˆλ‹€. 보톡 μ„€μ • 정보λ₯Ό μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ” λŒ€μƒμ—μ„œ μ œμ™Έν•˜μ§€λŠ” μ•Šμ§€λ§Œ, κΈ°μ‘΄ 예제 μ½”λ“œλ₯Ό μ΅œλŒ€ν•œ 남기고 μœ μ§€ν•˜κΈ° μœ„ν•΄μ„œ 이 방법을 μ„ νƒν–ˆλ‹€.
    • μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ€ 이름 κ·ΈλŒ€λ‘œ @Component μ• λ…Έν…Œμ΄μ…˜μ΄ 뢙은 클래슀λ₯Ό μŠ€μΊ”ν•΄μ„œ μŠ€ν”„λ§ 빈으둜 λ“±λ‘ν•œλ‹€.
    • μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ” λŒ€μƒ
      • @Component
      • @Controller : μŠ€ν”„λ§ MVC 컨트둀러둜 인식
      • @Service : νŠΉλ³„ν•œ 처리λ₯Ό ν•˜μ§€ μ•ŠλŠ”λ‹€. λ‹€λ§Œ κ°œλ°œμžλ“€μ΄ λΉ„μ¦ˆλ‹ˆμŠ€ 계측을 μΈμ‹ν•˜λŠ”λ° 도움이 됌
      • @Repository : μŠ€ν”„λ§ 데이터 μ ‘κ·Ό κ³„μΈ΅μœΌλ‘œ μΈμ‹ν•˜κ³ , 데이터 κ³„μΈ΅μ˜ μ˜ˆμ™Έλ₯Ό μŠ€ν”„λ§ μ˜ˆμ™Έλ‘œ λ³€ν™˜ν•΄μ€€λ‹€.
      • @Configuration : μŠ€ν”„λ§ μ„€μ • μ •λ³΄λ‘œ μΈμ‹ν•˜κ³ , μŠ€ν”„λ§ 빈이 싱글톀을 μœ μ§€ν•˜λ„λ‘ μΆ”κ°€ 처리λ₯Ό ν•œλ‹€.
  • λ‹€μ–‘ν•œ μ˜μ‘΄κ΄€κ³„ μ„€μ •

    • μ’…λ₯˜ :
      • μƒμ„±μž μ£Όμž…
        • μƒμ„±μž ν˜ΈμΆœμ‹œμ μ— λ”± 1번만 ν˜ΈμΆœλ˜λŠ” 것이 보μž₯λœλ‹€.
        • λΆˆλ³€, ν•„μˆ˜ μ˜μ‘΄κ΄€κ³„μ— μ‚¬μš©
        • ν΄λž˜μŠ€λ§ˆλ‹€ μƒμ„±μžκ°€ 1개일 λ–ˆ @AutoWired μƒλž΅ κ°€λŠ₯
      • μˆ˜μ •μž μ£Όμž…(setter μ£Όμž…)
        • 선택, λ³€κ²½ κ°€λŠ₯성이 μžˆλŠ” μ˜μ‘΄κ΄€κ³„μ— μ‚¬μš©
        • μžλ°” Bean ν”„λ‘œνΌν‹° κ·œμ•½μ˜ μˆ˜μ •μž λ©”μ„œλ“œ 방식을 μ‚¬μš©ν•˜λŠ” 방법
      • ν•„λ“œ μ£Όμž… (@Autowired)
        • @AutowiredλŠ” νƒ€μž…λ§€μΉ­μ„ μ‹œλ„ν•˜κ³ , μ΄λ•Œ μ—¬λŸ¬ 빈이 있으면 ν•„λ“œ 이름, νŒŒλΌλ―Έν„° μ΄λ¦„μœΌλ‘œ 빈 이름을 μΆ”κ°€ λ§€μΉ­ν•œλ‹€.
        • 빈이 2개 이상일 λ•Œ
          • @Qualifier
            • @Qualifier λ‘œλ„ μ°Ύμ§€ λͺ»ν•˜λ©΄ μŠ€ν”„λ§ 빈 μ΄λ¦„μœΌλ‘œ μΆ”κ°€λ‘œ μ°ΎλŠ”λ‹€. ν•˜μ§€λ§Œ κ²½ν—˜μƒ @QualifierλŠ” @Qualifierλ₯Ό μ°ΎλŠ” μš©λ„λ‘œλ§Œ μ‚¬μš©ν•˜λŠ”κ²Œ λͺ…ν™•ν•˜κ³  μ’‹λ‹€.
            • 정리
              1. @Qualifier 끼리 맀칭
              2. 빈 이름 λ§€μΉ­
              3. 1κ³Ό 2도 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ NoSuchBeanDefinitionException μ˜ˆμ™Έ λ°œμƒ
          • @Primary
      • 일반 λ©”μ„œλ“œ μ£Όμž…
    • κ²°λ‘  :
      • μƒμ„±μž μ£Όμž…μ„ 선택해라!
        • λΆˆλ³€
          • λŒ€λΆ€λΆ„μ˜ μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ€ ν•œλ²ˆ μΌμ–΄λ‚˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ’…λ£Œμ‹œμ κΉŒμ§€ μ˜μ‘΄κ΄€κ³„λ₯Ό λ³€κ²½ν•  일이 μ—†λ‹€. 였히렀 λŒ€λΆ€λΆ„μ˜ μ˜μ‘΄κ΄€κ³„λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ’…λ£Œ μ „κΉŒμ§€ λ³€ν•˜λ©΄ μ•ˆλœλ‹€.
          • μˆ˜μ •μž μ£Όμž…μ„ μ‚¬μš©ν•˜λ©΄, setXxx λ©”μ„œλ“œλ₯Ό public으둜 열어두어야 ν•œλ‹€.
          • λˆ„κ΅°κ°€ μ‹€μˆ˜λ‘œ λ³€κ²½ν•  μˆ˜λ„ 있고, λ³€κ²½ν•˜λ©΄ μ•ˆλ˜λŠ” λ©”μ„œλ“œλ₯Ό μ—΄μ–΄λ‘λŠ” 것은 쒋은 섀계 방법이 μ•„λ‹ˆλ‹€.
          • μƒμ„±μž μ£Όμž…μ€ 객체λ₯Ό 생성할 λ•Œ λ”± ν•œλ²ˆλ§Œ ν˜ΈμΆœλ˜λ―€λ‘œ 이후에 ν˜ΈμΆœλ˜λŠ” 일이 μ—†λ‹€. λ”°λΌμ„œ λΆˆλ³€ν•˜κ²Œ 섀계할 수 μžˆλ‹€.
        • final ν‚€μ›Œλ“œ
          • μƒμ„±μž μ£Όμž…μ„ μ‚¬μš©ν•˜λ©΄ ν•„λ“œμ΄ final ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. κ·Έλž˜μ„œ μƒμ„±μžμ—μ„œ ν˜Ήμ‹œλΌλ„ 값이 μ„€μ •λ˜μ§€ μ•ŠλŠ” 였λ₯˜λ₯Ό 컴파일 μ‹œμ μ— 막아쀀닀.
        • 정리
          • μƒμ„±μž μ£Όμž… 방식을 μ„ νƒν•˜λŠ” μ΄μœ λŠ” μ—¬λŸ¬κ°€μ§€κ°€ μžˆμ§€λ§Œ, ν”„λ ˆμž„μ›Œν¬μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³ , μˆœμˆ˜ν•œ μžλ°” μ–Έμ–΄μ˜ νŠΉμ§•μ„ 잘 μ‚΄λ¦¬λŠ” 방법 이기도 ν•˜λ‹€.
  • μŠ€ν”„λ§ 빈

    • 라이프사이클

      • μŠ€ν”„λ§μ˜ 빈 생λͺ…μ£ΌκΈ° 콜백 지원 3κ°€μ§€
        • μΈν„°νŽ˜μ΄μŠ€(InitializingBean, DisposableBean)
          • νŠΉμ§• : μΈν„°νŽ˜μ΄μŠ€μ— κ΅¬ν˜„λœ λ©”μ†Œλ“œ λͺ…μœΌλ‘œλ§Œ κ°€λŠ₯ [afterPropertiesSet(), destroy()]
        • μ„€μ • 정보에 μ΄ˆκΈ°ν™” λ©”μ„œλ“œ ,μ’…λ£Œ λ©”μ„œλ“œ μ§€μ •
          • νŠΉμ§• :
            • λ©”μ„œλ“œ 이름을 자유둭게 쀄 수 μžˆλ‹€.
            • μŠ€ν”„λ§ 빈이 μŠ€ν”„λ§ μ½”λ“œμ— μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ”λ‹€.
            • μ½”λ“œκ°€ μ•„λ‹ˆλΌ μ„€μ • 정보λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— μ½”λ“œλ₯Ό κ³ μΉ  수 μ—†λŠ” μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ—λ„ μ΄ˆκΈ°ν™”, μ’…λ£Œ λ©”μ„œλ“œλ₯Ό μ €μš©ν•  수 μžˆλ‹€.
        • @PostConstruct, @PreDestroy μ• λ…Έν…Œμ΄μ…˜ 지원
          • νŠΉμ§• :
            • μ΅œμ‹  μŠ€ν”„λ§μ—μ„œ κ°€μž₯ ꢌμž₯ν•˜λŠ” 방법이닀.
            • νŒ¨ν‚€μ§€λŠ” javax.annotation.PostConstruct ν•˜μœ„ 이닀. μŠ€ν”„λ§μ— 쒅속적인 기술이 μ•„λ‹ˆλΌ JSR-550μ΄λΌλŠ” μžλ°” ν‘œμ€€μ΄λ‹€.
            • λ”°λΌμ„œ μŠ€ν”„λ§μ΄ μ•„λ‹Œ λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆμ—λ„ μž‘λ™ κ°€λŠ₯ν•˜λ‹€.
            • μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”κ³Ό 잘 μ–΄μšΈλ¦°λ‹€.
            • μœ μΌν•œ 단점은 μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ—λŠ” μ μš©ν•˜μ§€ λͺ»ν•œλ‹€λŠ” 것이닀. μ™ΈλΆ€ 라이브러리λ₯Ό μ΄ˆκΈ°ν™”, μ’…λ£Œ ν•΄μ•Όν•˜λ©΄ @Bean의 κΈ°λŠ₯을 μ‚¬μš©ν•˜μž.
        • 정리 :
          • @PostConstruct, @PreDestroy μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μž!
          • μ½”λ“œλ₯Ό κ³ μΉ  수 μ—†λŠ” μ™ΈλΆ€λΌμ΄λΈŒλŸ¬λ¦¬λ₯Ό μ΄ˆκΈ°ν™”, μ’…λ£Œ ν•΄μ•Όν•˜λ©΄ @Bean의 initMethod, destroyMethodλ₯Ό μ‚¬μš©ν•˜μž
      • μŠ€ν”„λ§ λΉˆμ€ κ°„λ‹¨ν•˜κ²Œ λ‹€μŒκ³Ό 같은 라이프사이클을 κ°€μ§„λ‹€.

        • 객체 생성 -> μ˜μ‘΄κ΄€κ³„ μ£Όμž…
          • (μƒμ„±μž μ£Όμž…μ€ μ˜ˆμ™Έλ‹€. μ™œλƒν•˜λ©΄ 객체λ₯Ό λ§Œλ“€ λ•Œ 이미 μŠ€ν”„λ§ 빈이 같이 듀어와야 ν•˜κΈ° λ•Œλ¬Έμ— νŒŒλΌλ―Έν„°μ˜ μ˜ˆμ™Έμ΄λ‹€.)
        • μŠ€ν”„λ§ λΉˆμ€ 객체λ₯Ό μƒμ„±ν•˜κ³ , μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ λ‹€ λλ‚œ λ‹€μŒμ—μ•Ό ν•„μš”ν•œ 데이터λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” μ€€λΉ„κ°€ μ™„λ£Œλœλ‹€.
        • λ”°λΌμ„œ μ΄ˆκΈ°ν™” μž‘μ—…μ€ μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ λͺ¨λ‘ μ™„λ£Œλ˜κ³  λ‚œ λ‹€μŒμ— ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.
        • μŠ€ν”„λ§μ€ μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ μ™„λ£Œλ˜λ©΄ μŠ€ν”„λ§ λΉˆμ—κ²Œ μ΄ˆκΈ°ν™” 콜백 λ©”μ„œλ“œλ₯Ό ν†΅ν•΄μ„œ μ΄ˆκΈ°ν™” μ‹œμ μ„ μ•Œλ €μ£ΌλŠ” λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
          λ˜ν•œ μŠ€ν”„λ§μ€ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ˜κΈ° 직전에 μ†Œλ©Έ μ½œλ°±μ„ μ€€λ‹€. λ”°λΌμ„œ μ•ˆμ „ν•˜κ²Œ μ’…λ£Œ μž‘μ—…μ„ μ§„ν–‰ν•  수 μžˆλ‹€.
      • μŠ€ν”„λ§ 빈의 이벀트 사이클
        • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ 생성 -> μŠ€ν”„λ§ 빈 생성 -> μ˜μ‘΄κ΄€κ³„ μ£Όμž… -> μ΄ˆκΈ°ν™” 콜백 -> μ‚¬μš© -> μ†Œλ©Έμ „ 콜백 -> μŠ€ν”„λ§ μ’…λ£Œ
      • μ°Έκ³  : 객체의 생성과 μ΄ˆκΈ°ν™”λ₯Ό λΆ„λ¦¬ν•˜μž!
        • μƒμ„±μžλŠ” ν•„μˆ˜ 정보(νŒŒλΌλ―Έν„°)λ₯Ό λ°›κ³ , λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•΄μ„œ 객체λ₯Ό μƒμ„±ν•˜λŠ” μ±…μž„μ„ κ°€μ§„λ‹€.
          λ°˜λ©΄μ— μ΄ˆκΈ°ν™”λŠ” μ΄λ ‡κ²Œ μƒμ„±λœ 값듀을 ν™œμš©ν•΄μ„œ μ™ΈλΆ€ 컀λ„₯μ…˜μ„ μ—°κ²°ν•˜λŠ” λ“± 무거운 λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€.
        • λ”°λΌμ„œ μƒμ„±μž μ•ˆμ—μ„œ 무거운 μ΄ˆκΈ°ν™” μž‘μ—…μ„ ν•¨κ»˜ ν•˜λŠ” 것 λ³΄λ‹€λŠ” 객체λ₯Ό μƒμ„±ν•˜λŠ” λΆ€λΆ„κ³Ό μ΄ˆκΈ°ν™” ν•˜λŠ” 뢀뢄을 λͺ…ν™•ν•˜κ²Œ λ‚˜λˆ„λŠ” 것이 μœ μ§€λ³΄μˆ˜ κ΄€μ μ—μ„œ μ’‹λ‹€. img.png
    • 빈 μŠ€μ½”ν”„

      • μ„€λͺ… : 빈이 μ‘΄μž¬ν•  수 μžˆλŠ” λ²”μœ„λ₯Ό λœ»ν•œλ‹€.
      • μŠ€μ½”ν”„ μ’…λ₯˜ :
        • 싱글톀 : κΈ°λ³Έ μŠ€μ½”ν”„, μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ˜ μ‹œμž‘κ³Ό μ’…λ£ŒκΉŒμ§€ μœ μ§€λ˜λŠ” κ°€μž₯ 넓은 λ²”μœ„μ˜ μŠ€μ½”ν”„μ΄λ‹€.
          • 빈 μ‘°νšŒμ‹œ 항상 같은 μΈμŠ€ν„΄μŠ€μ˜ μŠ€ν”„λ§ λΉˆμ„ λ°˜ν™˜ν•œλ‹€.
        • ν”„λ‘œν† νƒ€μž… : μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” ν”„λ‘œν† μ•„μž… 빈의 생성과 μ˜μ‘΄κ΄€κ³„ μ£Όμž…κΉŒμ§€λ§Œ κ΄€μ—¬ν•˜κ³  λ”λŠ” κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ” 맀우 짧은 λ²”μœ„ μŠ€μ½”ν”„μ΄λ‹€.
          • 빈 μ‘°νšŒμ‹œ 항상 μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€μ˜ μŠ€ν”„λ§ λΉˆμ„ λ°˜ν™˜ν•œλ‹€.
          • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” ν”„λ‘œν† νƒ€μž… λΉˆμ„ μƒμ„±ν•˜κ³ , μ˜μ‘΄κ΄€κ³„ μ£Όμž…, μ΄ˆκΈ°ν™” κΉŒμ§€λ§Œ μ²˜λ¦¬ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈμ— λ°˜ν™˜ν•œλ‹€. ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ’…λ£Œλ₯Ό 원할 μ‹œ @PreDestroyλ₯Ό ν˜ΈμΆœν•΄ μ€˜μ•Ό ν•œλ‹€.
        • μ›Ή κ΄€λ ¨ μŠ€μ½”ν”„ :
          • request : μ›Ή μš”μ²­μ΄ λ“€μ–΄μ˜€κ³  λ‚˜κ°ˆ λ•Œ κΉŒμ§€ μœ μ§€λ˜λŠ” μŠ€μ½”ν”„μ΄λ‹€.
          • session : μ›Ή μ„Έμ…˜μ΄ μƒμ„±λ˜κ³  μ’…λ£Œλ  λ•Œ κΉŒμ§€ μœ μ§€λ˜λŠ” μŠ€μ½”ν”„μ΄λ‹€.
          • application : μ›Ήμ˜ μ„œλΈ”λ¦Ώ μ»¨ν…μŠ€μ™€ 같은 λ²”μœ„λ‘œ μœ μ§€λ˜λŠ” μŠ€μ½”ν”„μ΄λ‹€.
    • ********* 싱글톀 빈과 ν”„λ‘œν† νƒ€μž… λΉˆμ„ λ™μ‹œμ— μ“Έ μ‹œ 주의점 *********
      • 처음 μŠ€ν”„λ§μ΄ 싀행될 λ•Œ 싱글톀 νƒ€μž…κ³Ό ν”„λ‘œν† νƒ€μž…μ΄ 같이 IOC에 생성이 되면 ν”„λ‘œν†  νƒ€μž…μœΌλ‘œ μƒμ„±ν•œ λΉˆλ„ μ‹±κΈ€ν†€μ˜ μ—­ν™œλ‘œ 변해버린닀
        즉 μƒˆλ‘œ μƒμ„±λ˜λŠ” 빈 νƒ€μž…μ΄ μ•„λ‹ˆλΌ, μŠ€ν”„λ§ μ‹€ν–‰ 될 λ•Œ μ£Όμž…λœ 처음 μƒνƒœ κ·ΈλŒ€λ‘œ μœ μ§€λœλ‹€.
      • ν•΄κ²° 방법 :
          1. ObjectProvider (Spring 지원)
          • ObjectProviderλž€ :
            • μ‚¬μš©μžκ°€ Bean을 μ°ΎλŠ” 방식을 DL(Dependnecy Lookup) 이라고 ν•˜λŠ”λ° νŽΈν•˜κ²Œ λ„μ™€μ£ΌλŠ” μΈν„°νŽ˜μ΄μŠ€ 이닀.
          • 예) ObjectProvider
            • getObject() μ‚¬μš©
          1. Provider (JSR330 지원)
          • 예) Provider
            • get() μ‚¬μš©
          • Spring boot 3.0 μ΄ν•˜ : 'javax.inject.javax.inject:1'
          • Spring boot 3.0 이후 : 'jakarta.inject:jakarta.inject-api:2.0.1'
          1. @Lookup (Spring 지원)
    • μ›Ή μŠ€μ½”ν”„
      • νŠΉμ§• :
        • μ›Ή μŠ€μ½”ν”„λŠ” μ›Ή ν™˜κ²½μ—μ„œλ§Œ λ™μž‘ν•œλ‹€.
        • μ›Ή μŠ€μ½”ν”„λŠ” ν”„λ‘œν† νƒ€μž…κ³Ό λ‹€λ₯΄κ²Œ μŠ€ν”„λ§μ΄ ν•΄λ‹Ή μŠ€μ½”ν”„μ˜ μ’…λ£Œμ‹œμ κΉŒμ§€ κ΄€λ¦¬ν•œλ‹€. λ”°λΌμ„œ μ’…λ£Œ λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλœλ‹€.
      • μ’…λ₯˜ :
        • request : HTTP μš”μ²­ ν•˜λ‚˜κ°€ λ“€μ–΄μ˜€κ³  λ‚˜κ°ˆ λ•Œ κΉŒμ§€ μœ μ§€λ˜λŠ” μŠ€μ½”ν”„, 각각의 HTTP μš”μ²­λ§ˆλ‹€ λ³„λ„λ‘œ 빈 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜κ³  κ΄€λ¦¬λœλ‹€.
          • request μ‚¬μš©μ‹œ 클래슀λͺ… κ·ΈλŒ€λ‘œ DIλ₯Ό μ‹€ν–‰ν•˜λ©΄ requestκ°€ λ“€μ–΄μ˜€μ§€λ„ μ•ˆμ•˜λŠ”λ° DIλ₯Ό μš”μ²­ν•΄μ„œ μ—λŸ¬κ°€ λ‚œλ‹€.
            • ν•΄κ²° 방법
                1. ObjectProvier<클래슀 λͺ…>을 μ‚¬μš©ν•˜μž
                • ObjectProviderλ₯Ό μ‚¬μš©ν•˜λ©΄ getObject() μ‹€ν–‰ μ „κΉŒμ§„ request둜된 scopeκ°€ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.
                1. proxy λͺ¨λ“œλ₯Ό μ‚¬μš©ν•˜μž
                • 예) @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
                • proxy λͺ¨λ“œλ₯Ό μ‚¬μš©ν•˜κ²Œ 되면 μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ‹œ μ‹€μ œ scope둜 된 빈이 μ£Όμž…λ˜λŠ”κ²Œ μ•„λ‹Œ μŠ€ν”„λ§ CGLIBμ—μ„œ μƒμ„±ν•œ
                  κ°€μ§œ ν”„λ‘μ‹œ 객체가 μƒμ„±λ˜κ²Œ λœλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ DIμ‹œμ— μ—λŸ¬κ°€ λ‚˜μ§€ μ•ŠμœΌλ©°
                  μ˜μ‘΄κ΄€κ³„ μ£Όμž…ν•  떄도 ν”„λ‘μ‹œ 객체둜 μƒμ„±ν•œ CGLIB 객체λ₯Ό μ£Όμž… ν•œλ‹€.
                • μ‹€μ œ request μš”μ²­μ΄ 왔응 λ•Œ scope둜 λ“±λ‘λœ μ§„μ§œ Bean을 μ‘°νšŒν•œλ‹€.
        • session : HTTP Sessionκ³Ό λ™μΌν•œ 생λͺ…μ£ΌκΈ°λ₯Ό κ°€μ§€λŠ” μŠ€μ½”ν”„
        • application : μ„œλΈ”λ¦Ώ μ»¨ν…μŠ€νŠΈμ™€ λ™μΌν•œ 생λͺ…μ£ΌκΈ°λ₯Ό κ°€μ§€λŠ” μŠ€μ½”ν”„
        • websocket : μ›Ή μ†ŒμΌ“κ³Ό λ™μΌν•œ 생λͺ…μ£ΌκΈ°λ₯Ό κ°€μ§€λŠ” μŠ€μ½”ν”„
  • μ• λ…Έν…Œμ΄μ…˜

    • μ• λ…Έν…Œμ΄μ…˜μ—λŠ” μƒμ†μ΄λΌλŠ” κ°œλ…μ΄ μ—†λ‹€. μ΄λ ‡κ²Œ μ—¬λŸ¬ μ• λ…Έν…Œμ΄μ…˜μ„ λͺ¨μ•„μ„œ μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯은 μŠ€ν”„λ§μ΄ 지원해 μ£ΌλŠ” κΈ°λŠ₯이닀.
    • κ·ΈλŸ¬λ‚˜ μŠ€ν”„λ§μ΄ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯을 λšœλ ·ν•œ λͺ©μ  없이 λ¬΄λΆ„λ³„ν•˜κ²Œ μž¬μ •μ˜ ν•˜λŠ” 것은 μœ μ§€λ³΄μˆ˜μ— 더 ν˜Όλž€λ§Œ 가쀑할 수 μžˆλ‹€.
  • μŠ€ν”„λ§ CGLIB

    • @Configuration을 뢙일 λ•Œ
      • μŠ€ν”„λ§ CGLIBλ₯Ό μ΄μš©ν•œ μŠ€ν”„λ§ Bean이 μƒμ„±λœλ‹€.
    • @Configuration을 뢙이지 μ•Šμ„ λ•Œ
      • 싱글톀 νŒ¨ν„΄μ΄ κΉ¨μ§€λ©΄μ„œ 순수 μžλ°” new 객체λ₯Ό μƒμ„±ν•œ 것과 κ°™λ‹€.
  • λ””μžμΈ νŒ¨ν„΄

    • 싱글톀 νŒ¨ν„΄

      • κ°œμš”
        • 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ λ”± 1개만 μƒμ„±λ˜λŠ” 것을 보μž₯ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€.
        • κ·Έλž˜μ„œ 객체 μΈμŠ€ν„΄μŠ€λ₯Ό 2개 이상 μƒμ„±ν•˜μ§€ λͺ»ν•˜λ„둝 막아야 ν•œλ‹€.
          • private μƒμ„±μžλ₯Ό μ‚¬μš©ν•΄μ„œ μ™ΈλΆ€μ—μ„œ μž„μ˜λ‘œ new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ λͺ»ν•˜λ„둝 막야아 ν•œλ‹€.
      • 주의점
        • 객체 μΈμŠ€ν„΄μŠ€λ₯Ό ν•˜λ‚˜λ§Œ μƒμ„±ν•΄μ„œ κ³΅μœ ν•˜λŠ” 싱글톀 방식은 μ—¬λŸ¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•˜λ‚˜μ˜ 같은 객체 μΈμŠ€ν„΄μŠ€λ₯Ό κ³΅μœ ν•˜κΈ°λ•Œλ¬Έμ—
          싱글톀 κ°μ²΄λŠ” μƒνƒœλ₯Ό μœ μ§€(stateful)ν•˜κ²Œ μ„€κ³„ν•˜λ©΄ μ•ˆλœλ‹€.
        • λ¬΄μƒνƒœ(stateless)둜 μ„€κ³„ν•΄μ•Όν•œλ‹€.
          • νŠΉμ • ν΄λΌμ΄μ–ΈνŠΈμ— 의쑴적인 ν•„λ“œκ°€ 있으면 μ•ˆλœλ‹€.
          • νŠΉμ • ν΄λΌμ΄μ–ΈνŠΈκ°€ 값을 λ³€κ²½ν•  수 μžˆλŠ” ν•„λ“œκ°€ 있으면 μ•ˆλœλ‹€.
          • 가급적 읽기만 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.
          • ν•„λ“œ λŒ€μ‹ μ— μžλ°”μ—μ„œ κ³΅μœ λ˜μ§€ μ•ŠλŠ”, μ§€μ—­λ³€μˆ˜, νŒŒλΌλ―Έν„°, ThreadLocal 등을 μ‚¬μš©ν•΄μ•Όν•œλ‹€.
          • μŠ€ν”„λ§ 빈의 ν•„λ“œμ— κ³΅μœ κ°’μ„ μ„€μ •ν•˜λ©΄ 정말 큰 μž₯μ• κ°€ λ°œμƒν•  수 μžˆλ‹€.
      • μž₯단점
        • μž₯점 :
        • 단점 :
          • 싱글톀 νŒ¨ν„΄μ„ κ΅¬ν˜„ν•˜λŠ” μ½”λ“œ μžμ²΄κ°€ 많이 λ“€μ–΄κ°„λ‹€.
          • μ˜μ‘΄κ΄€κ³„μƒ ν΄λΌμ΄μ–ΈνŠΈκ°€ κ΅¬μ²΄ν™”λœ ν΄λž˜μŠ€μ— μ˜μ‘΄ν•œλ‹€. -> DIPλ₯Ό μœ„λ°˜ν•œλ‹€.
          • ν΄λΌμ΄μ–ΈνŠΈκ°€ κ΅¬μ²΄ν™”λœ ν΄λž˜μŠ€μ— μ˜μ‘΄ν•΄μ„œ OCP 원칙을 μœ„λ°˜ν•  κ°€λŠ₯성이 λ†’λ‹€.
          • ν…ŒμŠ€νŠΈν•˜κΈ° μ–΄λ ΅λ‹€.
          • λ‚΄λΆ€ 속성을 λ³€κ²½ν•˜κ±°λ‚˜ μ΄ˆκΈ°ν™” ν•˜κΈ° μ–΄λ ΅λ‹€.
          • private μƒμ„±μžλ‘œ μžμ‹ 클래슀λ₯Ό λ§Œλ“€κΈ° μ–΄λ ΅λ‹€.
          • 결둠적으둜 μœ μ—°μ„±μ΄ λ–¨μ–΄μ§„λ‹€.
          • μ•ˆν‹°νŒ¨ν„΄μœΌλ‘œ λΆˆλ¦¬κΈ°λ„ ν•œλ‹€.
  • 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°

    • 컴퓨터 ν”„λ‘œκ·Έλž¨μ„ λͺ…λ Ήμ–΄μ˜ λͺ©λ‘μœΌλ‘œ λ³΄λŠ” μ‹œκ°μ—μ„œ 벗어사 μ—¬λŸ¬κ°œμ˜ λ…λ¦½λœ λ‹¨μœ„, 즉 κ°μ²΄λ“€μ˜ λͺ¨μž„μœΌλ‘œ νŒŒμ•…ν•˜κ³ μž ν•˜λŠ” 것이닀. 각각의 κ°μ²΄λŠ” λ©”μ‹œμ§€λ₯Ό μ£Όκ³ λ°›κ³ , 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€.
    • ν”„λ‘œκ·Έλž¨μ„ μœ μ—°ν•˜κ³  변경이 μš©μ΄ν•˜κ²Œ λ§Œλ“€κΈ° λ•Œλ¬Έμ— λŒ€κ·œλͺ¨ μŠ€ν”„λ§ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ— 많이 μ‚¬μš©λœλ‹€.
    • μ—­ν™œκ³Ό κ΅¬ν˜„μ„ 뢄리

      • μ—­ν™œκ³Ό κ΅¬ν˜„μœΌλ‘œ κ΅¬λΆ„ν•˜λ©΄ 세상이 λ‹¨μˆœν•΄μ§€κ³ , μœ μ—°ν•΄μ§€λ©° 변경도 νŽΈλ¦¬ν•΄λ”˜λ‹€
      • μž₯점
        • ν΄λΌμ΄μ–ΈνŠΈλŠ” λŒ€μƒμ˜ μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)만 μ•Œλ©΄ λœλ‹€.
        • ν΄λ¦¬μ΄μ–ΈνŠΈλŠ” κ΅¬ν˜„ λŒ€μƒμ˜ λ‚΄λΆ€ ꡬ쑰λ₯Ό λͺ°λΌλ„ λœλ‹€.
        • ν΄λΌμ΄μ–ΈνŠΈλŠ” κ΅¬ν˜„ λŒ€μƒμ˜ λ‚΄λΆ€ ꡬ쑰가 λ³€κ²½λ˜μ–΄λ„ 영ν–₯을 λ°›μ§€ μ•ŠλŠ”λ‹€.
          • ν΄λΌμ΄μ–ΈνŠΈλŠ” κ΅¬ν˜„ λŒ€μƒ 자체λ₯Ό 변경해도 영ν–₯을 λ°›μ§€ μ•ŠλŠ”λ‹€.
      • μžλ°” μ–Έμ–΄μ˜ λ‹€ν˜•μ„±μ„ ν™œμš©
        • μ—­ν•  : μΈν„°νŽ˜μ΄μŠ€

        • κ΅¬ν˜„ : μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀 κ΅¬ν˜„ 객체

      • 객체λ₯Ό 섀계할 λ•Œ μ—­ν• κ³Ό κ΅¬ν˜„μ„ λͺ…ν™•νžˆ 뢄리
      • 객체 μ„€κ³„μ‹œ μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)을 λ¨Όμ € λΆ€μ—¬ν•˜κ³ , κ·Έ 역할을 μˆ˜ν–‰ν•˜λŠ” κ΅¬ν˜„ 객체 λ§Œλ“€κΈ°
    • λ‹€ν˜•μ„±μ˜ 본질

      • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 객체 μΈμŠ€ν„΄μŠ€λ₯Ό μ‹€ν–‰ μ‹œμ μ— μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ‹€.
      • λ‹€ν˜•μ„±μ˜ λ³Έμ§ˆμ„ μ΄ν•΄ν•˜λ €λ©΄ ν˜‘λ ₯μ΄λΌλŠ” κ°μ²΄μ‚¬μ΄μ˜ κ΄€κ³„μ—μ„œ μ‹œμž‘ν•΄μ•Όν•¨
      • ν΄λΌμ΄μ–ΈνŠΈλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ , μ„œλ²„μ˜ ν˜„ κΈ°λŠ₯을 μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ‹€.
  • SOLID 5원칙

    • SRP 단일 μ±…μž„μ˜ 원칙

      • ν΄λΌμ΄μ–ΈνŠΈ κ°μ²΄λŠ” 직접 κ΅¬ν˜„ 객체λ₯Ό μƒμ„±ν•˜κ³ , μ—°κ²°ν•˜κ³ , μ‹€ν–‰ν•˜λŠ” λ‹€μ–‘ν•œ μ±…μž„μ„ κ°€μ§€κ³  있음
      • SRP λ‹¨μ΅μ±…μž„ 원칙을 λ”°λ₯΄λ©΄μ„œ 관심사λ₯Ό 뢄리함
      • κ΅¬ν˜„ 객체λ₯Ό μƒμ„±ν•˜κ³  μ—°κ²°ν•˜λŠ” μ±…μž„μ€ AppConfigκ°€ λ‹΄λ‹Ή
      • ν΄λΌμ΄μ–ΈνŠΈ κ°μ²΄λŠ” μ‹€ν–‰ν•˜λŠ” μ±…μž„λ§Œ λ‹΄λ‹Ή
    • DIP μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙

      • 좔상화에 의쑴 ν•˜λ˜ ꡬ체화에 μ˜μ‘°ν•˜λ©΄ μ•ˆλœλ‹€.
    • OCP

      • μ†Œν”„νŠΈμ›¨μ–΄ μš”μ†ŒλŠ” ν™•μž₯μ—λŠ” μ—΄λ €μžˆμœΌλ‚˜ λ³€κ²½μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€.
      • λ‹€ν˜•μ„± μ‚¬μš©ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈκ°€ DIPλ₯Ό μ§€ν‚΄
      • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‚¬μš© μ˜μ—­κ³Ό ꡬ성 μ˜μ—­μœΌλ‘œ λ‚˜λˆ”
  • AppConfig의 λ“±μž₯

    • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 전체 λ™μž‘ 방식을 ꡬ성(config) ν•˜κΈ° μœ„ν•΄, κ΅¬ν˜„ 객체λ₯Ό μƒμ„±ν•˜κ³ , μ—°κ²°ν•˜λŠ” μ±…μž„μ„ κ°€λ‹ˆλŠ” λ³„λ„μ˜ μ„€μ • 클래슀
    • 객체의 생성과 연결은 AppConfigκ°€ λ‹΄λ‹Ήν•œλ‹€.
  • κΉ€μ˜ν•œλ‹˜μ˜

    • μŠ€ν”„λ§ μž…λ¬Έ - μ½”λ“œλ‘œ λ°°μš°λŠ” μŠ€ν”„λ§ λΆ€νŠΈ, μ›Ή MVC, DB μ ‘κ·Ό 기술

    • μŠ€ν”„λ§ 핡심 원리 - 기본편

    • 을 μˆ˜κ°•ν•˜λ©΄μ„œ μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages