Language & Framework/Spring2023. 1. 21. 16:18[μŠ€ν”„λ§ MVC] μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 이해

μŠ€ν”„λ§ MVC 1편의 κ°•μ˜ λ‚΄μš©μ„ μ •λ¦¬ν•œ ν¬μŠ€νŒ…μž…λ‹ˆλ‹€. μ›Ή μ„œλ²„, μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„ μ›Ή μ„œλ²„ (Web Server) HTTP 기반으둜 λ™μž‘ν•˜λ©°, 주둜 정적 λ¦¬μ†ŒμŠ€λ₯Ό μ œκ³΅ν•œλ‹€. Nginxλ‚˜ Apacheκ°€ μ›Ή μ„œλ²„μ— μ†ν•œλ‹€. μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„ (WAS - Web Application Server) HTTP 기반으둜 λ™μž‘ν•˜λ©°, μ›Ή μ„œλ²„μ˜ κΈ°λŠ₯을 포함함과 λ™μ‹œμ— 동적 HTML, HTTP API, JSP와 같은 ν”„λ‘œκ·Έλž¨ μ½”λ“œλ₯Ό μ‹€ν–‰ν•΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œμ§μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€. Tomcat이 λŒ€ν‘œμ μœΌλ‘œ WAS에 μ†ν•œλ‹€. μ›Ή μ„œλ²„μ™€ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„ μ›Ή μ„œλ²„λŠ” 정적 λ¦¬μ†ŒμŠ€λ₯Ό, μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œμ§μ„ 주둜 λ‹΄λ‹Ήν•œλ‹€κ³  ν•˜μ§€λ§Œ, μ›Ή μ„œλ²„λ„ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” κΈ°λŠ₯을 ν¬ν•¨ν•˜κΈ°λ„ ν•˜κ³  μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜..

Language & Framework/Spring2023. 1. 12. 20:58[μŠ€ν”„λ§ 핡심 원리] 빈 μŠ€μ½”ν”„

μŠ€ν”„λ§ 핡심 μ›λ¦¬μ˜ κ°•μ˜ λ‚΄μš©μ„ μ •λ¦¬ν•œ ν¬μŠ€νŒ…μž…λ‹ˆλ‹€. 빈 μŠ€μ½”ν”„λž€? 말 κ·ΈλŒ€λ‘œ 빈이 μ‘΄μž¬ν•  수 μžˆλŠ” λ²”μœ„λ₯Ό λœ»ν•œλ‹€. μ§€κΈˆκΉŒμ§€λŠ” μŠ€ν”„λ§ 빈이 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ˜ μ‹œμž‘κ³Ό ν•¨κ»˜ μƒμ„±λ˜μ–΄ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ μœ μ§€λœλ‹€κ³  ν•™μŠ΅ν•˜μ˜€λŠ”λ°, 이것은 μŠ€ν”„λ§ 빈이 기본적으둜 싱글톀 μŠ€μ½”ν”„λ‘œ μƒμ„±λ˜κΈ° λ•Œλ¬Έμ΄λ‹€. μŠ€ν”„λ§μ€ λ‹€μŒκ³Ό 같이 λ‹€μ–‘ν•œ μŠ€μ½”ν”„λ₯Ό μ§€μ›ν•œλ‹€. 1. 싱글톀: κΈ°λ³Έ μŠ€μ½”ν”„λ‘œ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ˜ μ‹œμž‘κ³Ό μ’…λ£ŒκΉŒμ§€ μœ μ§€λ˜λŠ” κ°€μž₯ 넓은 λ²”μœ„μ˜ μŠ€μ½”ν”„μ΄λ‹€. 2. ν”„λ‘œν† νƒ€μž…: μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλŠ” ν”„λ‘œν† νƒ€μž… 빈의 생성과 의쑴 관계 μ£Όμž…, μ΄ˆκΈ°ν™”κΉŒμ§€λ§Œ κ΄€μ—¬ν•˜κ³  κ·Έ 이상 κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ” 짧은 λ²”μœ„μ˜ μŠ€μ½”ν”„μ΄λ‹€. 3. μ›Ή κ΄€λ ¨ μŠ€μ½”ν”„ 3-1 request: μ›Ή μš”μ²­μ΄ λ“€μ–΄μ˜€κ³  λ‚˜κ°ˆ λ•ŒκΉŒμ§€ μœ μ§€λ˜λŠ” μŠ€μ½”ν”„μ΄λ‹€. 3-2 sess..

