πŸ“• CS μŠ€ν„°λ””

    🐟🍞 λΆ•μ–΄λΉ΅μœΌλ‘œ μ΄ν•΄ν•˜λŠ” 객체지ν–₯

    컀피 전문점 도메인 섀계 및 κ΅¬ν˜„ 예제둜 잘 μ•Œλ €μ§„ νŒ¨λŸ¬λ‹€μž„μ„ μ €λ§Œμ˜ 방식인 λΆ•μ–΄λΉ΅ μ£Όλ¬Έ κ΅¬ν˜„ 예제둜 μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€. 객체지ν–₯을 μ΄ν•΄ν•˜λ €κ³  μ• μ“΄ λ…Έλ ₯이라고 λ΄μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€. πŸ“Œ 1. 객체 ꡬ성 κ΅¬λ§€μžκ°€ μžˆμŠ΅λ‹ˆλ‹€. νŒλ§€μžκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ©”λ‰΄νŒμ΄ μžˆμŠ΅λ‹ˆλ‹€. μ„ νƒλ˜λŠ” 2κ°€μ§€ 메뉴가 μžˆμŠ΅λ‹ˆλ‹€. (νŒ₯, 슈크림) μ œκ³΅λ˜λŠ” 2κ°€μ§€ 뢕어빡이 μžˆμŠ΅λ‹ˆλ‹€. μ§€λΆˆ κ°€λŠ₯ν•œ ν™”νμ˜ μ’…λ₯˜ 5κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€. (100원, 500원, 1,000원, 5,000원, 10,000원) ꡬ맀자, 판맀자, λ©”λ‰΄νŒ, μ„ νƒλ˜λŠ” 2κ°€μ§€ 메뉴, μ œκ³΅λ˜λŠ” 2κ°€μ§€ λΆ•μ–΄λΉ΅, μ§€λΆˆ κ°€λŠ₯ν•œ ν™”νμ˜ μ’…λ₯˜ 5κ°€μ§€κ°€ 각각 ν•˜λ‚˜μ˜ 객체가 될 수 μžˆμŠ΅λ‹ˆλ‹€. 객체지ν–₯의 κ΄€μ μ—μ„œ μžνŒκΈ°λΌλŠ” 도메인은 κ°μ²΄λ“€λ‘œ κ΅¬μ„±λœ μž‘μ€ μ„Έμƒμž…λ‹ˆλ‹€. 이처럼 μš°λ¦¬λŠ” κ°μ²΄λ“€μ˜ 세상에 μ‚΄κ³  ..

    [DB] πŸ”€ λ°μ΄ν„°λ² μ΄μŠ€μ˜ νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€(Isolation level)

    νŠΈλžœμž­μ…˜μ˜ κ²©λ¦¬μˆ˜μ€€κ³Ό λ™μ‹œμ„± 이슈 λ©΄μ ‘ μ§ˆλ¬Έμ— λ‹΅λ³€ν•˜κΈ° μœ„ν•΄ μ •λ¦¬ν•˜λ©° μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. νŠΈλžœμž­μ…˜μ΄λž€ Aκ°€ Bμ—κ²Œ μ†‘κΈˆμ„ ν–ˆλ‹€. Bκ°€ μ†‘κΈˆμ„ λ°›λŠ” 쀑 λ¬Έμ œκ°€ 생긴닀면 A의 μ†‘κΈˆ μš”μ²­μ΄ μ·¨μ†Œλ˜μ–΄μ•Ό ν•  것이닀. ν•œκΊΌλ²ˆμ— μˆ˜ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” μž‘μ—…μ˜ λ‹¨μœ„μ΄λ‹€. λ°μ΄ν„°μ˜ 일관성을 μœ μ§€ν•˜λ©΄μ„œ μ•ˆμ •μ μœΌλ‘œ 데이터λ₯Ό λ³΅κ΅¬ν•˜κΈ° μœ„ν•œ λͺ©μ μ„ κ°€μ§„λ‹€. νŠΈλžœμž­μ…˜ ACID μ„±μ§ˆ 쀑 격리성(Isolation) := λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” νŠΈλžœμž­μ…˜λ“€μ΄ μ„œλ‘œ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šλ„λ‘ λ‹€λ₯Έ νŠΈλžœμž­μ…˜ 연산에 끼어듀 수 μ—†μŒ 격리 μˆ˜μ€€μ΄ λ†’μ•„μ§€κ²Œ 되면 λ™μ‹œμ— μ²˜λ¦¬λ˜λŠ” νŠΈλžœμž­μ…˜μ„ μ°¨λ‘€λŒ€λ‘œ 싀행을 ν•˜λŠ” 것은 λ™μ‹œμ„± μ„±λŠ₯이 맀우 λ–¨μ–΄μ§€κ²Œ λ˜λ―€λ‘œ 각 DBMSμ—μ„œλŠ” Isolation μ„±μ§ˆμ„ νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€μ„ μ΄μš©ν•΄μ„œ μ μš©ν•΄μ•Ό ν•œλ‹€. νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€ ANSI ν‘œ..

    [Spring] ⌚ Quartz 라이브러리 Scheduling

    νŠΉμ • μ‹œκ°„ 간격을 λ°˜λ³΅ν•˜κ±°λ‚˜ νŠΉμ •ν•œ μ‹œκ°μ— λ‘œμ§μ„ μˆ˜ν–‰ν•˜λŠ” 것을 Scheduler라고 ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μž‘μ—…μ„ μœ„ν•΄ Springμ—μ„œλŠ” 2κ°€μ§€ μ˜΅μ…˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. Spring Scheduler Spring Quartz κ·Έ 쀑 μ„Έλ°€ν•œ μ œμ–΄κ°€ κ°€λŠ₯ν•œ Quartz Scheduler λΌμ΄λΈŒλŸ¬λ¦¬μ— λŒ€ν•΄ μ•Œμ•„λ΄…μ‹œλ‹€. κΈ°λ³Έ ꡬ성 Job μŠ€μΌ€μ€„λ§ν•  μ‹€μ œ μž‘μ—…μ„ κ°€μ§€λŠ” 객체 - JobListener JobData Jobμ—μ„œ μ‚¬μš©ν•  데이터λ₯Ό μ „λ‹¬ν•˜λŠ” 객체 JobDataMap μŠ€μΌ€μ€„λŸ¬μ—μ„œ Job μ‹€ν–‰ μ‹œ μ‚¬μš©ν•  λ³€μˆ˜ κ°’ 전달 μš©λ„ (key-value ν˜•μ‹) JobDetail Job의 정보λ₯Ό κ΅¬μ„±ν•˜λŠ” 객체 JobBuilder Job의 instances μ •μ˜ν•˜λŠ” JobDetail instances λΉŒλ“œμ— μ‚¬μš© Trigger Job..

    [Spring] ↩️ @Transactional μ™œ μ‚¬μš©ν•˜λŠ” κ±°μ§€?

    @Transactional μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš© μ΄μœ μ™€ μ‚¬μš© 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄μž πŸ“Œ @Transactional μ‚¬μš© 이유 ν•œλ²ˆμ— μˆ˜ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” 연산듀을 μ²˜λ¦¬ν•  λ•Œ κ·Έ 쀑 ν•˜λ‚˜κ°€ 였λ₯˜κ°€ λ‚œ 경우 κ·Έ 전에 μ‹€ν–‰λ˜μ—ˆλ˜ SQL 쿼리듀이 λ‹€ λ‘€λ°±λ˜μ–΄μ•Ό ν•˜κΈ°μ— *λ‘€λ°±(Rollback): 둀백은 μž‘μ—… 쀑 λ¬Έμ œκ°€ λ°œμƒλ˜μ–΄ νŠΈλžœμž­μ…˜μ˜ μ²˜λ¦¬κ³Όμ •μ—μ„œ λ°œμƒν•œ 변경사항을 μ·¨μ†Œν•˜λŠ” λͺ…λ Ήμ–΄ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λŠ”μ„ μ–Έμ  νŠΈλž™μž­μ…˜ (@Transactional) 클래슀 λ ˆλ²¨μ— @Transactional 을 μ„ μ–Έν•˜λ©΄, ν•΄λ‹Ή 클래슀 λ‚΄ λͺ¨λ“  ν…ŒμŠ€νŠΈ λ©”μ„œλ“œμ— νŠΈλžœμž­μ…˜μ΄ 적용되고, 각 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œκ°€ μˆ˜ν–‰ μ™„λ£Œλœ ν›„ 둀백이 됨 λ©”μ„œλ“œ λ ˆλ²¨μ— @Transactional 을 μ„ μ–Έν•˜λ©΄, ν•΄λ‹Ή ν…ŒμŠ€νŠΈ λ©”μ„œλ“œμ— νŠΈλžœμž­μ…˜μ΄ μ μš©λ˜μ–΄ μˆ˜ν–‰ μ™„λ£Œ ν›„ 둀백이 됨..

    [Spring] πŸƒ μ™œ Spring ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλŠ”κ°€?

    Java ν”„λ ˆμž„μ›Œν¬μ˜ μ’…λ₯˜λŠ” Hibernate, Struts, Play Framework, Apache Wicket, Spark, Spring 등이 μžˆμŠ΅λ‹ˆλ‹€. κ·Έ 쀑 Javaλ₯Ό λ‹€λ£¨λŠ” κ°œλ°œμžλ“€ μ‚¬μ΄μ—μ„œλŠ” Spring이 μœ λ… 많이 μ‚¬μš©λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ μ™œ μš°λ¦¬λŠ” Spring ν”„λ ˆμž„μ›Œν¬λ₯Ό 많이 μ‚¬μš©ν• κΉŒμš”? Spring ν”„λ ˆμž„μ›Œν¬κ°€ world's most popular ν•˜κΈ°μ—? πŸ“Œ μš°μ„  Spring의 λ“±μž₯ 배경에 λŒ€ν•΄μ„œ μ•Œμ•„λ΄…μ‹œλ‹€. 2002λ…„ λ‘œλ“œ μ‘΄μŠ¨μ— μ˜ν•΄ 책이 μΆœκ°„λ©λ‹ˆλ‹€. κ·Έ λ‚΄μš© 쀑 EJB의 λ¬Έμ œμ μ„ μ§€μ ν•˜κ³ , EJB 없이도 μΆ©λΆ„νžˆ κ³ ν’ˆμ§ˆμ˜ ν™•μž₯ κ°€λŠ₯ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 μžˆμŒμ„ λ³΄μ—¬μ£ΌλŠ” 예제 μ½”λ“œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ§Žμ€ κ°œλ°œμžλ“€μ΄ μ±…μ˜ 예제 μ½”λ“œλ₯Ό ν”„λ‘œμ νŠΈμ— μ‚¬μš©ν•˜κ²Œ λ˜μ—ˆκ³ , μ±…μœΌλ‘œλ§Œ μ „ν•΄μ§€..

    [WEB] 🌐 μ›Ή λΈŒλΌμš°μ €μ˜ λ™μž‘ 원리 - μ£Όμ†Œμ°½μ— URL 검색 μ‹œ λ°œμƒν•˜λŠ” 일련의 κ³Όμ •

    νŠΉμ • URL을 μž…λ ₯ λΈŒλΌμš°μ € μΊμ‹œμ—μ„œ DNS 기둝 확인 πŸ“Œ 1. νŠΉμ • URL을 μž…λ ₯ 예제λ₯Ό μœ„ν•΄ https://www.google.com 을 μž…λ ₯ν–ˆλ‹€κ³  ν•΄λ³΄μž πŸ“Œ 2. λΈŒλΌμš°μ €κ°€ DNSμ—κ²Œ 도메인 μ£Όμ†Œλ‘œ μš”μ²­ 2 - 1. URLκ³Ό λ§€μΉ­λ˜λŠ” IPλ₯Ό μ°ΎκΈ° μœ„ν•΄ μΊμ‹œ 확인 λΈŒλΌμš°μ € μΊμ‹œ 확인 μ»΄ν“¨ν„°μ˜ hosts νŒŒμΌμ—μ„œ OS μΊμ‹œ 확인 (C:\Windows\System32\drivers\etc\hosts) router μΊμ‹œ 확인 ISP μΊμ‹œ 확인 *hosts 파일 := ip μ£Όμ†Œμ™€ hostname 을 λ§€μΉ­μ‹œμΌœλ†“μ€ ν…μŠ€νŠΈ 파일 *ISP := 인터넷 μ„œλΉ„μŠ€ 제곡자 (ex. KT, SKT) 2 - 2. μΊμ‹œμ—μ„œ λͺ» μ°Ύμ•˜λ‹€λ©΄ ISP의 DNS μ„œλ²„(DNS recursor)λŠ” recursive DNS lookup을 μˆ˜ν–‰..

    [Docker] Docker 데이터 κ΄€λ¦¬μ˜ 이해 (Volume, Mount)

    πŸ’‘ 1. Docker 데이터 관리 2. 마운트 μ˜΅μ…˜ 3. 마운트 μ‚¬μš© 이유 4. volume μ‹€ν–‰ 예제 5. volumeκ³Ό bind mount 차이 πŸ“Œ Docker μ»¨ν…Œμ΄λ„ˆ 데이터 관리 λ‹€μˆ˜μ˜ Docker μ»¨ν…Œμ΄λ„ˆ 운영 μ‹œ μ»¨ν…Œμ΄λ„ˆ κ°„μ˜ 파일 κ³΅μœ κ°€ ν•„μš”ν•œ 상황이 생긴닀. A μ»¨ν…Œμ΄λ„ˆ λ‘œκ·ΈνŒŒμΌμ„ B μ»¨ν…Œμ΄λ„ˆλ‘œ μˆ˜μ§‘ν•˜λŠ” 경우 2κ°€μ§€ μ ‘κ·Ό 방법이 μžˆλ‹€. Bκ°€ A μ»¨ν…Œμ΄λ„ˆ λ³Όλ₯¨μ— μ ‘κ·Όν•΄ 둜그 νŒŒμΌμ„ μˆ˜μ§‘ν•˜λŠ” 방법 호슀트 OS에 곡유 λ³Όλ₯¨μ„ 생성, 이 곡간에 A μ„œλ²„ 둜그 νŒŒμΌμ„ μ €μž₯ν•˜κ³  Bκ°€ 둜그 νŒŒμΌμ„ μˆ˜μ§‘ν•˜λŠ” 방법 πŸ“Œ 마운트 μ‚¬μš© 이유 μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ μ‹œ μ»¨ν…Œμ΄λ„ˆ 내뢀에 μ €μž₯된 데이터가 같이 μ‚­μ œλ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•œλ‹€. κ·Έλž˜μ„œ λ°μ΄ν„°μ˜ μ˜μ†μ„±μ„ 보μž₯ν•˜κΈ° μœ„ν•΄ λ§ˆμš΄νŠΈν•˜μ—¬ μ‚¬μš©ν•œλ‹€. 파일 μ‹œμŠ€ν…œκ³Ό μ»¨ν…Œμ΄λ„ˆλ₯Ό 뢄리..

    λ”°λΌν•˜λ©΄ λ˜λŠ” Netty 기반 κ°„λ‹¨ν•œ Live Chat μ„œλ²„ 예제

    πŸ’‘ 비동기 이벀트 기반 λ„€νŠΈμ›Œν¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬μΈ Nettyλ₯Ό ν•™μŠ΅ν•˜λ©° Simple Chat Serverλ₯Ό ꡬ좕할 수 μžˆλ‹€. μ§€λ‚œλ²ˆ λ§Œλ“€μ—ˆλ˜ EchoServerλ₯Ό 심화해 Live Chat μ„œλ²„λ₯Ό κ΅¬ν˜„ν•΄λ³΄μž μ €λ²ˆ μ˜ˆμ œλŠ” EchoServer.java와 EchoServerHandler.java 파일둜 κ΅¬μ„±λ˜μ—ˆμ§€λ§Œ, 이번 예제의 파일 ꡬ성은 μ•„λž˜μ™€ κ°™λ‹€. - ChatServer.java - ChatServerHandler.java - ChatClient.java - ChatClientHandler.java ChatServer.java import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.nett..

    λ”°λΌν•˜λ©΄ λ˜λŠ” Netty 기반 EchoServer 예제

    πŸ’‘ 비동기 이벀트 기반 λ„€νŠΈμ›Œν¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬μΈ Nettyλ₯Ό ν•™μŠ΅ν•˜λ©° EchoServerλ₯Ό ꡬ좕할 수 μžˆλ‹€. πŸ“Œ Netty import μ„ΈνŒ… 방법 1. Maven dependencyλ₯Ό μΆ”κ°€ν•΄μ£ΌλŠ” 방법 (링크) 방법 2. Java Build path > Libraries > Add External JARs, 라이브러리 λ“±λ‘ν•˜λŠ” 방법 (링크) 파일 ꡬ성 - EchoServer.java - EchoServerHandler.java πŸ“Œ EchoServer.java import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io..

    JAVA λ„€νŠΈμ›Œν¬ ν”„λ‘œκ·Έλž˜λ° - μ†ŒμΌ“ 톡신 πŸ‘‰ netty

    πŸ’‘ μžλ°” μ†ŒμΌ“ 톡신 πŸ’‘ μžλ°”μ˜ λ„€νŠΈμ›Œν¬ 톡신 λ³€ν™” 순수 μžλ°”λ₯Ό μœ„ν•œ java.net νŒ¨ν‚€μ§€ 라이브러리 πŸ‘‰ μžλ°” NIO πŸ‘‰ netty πŸ“Œ 순수 μžλ°”λ₯Ό μœ„ν•œ java.net νŒ¨ν‚€μ§€ 라이브러리 → λΈ”λ‘œν‚Ή ν•¨μˆ˜λ§Œ 지원 → ν•œ λ²ˆμ— ν•œ μ—°κ²°λ§Œ 처리 λ§Žμ€ 수의 ν΄λΌμ΄μ–ΈνŠΈλ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ§Žμ€ 수의 μŠ€λ ˆλ“œλ₯Ό 생성해야 ν•˜λŠ” λ¦¬μ†ŒμŠ€ λ‚­λΉ„ πŸ“Œ μžλ°” NIO λ…ΌλΈ”λ‘œν‚Ή 호좜이 포함, 이벀트 톡지 APIλ₯Ό 이용 적은 수의 μŠ€λ ˆλ“œλ‘œ 더 λ§Žμ€ 연결을 μ²˜λ¦¬ν•  수 μžˆμ–΄ λ©”λͺ¨λ¦¬ 관리와 μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ˜μ— λŒ€ν•œ μ˜€λ²„ν—€λ“œκ°€ μ€€λ‹€. μž…μΆœλ ₯을 μ²˜λ¦¬ν•˜μ§€ μ•Šμ„ λ•ŒλŠ” μŠ€λ ˆλ“œλ₯Ό λ‹€λ₯Έ μž‘μ—…μ— ν™œμš©ν•  수 μžˆλ‹€. λΆ€ν•˜κ°€ 높은 μƒν™©μ—μ„œμ˜ κΉŒλ‹€λ‘œμš΄ μ²˜λ¦¬λŠ” μ–΄λ €μš΄ μΌμž„ πŸ“Œ netty μ˜€ν”ˆμ†ŒμŠ€ ν”„λ ˆμž„μ›Œν¬ λ‚΄λΆ€μ—μ„œ λ„€νŠΈμ›Œν¬ μ†‘μˆ˜μ‹  μ²˜λ¦¬μ— μ‚¬μš© κ³ κΈ‰ APIλ₯Ό 내뢀에..