λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

개발

ν΄λ‘œλ“œ AIλ₯Ό ν†΅ν•œ μŠ€ν”„λ§ ν•™μŠ΅

졜근 Claude AI Proλ₯Ό κ΅¬λ§€ν•˜λ©΄μ„œ AI에 λŒ€ν•œ κ΄€μ‹¬μ΄ λ”μš± λ§Žμ•„μ‘Œλ‹€. κΈ°μ‘΄μ—λŠ” AIλ₯Ό κ·Έλ‹₯ μ„ ν˜Έν•˜μ§„ μ•Šμ•˜μ§€λ§Œ, μ„Έμƒμ΄ λŒμ•„κ°€λŠ” λͺ¨μŠ΅μ„ λ³΄λ©΄ AIλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ„ μˆ˜ μ—†λ‹€. κ·Έλž˜μ„œ μ΄λ²ˆ κΈ°νšŒμ— λ©΄μ ‘ μ€€λΉ„κ²Έ ν•™μŠ΅μœΌλ‘œ Claude AIλ₯Ό μ κ·Ήμ μœΌλ‘œ ν™œμš©ν•΄λ³΄κΈ°λ‘œ ν–ˆλ‹€.

κ°€μž₯ λ¨Όμ € ν•΄λ³Έ κ²ƒμ€ μŠ€ν”„λ§μ— λŒ€ν•œ κΈ°λ³Έ μ§€μ‹ ν•™μŠ΅μ΄ μž˜λ˜μ–΄μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” κ²ƒ!

κ°„λ‹¨ν•˜κ²Œ ν”„λ‘¬ν”„νŠΈλŠ” "μŠ€ν”„λ§μ— λŒ€ν•œ 기초적인 지식을 ν•™μŠ΅ν–ˆλŠ”λ°, 이λ₯Ό ν…ŒμŠ€νŠΈν•˜κ³  μ‹Άμ–΄. λ„ˆκ°€ ν•œ λ¬Έμ œμ”© λ‚΄λ©΄ λ‚΄κ°€ κ·Έκ±Έ λ‹΅ν•˜λŠ” μ‹μœΌλ‘œ μ§„ν–‰ν•΄λ³΄μž"둜 μ‹œμž‘ν–ˆλ‹€.


첫 번째 문제:
μŠ€ν”„λ§μ˜ ν•΅μ‹¬ κ°œλ… μ€‘ ν•˜λ‚˜μΈ IoC(Inversion of Control)와 DI(Dependency Injection)의 κ°œλ…μ— λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”. κ·Έλ¦¬κ³  μŠ€ν”„λ§μ—μ„œ μ˜μ‘΄μ„± μ£Όμž…을 ν•˜λŠ” λ°©λ²•μ—λŠ” μ–΄λ–€ κ²ƒλ“€μ΄ μžˆλ‚˜μš”?

IoCλŠ” μ œμ–΄μ˜ μ—­μ „μ΄λΌλŠ” λœ»μœΌλ‘œ κ°μ²΄μ˜ μƒμ„±κ³Ό μƒλͺ… μ£ΌκΈ°μ˜ κ΄€λ¦¬λ₯Ό κ°œλ°œμžκ°€ μ•„λ‹Œ μ™ΈλΆ€μ—μ„œ λ‹΄λ‹Ήν•˜λŠ” κ°œλ…μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ νŠΉμ§•μ„ κ°€μ§„ μŠ€ν”„λ§μ€ IoC μ»¨ν…Œμ΄λ„ˆλ₯Ό ν†΅ν•΄ κ°μ²΄λ₯Ό μŠ€ν”„λ§ λΉˆμœΌλ‘œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