Language & Framework/Spring2023. 1. 10. 21:46[μŠ€ν”„λ§ 핡심 원리] 빈 생λͺ…μ£ΌκΈ° 콜백

μŠ€ν”„λ§ 핡심 μ›λ¦¬μ˜ κ°•μ˜ λ‚΄μš©μ„ μ •λ¦¬ν•œ ν¬μŠ€νŒ…μž…λ‹ˆλ‹€. μ˜μ‘΄κ΄€κ³„ μ£Όμž… μ‹œμ  μ†ŒμΌ“ ν†΅μ‹ μ²˜λŸΌ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹œμž‘ 지점에 ν•„μš”ν•œ 연결을 미리 해두고, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ’…λ£Œ μ‹œμ μ— 연결을 λͺ¨λ‘ μ’…λ£Œν•˜λŠ” μž‘μ—…μ„ μ§„ν–‰ν•˜λ €λ©΄ 객체의 μ΄ˆκΈ°ν™”μ™€ μ’…λ£Œ μž‘μ—…μ΄ ν•„μš”ν•˜λ‹€. μŠ€ν”„λ§μ€ μ΄λŸ¬ν•œ μ΄ˆκΈ°ν™”/μ’…λ£Œ μž‘μ—…μ„ μ–΄λ–»κ²Œ μ§„ν–‰ν• κΉŒ? μŠ€ν”„λ§ λΉˆμ€ 기본적으둜 '객체 생성 → 의쑴 관계 μ£Όμž…'의 라이프사이클을 가진닀. 빈이 객체λ₯Ό μƒμ„±ν•˜κ³  μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ λͺ¨λ‘ λλ‚œ 이후에 데이터λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” μ€€λΉ„κ°€ κ°–μΆ°μ§€λŠ” κ²ƒμ΄λ―€λ‘œ, 데이터 μ΄ˆκΈ°ν™” μž‘μ—…μ€ 의쑴 관계 μ£Όμž…μ΄ λͺ¨λ‘ μ™„λ£Œλ˜κ³  λ‚œ λ‹€μŒμ— ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€. 싱글톀 λ°©μ‹μ—μ„œ μŠ€ν”„λ§ λΉˆμ€ λ‹€μŒκ³Ό 같은 이벀트 라이프사이클을 가진닀. (1) μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ 생성 → (2) μŠ€ν”„λ§ 빈 생성 → (3) 의쑴 ..

Language & Framework/Spring2022. 12. 21. 17:41[μŠ€ν”„λ§ 핡심 원리] μ˜μ‘΄κ΄€κ³„ μžλ™ μ£Όμž… (2)

μŠ€ν”„λ§ 핡심 μ›λ¦¬μ˜ κ°•μ˜ λ‚΄μš©μ„ μ •λ¦¬ν•œ ν¬μŠ€νŒ…μž…λ‹ˆλ‹€. 쑰회 빈이 2개 이상일 λ•Œ 문제점 @AutowiredλŠ” νƒ€μž…μœΌλ‘œ λΉˆμ„ μ‘°νšŒν•˜κΈ° λ•Œλ¬Έμ—, μ‹€μ œλ‘œλŠ” 더 λ§Žμ€ κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€λ§Œ ac.getBean(DiscountPolicy.class)와 μœ μ‚¬ν•˜κ²Œ λ™μž‘ν•œλ‹€. μ΄λ•Œ DiscountPolicy의 ν•˜μœ„ νƒ€μž…μ΄ 두 개 이상 μ‘΄μž¬ν•  경우 @AutowiredλŠ” ν•œ κ°œκ°€ μ•„λ‹Œ μŠ€ν”„λ§ 빈으둜 λ“±λ‘λœ ν•˜μœ„ νƒ€μž… 클래슀의 개수만큼 μ€‘λ³΅λœ λΉˆμ„ 찾게 되고, NoUniqueBeanDefinitionException이 λ°œμƒν•˜κ²Œ λœλ‹€. κ·Έλ ‡λ‹€κ³  ν•΄μ„œ ν•˜μœ„ νƒ€μž…μœΌλ‘œ λΉˆμ„ μ‘°νšŒν•˜λŠ” 것은 μ•„λž˜μ™€ 같이 두 가지 문제점이 μ‘΄μž¬ν•œλ‹€. 1. DIPλ₯Ό μœ„λ°°ν•¨κ³Ό λ”λΆˆμ–΄ μ½”λ“œμ˜ μœ μ—°μ„±μ΄ 떨어진닀. 2. 빈 이름은 λ‹€λ₯΄μ§€λ§Œ νƒ€μž…μ΄ λ™μΌν•œ 경우 문제λ₯Ό..

Language & Framework/Spring2022. 12. 21. 17:31[μŠ€ν”„λ§ 핡심 원리] μ˜μ‘΄κ΄€κ³„ μžλ™ μ£Όμž… (1)

μŠ€ν”„λ§ 핡심 μ›λ¦¬μ˜ κ°•μ˜ λ‚΄μš©μ„ μ •λ¦¬ν•œ ν¬μŠ€νŒ…μž…λ‹ˆλ‹€. μ˜μ‘΄κ΄€κ³„ μ£Όμž… 방법 μƒμ„±μž μ£Όμž… μƒμ„±μžλ₯Ό 톡해 의쑴 관계λ₯Ό μ£Όμž…λ°›λŠ” λ°©λ²•μœΌλ‘œ, μƒμ„±μž 호좜 μ‹œμ μ— λ”± ν•œ 번만 호좜되며 λΆˆλ³€ ν˜Ήμ€ ν•„μˆ˜μ μΈ 의쑴 관계 μ£Όμž… μ‹œ μ‚¬μš©λœλ‹€. μƒμ„±μžκ°€ ν•œ 개만 μžˆμ„ 경우 μŠ€ν”„λ§ λΉˆμ— ν•œν•΄μ„œ @Autowiredλ₯Ό μƒλž΅ν•΄λ„ μžλ™μœΌλ‘œ 의쑴 관계가 μ£Όμž…λœλ‹€. @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepositor..

Language & Framework/Spring2022. 12. 20. 01:29[μŠ€ν”„λ§ 핡심 원리] 싱글톀 μ»¨ν…Œμ΄λ„ˆ

μŠ€ν”„λ§ 핡심 μ›λ¦¬μ˜ κ°•μ˜ λ‚΄μš©μ„ μ •λ¦¬ν•œ ν¬μŠ€νŒ…μž…λ‹ˆλ‹€. 싱글톀 νŒ¨ν„΄ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ 1개만 μƒμ„±λ˜λŠ” 것을 보μž₯ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€. μŠ€ν”„λ§μ΄ μ—†λŠ” μˆœμˆ˜ν•œ DI(Dependency Injection) μ»¨ν…Œμ΄λ„ˆλ₯Ό μ΄μš©ν•œλ‹€κ³  κ°€μ •ν•΄λ³΄μž. DI μ»¨ν…Œμ΄λ„ˆμΈ AppConfigλŠ” μƒˆλ‘œμš΄ μš”μ²­μ΄ λ“€μ–΄μ˜¬ λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ”λ°, νŠΈλž˜ν”½μ΄ μ¦κ°€ν• μˆ˜λ‘ μƒμ„±λ˜λŠ” 객체가 λ§Žμ•„μ§μ— 따라 λ©”λͺ¨λ¦¬ 낭비도 μ‹¬ν•΄μ§„λ‹€λŠ” 단점이 μ‘΄μž¬ν•œλ‹€. μ΄λŸ¬ν•œ ν•΄κ²°λ°©μ•ˆμœΌλ‘œμ¨ 같은 κ°μ²΄λŠ” λ”± 1개만 μƒμ„±λ˜λ„λ‘ ν•˜μ—¬ 객체λ₯Ό κ³΅μœ ν•˜κ²Œλ” μ„€κ³„ν•˜λŠ” 방법을 μ΄μš©ν•  수 μžˆλŠ”λ°, ν•΄λ‹Ή 방법이 싱글톀 νŒ¨ν„΄μ„ μ΄μš©ν•˜λŠ” 것이닀. public class SingletonService { private static final SingletonService ..

Language & Framework/Spring2022. 11. 14. 01:44[μŠ€ν”„λ§ 핡심 원리] μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ™€ μŠ€ν”„λ§ 빈

μŠ€ν”„λ§ 핡심 μ›λ¦¬μ˜ κ°•μ˜ λ‚΄μš©μ„ μ •λ¦¬ν•œ ν¬μŠ€νŒ…μž…λ‹ˆλ‹€. μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ 생성 μ•„λž˜ μ½”λ“œλŠ” μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλ₯Ό μƒμ„±ν•˜λŠ” μ˜ˆμ‹œ μ½”λ“œμ΄λ‹€. ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); ApplicationContextλ₯Ό μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλΌκ³  ν•œλ‹€. μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλ₯Ό λ§Œλ“œλŠ” λ°©λ²•μ—λŠ” λŒ€ν‘œμ μœΌλ‘œ 두 가지가 μžˆλ‹€. XML 기반 μ• λ…Έν…Œμ΄μ…˜ 기반 μžλ°” μ„€μ • 클래슀 μœ„μ—μ„œμ˜ μ˜ˆμ‹œ μ½”λ“œκ°€ 2번 방법을 μ΄μš©ν•œ κ²ƒμœΌλ‘œ, new μ—°μ‚°μžλ₯Ό 톡해 μƒμ„±λœ AnnotationConfigApplicationContextλŠ” ApplicationContext μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄μ΄λ‹€. μ—„λ°€νžˆ 따지면 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ—λŠ” ..