DIλŠ” μ˜μ‘΄μ„± μ£Όμž…μœΌλ‘œ κ°μ²΄κ°€ μƒμ„±λ  λ•Œ ν•„μš”ν•œ μ˜μ‘΄μ„±λ“€μ„ κ°μ²΄ λ‚΄λΆ€μ—μ„œ μƒμ„±ν•˜μ§€ μ•Šκ³ , μ™ΈλΆ€μ—μ„œ μ£Όμž…λ°›μ•„ κ°μ²΄λ₯Ό μƒμ„±ν•˜λŠ” κ°œλ…μž…λ‹ˆλ‹€. μŠ€ν”„λ§μ—μ„œ μ΄ κ°œλ…μ€ IoC μ»¨ν…Œμ΄λ„ˆλ₯Ό ν†΅ν•΄ μ˜μ‘΄μ„±μ— ν•΄λ‹Ήν•˜λŠ” λΉˆμ„ μ°Ύμ•„ μ£Όμž…ν•΄μ£ΌλŠ” ν˜•νƒœλ‘œ λ™μž‘ν•©λ‹ˆλ‹€.

μ˜μ‘΄μ„±μ„ μ£Όμž…ν•˜λŠ” λ°©λ²•μ—λŠ” 
1. `@Autowired` μ–΄λ…Έν…Œμ΄μ…˜μ„ ν•„λ“œμ— μ μš©ν•˜μ—¬ μ£Όμž…ν•˜λŠ” λ°©λ²• (ν•„λ“œ μ£Όμž…)
2. μƒμ„±μžλ₯Ό ν†΅ν•΄ μ£Όμž…ν•˜λŠ” λ°©λ²• (μƒμ„±μž μ£Όμž…)
3. `@Autowired` μ–΄λ…Έν…Œμ΄μ…˜μ„ Setter에 μ μš©ν•˜μ—¬ μ£Όμž…ν•˜λŠ” λ°©λ²• (Setter μ£Όμž…)

μ΄λ ‡κ²Œ μ„Έ κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.


두 번째 문제:
μŠ€ν”„λ§ λΉˆμ˜ μƒλͺ…μ£ΌκΈ°(Lifecycle)에 λŒ€ν•΄ μ„€λͺ…ν•΄μ£Όμ„Έμš”. λΉˆμ΄ μƒμ„±λ˜κ³  μ†Œλ©Έλ  λ•ŒκΉŒμ§€ μ–΄λ–€ κ³Όμ •을 κ±°μΉ˜λ‚˜μš”? κ·Έλ¦¬κ³  κ°œλ°œμžκ°€ λΉˆμ˜ μƒλͺ…주기에 κ°œμž…ν•  μˆ˜ μžˆλŠ” λ°©λ²•μ—λŠ” λ¬΄μ—‡μ΄ μžˆμ„κΉŒμš”?

μŠ€ν”„λ§ λΉˆμ˜ μƒλͺ…μ£ΌκΈ°λŠ” 5λ‹¨κ³„λ‘œ μ΄λ€„μ§‘λ‹ˆλ‹€. κ° λ‹¨κ³„λŠ” `μŠ€ν”„λ§ λΉˆ μƒμ„±` -> `μ˜μ‘΄μ„± μ£Όμž…` -> `μ΄ˆκΈ°ν™” μ½œλ°±` -> `빈 μ‚¬μš©` -> `μ†Œλ©Έ μ „ μ½œλ°±` μž…λ‹ˆλ‹€.