Language & Framework/Spring2022. 11. 14. 01:32[μŠ€ν”„λ§ 핡심 원리] 예제 섀계 및 객체 지ν–₯ 원리 적용

μŠ€ν”„λ§ 핡심 μ›λ¦¬μ˜ κ°•μ˜ λ‚΄μš©μ„ μ •λ¦¬ν•œ ν¬μŠ€νŒ…μž…λ‹ˆλ‹€. 예제 섀계 λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ΅¬μ‚¬ν•­κ³Ό 섀계 νšŒμ› νšŒμ›κ°€μž… 및 쑰회 κ°€λŠ₯ 일반, VIP λ“±κΈ‰ ꡬ뢄 νšŒμ› λ°μ΄ν„°λŠ” 자체 DBλ₯Ό ꡬ좕할지 μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Ό 연동할지 미확정인 μƒνƒœ μ£Όλ¬Έκ³Ό 할인 μ •μ±… νšŒμ›μ€ μƒν’ˆμ„ μ£Όλ¬Έν•  수 있음 νšŒμ› 등급에 따라 λ‹€λ₯Έ 할인 μ •μ±… 적용 ν˜„μž¬ 할인 정책은 λͺ¨λ“  VIP λ“±κΈ‰μ˜ νšŒμ›μ—κ²Œ 1000원을 ν• μΈν•΄μ£ΌλŠ” κ³ μ • κΈˆμ•‘ 할인을 λ…Όμ˜ν•˜κ³  μžˆμœΌλ‚˜ μ°¨ν›„ 변경될 κ°€λŠ₯성이 λ†’μœΌλ©°, 상황에 따라 할인을 μ•„μ˜ˆ μ μš©ν•˜μ§€ μ•Šμ„ 수 있음 νšŒμ› 도메인 섀계 νšŒμ› 도메인 ν˜‘λ ₯ 관계 (κ°„λž΅ν•œ 관계도) νšŒμ› 클래슀 λ‹€μ΄μ–΄κ·Έλž¨ (κ΄€κ³„λ„μ˜ 각 μš”μ†Œλ₯Ό 클래슀/μΈν„°νŽ˜μ΄μŠ€ν™” ν•œ 것) νšŒμ› 객체 λ‹€μ΄μ–΄κ·Έλž¨ (ν΄λΌμ΄μ–ΈνŠΈκ°€ μ‹€μ œ 이용 μ‹œ 순차적으둜 μ—°κ²°λ˜λŠ” 관계도) νšŒμ› μ„œλΉ„μŠ€ ꡬ..

image