μŠ€ν”„λ§ λΉˆ μƒμ„±μ€ μŠ€ν”„λ§ IoC μ»¨ν…Œμ΄λ„ˆμ—μ„œ μƒμ„±λ˜μ–΄μ•Ό ν•  κ°μ²΄λ“€μ΄ μŠ€ν”„λ§ λΉˆμœΌλ‘œ μƒμ„±λ˜λŠ” κ³Όμ •이며, μ˜μ‘΄μ„± μ£Όμž…은 μ΄λŸ¬ν•œ λΉˆ μƒμ„± κ³Όμ •μ—μ„œ ν•„μš”ν•œ μ˜μ‘΄μ„±λ“€μ΄ μ£Όμž…λ˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€. κ·Έλ¦¬κ³  μ΄ˆκΈ°ν™” μ½œλ°±μ€ μŠ€ν”„λ§ λΉˆμ΄ μƒμ„±λœ ν›„ μ΄ˆκΈ°ν™” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€. μ΄λ•Œ, μ΄ˆκΈ°ν™” λ©”μ„œλ“œλŠ” `@PostConstruct`λ‚˜ `InitializingBean` μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„, `@Bean(initMethod="init", destroyMethod="close")` μ–΄λ…Έν…Œμ΄μ…˜ ν™œμš©μ„ ν†΅ν•΄ μƒμ„±ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
이 ν›„, λΉˆμ΄ μ‚¬μš©λ˜κ³  μ„œλ²„κ°€ μ’…λ£Œλ˜κ±°λ‚˜ λ” μ΄μƒ λΉˆμ„ μ‚¬μš©ν•˜μ§€ μ•Šμ„ λ•Œ λΉˆμ„ μ œκ±°ν•˜κΈ° μ „에 μ†Œλ©Έ μ „ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³  λΉˆμ΄ μ΅œμ’…μ μœΌλ‘œ μ†Œλ©Έλ©λ‹ˆλ‹€.
μ†Œλ©Έ μ „ λ©”μ„œλ“œ λ˜ν•œ, `@PreDestroy`, `DisposableBean`, `@Bean(initMethod="init", destroyMethod="close")`λ₯Ό 톡해 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.


μ„Έ 번째 문제:
μŠ€ν”„λ§μ—μ„œ `@Component`, `@Service`, `@Repository`, `@Controller` μ–΄λ…Έν…Œμ΄μ…˜μ˜ μ°¨μ΄μ μ€ λ¬΄μ—‡μΈκ°€μš”? κ·Έλ¦¬κ³  μ΄λ“€μ„ μ™œ κ΅¬λΆ„ν•΄μ„œ μ‚¬μš©ν• κΉŒμš”?

각 μ–΄λ…Έν…Œμ΄μ…˜μ€ κΈ°λŠ₯적으둜 λΉ„μŠ·ν•©λ‹ˆλ‹€. λ‚΄λΆ€μ μœΌλ‘œ `@Component`λ₯Ό κ°–κ³  μžˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ‹€λ§Œ, μ—­ν• μ„ κ΅¬λΆ„ν•œλ‹€λŠ” μ μ—μ„œ μ°¨μ΄κ°€ μžˆμŠ΅λ‹ˆλ‹€.
- `@Repository`λŠ” μ˜μ†μ„± κ³„μΈ΅μ—μ„œ ν™œμš©ν•˜λ©°, λ°μ΄ν„° μ ‘κ·Ό μ˜ˆμ™Έλ₯Ό μŠ€ν”„λ§μ˜ `DataAccessException`으둜 μžλ™ λ³€ν™˜ ν•΄μ€λ‹ˆλ‹€.
- `@Controller`λŠ” μ™ΈλΆ€μ˜ μš”μ²­ λ° μ‘닡을 μ²˜λ¦¬ν•˜λŠ” ν”„λ ˆμ  ν…Œμ΄μ…˜ κ³„μΈ΅μ—μ„œ ν™œμš©ν•©λ‹ˆλ‹€.
- `@Service`λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ³„μΈ΅μ—μ„œ ν™œμš©ν•©λ‹ˆλ‹€.
- `@Component`λŠ” μœ„μ˜ κ³„μΈ΅μœΌλ‘œ λΆ„λ₯˜ν•˜κΈ° μ–΄λ €μš΄ μΌλ°˜μ μΈ κ°μ²΄λ“€μ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μ•Œ 수 μžˆλ“― κ°€μž₯ 큰 차이점은 의미둠적인 μ—­ν•  κ΅¬λΆ„μž…λ‹ˆλ‹€.


λ„€ 번째 문제:
`@Autowired`λ₯Ό μ‚¬μš©ν•  λ•Œ κ°™μ€ νƒ€μž…μ˜ λΉˆμ΄ μ—¬λŸ¬ κ°œ μžˆμœΌλ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”? κ·Έλ¦¬κ³  μ΄ λ¬Έμ œλ₯Ό ν•΄κ²°ν•˜λŠ” λ°©λ²•μ—λŠ” λ¬΄μ—‡μ΄ μžˆλ‚˜μš”?

같은 νƒ€μž…μ˜ λΉˆμ΄ μ—¬λŸ¬ κ°œ μžˆμœΌλ©΄ μŠ€ν”„λ§μ€ μ–΄λ–€ λΉˆμ„ μ£Όμž…ν•΄μ•Ό ν• μ§€ λͺ°λΌ `NoUniqueBeanDefinitionException` μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€. μ΄λŸ° κ²½μš° `@Primary` ν˜Ήμ€ `@Qualifier("λΉˆμ΄λ¦„")` μ–΄λ…Έν…Œμ΄μ…˜, ν•„λ“œλͺ… ν˜Ήμ€ νŒŒλΌλ―Έν„°λͺ…을 λΉˆ μ΄λ¦„κ³Ό λ˜‘같이 μ§€μ •ν•˜κΈ°, List ν˜Ήμ€ Map을 ν†΅ν•΄ λͺ¨λ“  λΉˆμ„ λ°›λŠ” λ°©λ²•μœΌλ‘œ ν•΄κ²°μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.
`@Primary` μ–΄λ…Έν…Œμ΄μ…˜μ€ ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ΄ λΆ™μ€ κ°μ²΄λ₯Ό μš°μ„ μ μœΌλ‘œ μ‚¬μš©ν•˜κ² λ‹€κ³  μ§€μ •ν•˜λŠ” κ²ƒμ΄κ³ , `@Qualifier` μ–΄λ…Έν…Œμ΄μ…˜μ€ νŠΉμ • λΉˆμ„ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜μ—¬ μ£Όμž…을 λ°›κ² λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.
ν•„λ“œλͺ…, νŒŒλΌλ―Έν„°λͺ…을 λΉˆ μ΄λ¦„μœΌλ‘œ μ§€μ •ν•˜λ©΄ ν•΄λ‹Ή μ΄λ¦„κ³Ό λ˜‘같은 λΉˆμ„ μ°Ύμ•„μ„œ μ£Όμž…ν•΄μ£Όκ³ , μ£Όμž…λ°›κ³ μž ν•˜λŠ” ν•„λ“œλ₯Ό List λ˜λŠ” Map으둜 μ„ μ–Έ μ‹œ ν•΄λ‹Ή νƒ€μž…κ³Ό κ°™μ€ λΉˆλ“€μ„ λͺ¨λ‘ μ£Όμž…ν•΄μ€λ‹ˆλ‹€.


λ‹€μ„― 번째 문제:
μŠ€ν”„λ§μ—μ„œ νŠΈλžœμž­μ…˜(@Transactional)은 μ–΄λ–»κ²Œ λ™μž‘ν•˜λ‚˜μš”? κ·Έλ¦¬κ³  @Transactional을 μ‚¬μš©ν•  λ•Œ μ£Όμ˜ν•΄μ•Ό ν•  μ μ€ λ¬΄μ—‡μΈκ°€μš”?

μŠ€ν”„λ§μ—μ„œ `@Transactinal` μ–΄λ…Έν…Œμ΄μ…˜μ€ μŠ€ν”„λ§ AOP둜 λ™μž‘ν•©λ‹ˆλ‹€. μŠ€ν”„λ§μ΄ `@Transactinal` λΆ™μ–΄μžˆλŠ” λ©”μ„œλ“œ λ° ν΄λž˜μŠ€κ°€ μžˆμœΌλ©΄ μ΄λ₯Ό ν”„λ‘μ‹œ κ°μ²΄λ‘œ λ§Œλ“€λ©΄μ„œ νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•˜λŠ” μ½”λ“œλ“€μ„ μ–΄λ…Έν…Œμ΄μ…˜μ΄ λΆ™μ€ λ©”μ„œλ“œμ— μΆ”κ°€ν•©λ‹ˆλ‹€. μ΄λ•Œ, μ£Όμ˜ν•  μ μ€ private λ©”μ„œλ“œμ—λŠ” μ μš©μ΄ μ•ˆλ˜λŠ” μ κ³Ό νŠΈλžœμž­μ…˜μ΄ μ—†λŠ” μ™ΈλΆ€ λ©”μ„œλ“œμ—μ„œ λ‚΄λΆ€ λ©”μ„œλ“œ ν˜ΈμΆœ μ‹œ νŠΈλžœμž­μ…˜μ΄ μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ μž…λ‹ˆλ‹€. λ˜ν•œ, μ²΄ν¬ μ˜ˆμ™ΈλŠ” κΈ°λ³Έμ μœΌλ‘œ λ‘€λ°± λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ μ΄ μžˆμŠ΅λ‹ˆλ‹€.


μ—¬μ„― 번째 문제:
μŠ€ν”„λ§μ—μ„œ ν•„ν„°(Filter)와 μΈν„°μ…‰ν„°(Interceptor)의 μ°¨μ΄μ μ€ λ¬΄μ—‡μΈκ°€μš”? κ°κ° μ–΄λ–€ μƒν™©μ—μ„œ μ‚¬μš©ν•˜λ‚˜μš”?

필터와 μΈν„°μ…‰ν„°μ˜ κ°€μž₯ ν° μ°¨μ΄μ μ€ μ–΄λА μ§€μ μ—μ„œ μˆ˜ν–‰λ˜λŠλƒ?의 μ°¨μ΄κ°€ μžˆμŠ΅λ‹ˆλ‹€.
ν•„ν„°μ˜ κ²½μš°μ—λŠ” Spring DispatchServlet μ•ž λ‹¨μΈ ν†°μΊ£ μΈ‘μ—μ„œ μˆ˜ν–‰λ˜λ©°, μΈν„°μ…‰ν„°λŠ” Spring DispatchServlet λ’· λ‹¨μΈ μŠ€ν”„λ§ ν™˜κ²½ λ‚΄μ—μ„œ μˆ˜ν–‰λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ°¨μ΄λ‘œ μΈν„°μ…‰ν„°λŠ” μŠ€ν”„λ§ λΉˆ μ£Όμž…이 κ°€λŠ₯ν•˜λ‚˜, ν•„ν„°λŠ” μ„€μ •이 ν•„μš”ν•©λ‹ˆλ‹€.
μ΄λŸ¬ν•œ μ°¨μ΄λ‘œ μΈν•΄ ν•„ν„°μ˜ κ²½μš°μ—λŠ” μŠ€ν”„λ§ μ‹œνλ¦¬ν‹°μ™€ κ°™μ€ λΌμ΄λΈŒλŸ¬λ¦¬μ˜ μΈμ¦/인가, XSS λ°©μ–΄λ‚˜ μš”μ²­/응닡 λ‘œκΉ… λ“±μ— ν™œμš©λ©λ‹ˆλ‹€. μΈν„°μ…‰ν„°λŠ” μ„ΈλΆ€μ μΈ κΆŒν•œ μ²΄ν¬, λ‘œκ·ΈμΈ μ²΄ν¬μ™€ κ°™μ€ κ²ƒλ“€μ— ν™œμš©λ©λ‹ˆλ‹€.


일곱 번째 문제:
λ§ˆμ§€λ§‰ λ¬Έμ œμž…λ‹ˆλ‹€! `@Configuration`κ³Ό `@Bean`의 μ—­ν• μ€ λ¬΄μ—‡μ΄κ³ , μ™œ μ‚¬μš©ν•˜λ‚˜μš”?

`@Configuration`κ³Ό `@Bean` μ€ μŠ€ν”„λ§ Bean을 λ“±λ‘ν•˜κΈ° μœ„ν•œ λ°©λ²•μž…λ‹ˆλ‹€. 
Configuration μ–΄λ…Έν…Œμ΄μ…˜μ„ ν†΅ν•΄μ„œ μ‚¬μš©μžκ°€ μ§μ ‘ μŠ€ν”„λ§ λΉˆμ„ λ“±λ‘ν•˜λŠ” ν΄λž˜μŠ€λ₯Ό μ •μ˜ν•  μˆ˜ μžˆλŠ”λ°μš”. λ‚΄λΆ€μ μœΌλ‘œ Bean μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•΄μ„œ μƒˆλ‘œμš΄ μŠ€ν”„λ§ λΉˆμ„ λ“±λ‘ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν”„λ§μ—μ„œλŠ” Configuration μ–΄λ…Έν…Œμ΄μ…˜μ΄ λΆ™μ€ ν•΄λ‹Ή ν΄λž˜μŠ€λ₯Ό ν”„λ‘μ‹œ κ°μ²΄λ‘œ λ§Œλ“€μ–΄ Bean μ–΄λ…Έν…Œμ΄μ…˜ λ©”μ„œλ“œ κ°„ ν˜ΈμΆœ μ‹œ μ‹±κΈ€ν†€μ„ λ³΄μž₯ν•΄μ€λ‹ˆλ‹€.

이λ₯Ό μ‚¬μš©ν•˜λŠ” κ°€μž₯ ν° μ΄μœ λŠ” μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ˜ κ²½μš° μŠ€ν”„λ§ λΉˆμœΌλ‘œ μžλ™ λ“±λ‘λ˜μ§€ μ•ŠλŠ” κ²½μš°κ°€ μžˆκΈ° λ•Œλ¬Έμ— μ΄λ₯Ό ν†΅ν•΄ μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ˜ κ°μ²΄λ₯Ό λΉˆμœΌλ‘œ λ“±λ‘ν•˜κ³ μž ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. μ΄μ™Έμ—λ„ λ³΅μž‘ν•œ λΉˆ μ„€μ •이 ν•„μš”ν•˜κ±°λ‚˜ ν™˜κ²½λ³„λ‘œ λ‹€λ₯Έ λΉˆμ„ λ“±λ‘ν•  λ•Œ ν™œμš©ν•©λ‹ˆλ‹€.



μ—¬κΈ°κΉŒμ§€κ°€ Claude AIκ°€ λ‚΄μ€€ λ¬Έμ œμ˜€λ‹€. μŠ€ν”„λ§μ„ μ²˜μŒ μ ‘ν•˜λ©΄ μ•Œκ²Œλ˜λŠ” μš©μ–΄λ“€μ΄μ§€λ§Œ μƒκ°λ³΄λ‹€ λͺ…ν™•ν•˜κ²Œ λ‹΅ν•˜κΈ°κ°€ μ–΄λ €μ› λ‹€. λ§Žμ€ λΆ€λΆ„듀을 κΉŒλ¨Ήκ³  μ§€λ‚΄κ³  μžˆμ—ˆκ΅¬λ‚˜. ν•΄λ‹Ή μ›¨μ΄λΈŒλ₯Ό ν•œ μ°¨λ‘€ μ§€λ‚΄κ³ λ‚˜λ‹ˆ μ’€ λ” λ§Žμ€ κ²ƒλ“€μ„ μ‹œλ„ν•΄λ³Ό μˆ˜ μžˆμ„ κ²ƒ κ°™λ‹€κ³  μƒκ°ν–ˆλ‹€. μ—¬κΈ°μ—λŠ” ν•΄λ‹Ή λ¬Έμ œλ“€μ„ κΈ°λ°˜μœΌλ‘œ ν•œ μ‹€μŠ΅ λ¬Έμ œ, λ”μš± κΉŠμ€ μŠ€ν”„λ§ μ§€μ‹ λ¬Έμ œ ν˜Ήμ€ ν•΄λ‹Ή μ§ˆλ¬Έμ—μ„œμ˜ κΌ¬λ¦¬ μ§ˆλ¬Έ λ“±μ΄ μžˆμ„ κ±° κ°™λ‹€.

 

이외에도 λ‹€μ–‘ν•œ λ°©μ‹μœΌλ‘œ AIλ₯Ό ν™œμš©ν•˜λŠ” μ‹œκ°„μ„ 가져봐야겠닀.