0329 - 0404


# 0329 - 0404

# 0329 - log

# SLF4J

Simple Logging Facade for Java ์˜ ์•ฝ์ž๋กœ logging framework๋“ค์„ ์ถ”์ƒํ™” ํ•ด ๋†“์€ ๊ฒƒ. Facade Pattern์„ ์ ์šฉํ•œ logging framework์ด๋‹ค.

# Logback

  • Spring Boot๋Š” logback์ด ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •, ๋ณ„๋„๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

    • spring-boot-starter-web ์•ˆ์— spring-boot-starter-logging ๊ตฌํ˜„์ฒด ์กด์žฌ.
  • logback-spring.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<configuration>

<!--ํ”„๋กœํผํ‹ฐ-->
<!--<propertyname="LOGS_PATH"value="./logs"/>-->

<appendername="CONSOLE"class="ch.qos.logback.core.ConsoleAppender">
<layoutclass="ch.qos.logback.classic.PatternLayout">
<pattern>%highlight(%-5p):[%d{yyyy-MM-ddHH:mm:ss:mmm}]%cyan(%c)-%m%n{2,CALLER_DISPLAY_EVAL}</pattern>
</layout>
</appender>

<appendername="SAMPLE"class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%d{yyyy-MM-ddHH:mm:ss}:%-3relative][%thread]%-5level%logger{35}-%msg%n</pattern>
</encoder>
</appender>

<appendername="COM_FILE"class="ch.qos.logback.core.rolling.RollingFileAppender">
<filterclass="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<prudent>true</prudent>
<rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROUTER_HOME}/log/router_log.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%-5p:[%d{yyyy-MM-ddHH:mm:ss:mmm}]%c-%m%n</pattern>
</encoder>
</appender>

<loggername="com.ese"additivity="false"level="INFO">
<appender-refref="CONSOLE"/>
<appender-refref="COM_FILE"/>
</logger>

<!--RootLogger-->
<rootlevel="INFO">
<appender-refref="CONSOLE"/>
</root>
</configuration>

  • appender : log์˜ ํ˜•ํƒœ๋ฅผ ์„ค์ •
  • logger : ์„ค์ •ํ•œ appender๋ฅผ ์ฐธ์กฐํ•˜์—ฌ package์™€ level์„ ์„ค์ •
  • property : ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ค์ •

# 0330 - Maven Wrapper

# ๊ตฌ์„ฑ

  • https://github.com/takari/takari-maven-plugin
    Maven wrapper plugin ์‚ฌ์šฉ

  • intellij ๊ธฐ์ค€ [ ctrl + ctrl ]
    mvn (๋ชจ๋“ˆ๋ช…) -N io.takari:maven:wrapper ์‹คํ–‰
    => .mvn mvnw, mvnw.cmd ์ƒ์„ฑ

# mvnw / mvwn,cmd

  • mvnw : Maven ๋Œ€์‹ ์— ์‚ฌ์šฉ๋˜๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ unix shell script.
  • mvwn.cmd : mvnw ์˜ ์œˆ๋„์šฐ ๋ฐฐ์น˜ ๋ฒ„์ „ shell script.

# .mvn

  • MavenWrapperDownloader.java : ์ž๋ฐ”ํด๋ž˜์Šค ํŒŒ์ผ์ธ ์ดํŒŒ์ผ์„ ์ปดํŒŒ์ผ๋งํ•˜์—ฌ ๋ฉ”์ด๋ธ ๋‹ค์šด๋กœ๋“œ
  • maven-wrapper.jar : wrappper shell scripts ๋กœ ๋ถ€ํ„ฐ maven ์„ ์‹คํ–‰ํ•˜๊ณ , ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  • maven-wrapper.properties : Maven ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•œ URL ์„ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ

# Maven Wrapper ์‹คํ–‰ํ•˜๊ธฐ

  • Maven/target Clean ๋ฐ build
    • ./mvnw clean package
  • Maven ์œผ๋กœ Spring boot ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰
    • ./mvnw spring-boot:run &
  • mvnw ๋กœ ์„ค์น˜๋œ maven ๋ฐฐํฌ ๊ฒฝ๋กœ
    • ~/.m2/wrapper/dists

# 0331 - GitHub ์ €์žฅ์†Œ(repository) ๋ฏธ๋Ÿฌ๋ง

๋ฏธ๋Ÿฌ๋ง์ด๋ž€ commit log๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ clone

# ์ €์žฅ์†Œ ๋ฏธ๋Ÿฌ๋ง

  1. ๋ณต์‚ฌํ•˜๊ณ ์žํ•˜๋Š” ์ €์žฅ์†Œ์˜ bare clone ์ƒ์„ฑ
git clone --bare {๋ณต์‚ฌํ•˜๊ณ ์žํ•˜๋Š” ์ €์žฅ์†Œ์˜ git ์ฃผ์†Œ}
  1. ์ƒˆ๋กœ์šด ์ €์žฅ์†Œ๋กœ mirror-push
cd {๋ณต์‚ฌํ•˜๊ณ ์žํ•˜๋Š” ์ €์žฅ์†Œ์˜ git ์ฃผ์†Œ}
git push --mirror {๋ถ™์—ฌ๋†“์„์ €์žฅ์†Œ์˜ git ์ฃผ์†Œ}
  1. 1๋ฒˆ์—์„œ ์ƒ์„ฑ๋œ ์ €์žฅ์†Œ ์‚ญ์ œ

# 100MB๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ํŒŒ์ผ์„ ๊ฐ€์ง„ ์ €์žฅ์†Œ ๋ฏธ๋Ÿฌ๋ง

  1. git lfs์™€ BFG Repo Cleaner ์„ค์น˜
  2. ๋ณต์‚ฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ €์žฅ์†Œ์˜ bare clone ์ƒ์„ฑ
git clone --mirror {๋ณต์‚ฌํ•˜๊ณ ์žํ•˜๋Š”์ €์žฅ์†Œ์˜ git ์ฃผ์†Œ}
  1. commit history์—์„œ large file์„ ์ฐพ์•„ ํŠธ๋ž™ํ‚น
git filter-branch --tree-filter 'git lfs track "*.{zip,jar}"' -- --all
  1. BFG๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ํŒŒ์ผ๋“ค์„ git lfs๋กœ ๋ณ€๊ฒฝ
java -jar ~/usr/bfg-repo-cleaner/bfg-1.13.0.jar --convert-to-git-lfs '*.zip'
java -jar ~/usr/bfg-repo-cleaner/bfg-1.13.0.jar --convert-to-git-lfs '*.jar'
  1. ์ƒˆ๋กœ์šด ์ €์žฅ์†Œ๋กœ mirror-push
cd {๋ณต์‚ฌํ•˜๊ณ ์žํ•˜๋Š”์ €์žฅ์†Œ์˜ git ์ฃผ์†Œ}
git push --mirror {๋ถ™์—ฌ๋†“์„์ €์žฅ์†Œ์˜ git wnth}
  1. 1๋ฒˆ์—์„œ ์ƒ์„ฑ๋œ ์ €์žฅ์†Œ ์‚ญ์ œ

# 0401 - ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •๋ฆฌ

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ž€ HTTP ์š”์ฒญ์„ ๋ฐ›๊ณ  HTTP ์‘๋‹ต์„ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋Š”๊ฒƒ
์ด์ ์„ ์ธ์ง€ํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋Š”๊ฒŒ ์ค‘์š” => ์›น ๊ธฐ์ˆ  ๋น ๋ฅด๊ฒŒ ํŒŒ์•…๊ฐ€๋Šฅ

# HTTP ์š”์ฒญ

  • URI
  • METHOD
  • HEADER
  • BODY

์Šคํ”„๋ง์€ HTTP ์š”์ฒญ์„ ํ†ตํ•ด ๋‘๊ฐ€์ง€ ์ž‘์—…์„ ํ•œ๋‹ค.

  1. ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ๋Š” ์ž‘์—… - Mapping
  2. ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ์— ์š”์ฒญ ์ •๋ณด๋ฅผ ์–ด๋–ค ์‹์œผ๋กœ ์ „๋‹ฌํ• ๊นŒ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ž‘์—…
@RequestMapping("/hello")
=> HTTP ์š”์ฒญ์ค‘ URI ๋ถ€๋ถ„์œผ๋กœ ๋งคํ•‘  
=> ๋ณดํ†ต BODY๋Š” ๋งคํ•‘์— ์‚ฌ์šฉ๋˜์ง€์•Š๊ณ , ๋‚˜๋จธ์ง€ ๊ตฌ์„ฑ์š”์†Œ๋กœํ•จ.

๋งคํ•‘์—์„œ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์†Œ๋“œ๊นŒ์ง€ ๊ฒฐ์ •ํ•˜๋ฉด ๊ทธ ๋‹ค์Œ์€ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์–ด๋–ป๊ฒŒ HTTP ์š”์ฒญ์„ ๊ฐ€๊ณตํ•ด์„œ ๋„˜๊ฒจ์ค„ ๊ฒƒ์ธ๊ฐ€๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ.
(๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ด€๋ก€์ ์œผ๋กœ 30๊ฐ€์ง€๊ฐ€ ์กด์žฌ)

# HTTP ์‘๋‹ต

HTTP ์‘๋‹ต์€ ํฌ๊ฒŒ

  • ์ƒํƒœ ์ฝ”๋“œ
  • ํ—ค๋”
  • ๋ฐ”๋””

๊ฐ€์žฅ๋จผ์ € ์ƒํƒœ์ฝ”๋“œ๋ฅผ ๋„ฃ๊ณ  ํ—ค๋” ์š”์†Œ ์ค‘ content type์— ๋”ฐ๋ผ ๋ฐ”๋””์— html์„ ๋„ฃ์„์ง€, json์„ ๋„ฃ์„์ง€, binary๋ฅผ ์ธ์ฝ”๋”ฉํ•ด์„œ ๋„ฃ์„์ง€ ๋“ฑ๋“ฑ์„ ๊ฒฐ์ •.

*** ๊ฒฐ๋ก ์€ ์›น ๊ฐœ๋ฐœ์—์„œ ๊ฐ€์žฅ ์ค‘์š”์‹œ ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์€ '์š”์ฒญ๊ณผ ์‘๋‹ต์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ค„์ง€๊ณ  ๋งŒ๋“ค์–ด์ง€๋Š”๊ฐ€' ์ด๋‹ค.


์ •๋ฆฌ แ„‹แ…ฐแ†ธ แ„€แ…ขแ„‡แ…กแ†ฏ


# 0402 - ๋ฐ๋“œ๋ฝ(DeadLock)

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์›์„ ์–ป์ง€ ๋ชปํ•ด์„œ ๋‹ค์Œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ
'๊ต์ฐฉ ์ƒํƒœ'๋ผ๊ณ ๋„ ๋ถ€๋ฆ„
์‹œ์Šคํ…œ์ ์œผ๋กœ ํ•œ์ •๋œ ์ž์›์„ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒ

# ๋ฐ๋“œ๋ฝ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ

ํ”„๋กœ์„ธ์Šค 1๊ณผ 2๊ฐ€ ์ž์›1,2๋ฅผ ๋ชจ๋‘ ์–ป์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„๋•Œ

t1 : ํ”„๋กœ์„ธ์Šค 1์ด ์ž์›1์„ ์–ป์Œ / ํ”„๋กœ์„ธ์Šค2๊ฐ€ ์ž์› 2๋ฅผ ์–ป์Œ
t2 : ํ”„๋กœ์„ธ์Šค1์€ ์ž์›2๋ฅผ ๊ธฐ๋‹ค๋ฆผ / ํ”„๋กœ์„ธ์Šค2๋Š” ์ž์›1์„ ๊ธฐ๋‹ค๋ฆผ

ํ˜„์žฌ ์„œ๋กœ ์›ํ•˜๋Š” ์ž์›์ด ์ƒ๋Œ€๋ฐฉ์— ํ• ๋‹น๋˜์–ด ์žˆ์–ด์„œ ๋‘ ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌดํ•œ์ • wait ์ƒํƒœ์— ๋น ์ง
-> ์ด๊ฒŒ DeadLock

# [์ฃผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ]

  • ๋ฉ€ํ‹ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™˜๊ฒฝ์—์„œ ํ•œ์ •๋œ ์ž์›์„ ์–ป๊ธฐ ์œ„ํ•ด ์„œ๋กœ ๊ฒฝ์Ÿํ•˜๋Š” ์ƒํ™ฉ ๋ฐœ์ƒ
  • ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์›์„ ์š”์ณฅํ–ˆ์„ ๋•Œ, ๋™์‹œ์— ๊ทธ ์ž์›์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ. ์ด๋•Œ ํ”„๋กœ์„ธ์Šค๋Š” ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐ
  • ๋Œ€๊ธฐ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐ„ ํ”„๋กœ์„ธ์Šค๋“ค์ด ์‹คํ–‰ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†์„ ๋•Œ '๊ต์ฐฉ ์ƒํƒœ' ๋ฐœ์ƒ

# ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ์กฐ๊ฑด

4๊ฐ€์ง€ ๋ชจ๋‘ ์„ฑ๋ฆฝํ•ด์•ผ ๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ(ํ•˜๋‚˜๋ผ๋„ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐ๋“œ๋ฝ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ)

  1. ์ƒํ˜ธ ๋ฐฐ์ œ(Mutual exclusion)
  • ์ž์›์€ ํ•œ ํ”„๋กœ์„ธ์Šค๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  1. ์ ์œ  ๋Œ€๊ธฐ(Hold and wait)
  • ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ์ž์›์„ ์ ์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉด์„œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ํ• ๋‹น๋˜์–ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ž์›์„ ์ถ”๊ฐ€๋กœ ์ ์œ ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ธฐํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•จ
  1. ๋น„์„ ์ (No preemption)
  • ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ํ• ๋‹น๋œ ์ž์›์€ ์‚ฌ์šฉ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ฐ•์ œ๋กœ ๋นผ์•—์„ ์ˆ˜ ์—†์Œ
  1. ์ˆœํ™˜ ๋Œ€๊ธฐ(Circular wait)
  • ํ”„๋กœ์„ธ์Šค ์ง‘ํ•ฉ์—์„œ ์ˆœํ™˜ ํ˜•ํƒœ๋กœ ์ž์›์„ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•จ

# ๋ฐ๋“œ๋ฝ ์ฒ˜๋ฆฌ

  • ๊ต์ฐฉ ์ƒํƒœ๋ฅผ ์˜ˆ๋ฐฉ & ํšŒํ”ผ
  1. ์˜ˆ๋ฐฉ(prevention)
    ๊ต์ฐฉ ์ƒํƒœ ๋ฐœ์ƒ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด์„œ ํ•ด๊ฒฐํ•œ๋‹ค (์ž์› ๋‚ญ๋น„ ์—„์ฒญ ์‹ฌํ•จ)
    • ์ƒํ˜ธ๋ฐฐ์ œ ๋ถ€์ • : ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ  ์ž์› ์‚ฌ์šฉ
    • ์ ์œ ๋Œ€๊ธฐ ๋ถ€์ • : ํ”„๋กœ์„ธ์Šค ์‹คํ–‰์ „ ๋ชจ๋“  ์ž์›์„ ํ• ๋‹น
    • ๋น„์„ ์  ๋ถ€์ • : ์ž์› ์ ์œ  ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ์ž์›์„ ์š”๊ตฌํ•  ๋•Œ ๊ฐ€์ง„ ์ž์› ๋ฐ˜๋‚ฉ
    • ์ˆœํ™˜๋Œ€๊ธฐ ๋ถ€์ • : ์ž์›์— ๊ณ ์œ ๋ฒˆํ˜ธ ํ• ๋‹น ํ›„ ์ˆœ์„œ๋Œ€๋กœ ์ž์› ์š”๊ตฌ
  2. ํšŒํ”ผ(avoidance)
    ๊ต์ฐฉ ์ƒํƒœ ๋ฐœ์ƒ ์‹œ ํ”ผํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•
    ์€ํ–‰์› ์•Œ๊ณ ๋ฆฌ์ฆ˜(Banker's Algorithm)
    • ์€ํ–‰์—์„œ ๋ชจ๋“  ๊ณ ๊ฐ์˜ ์š”๊ตฌ๊ฐ€ ์ถฉ์กฑ๋˜๋„๋ก ํ˜„๊ธˆ์„ ํ• ๋‹นํ•˜๋Š”๋ฐ์„œ ์œ ๋ž˜ํ•จ
    • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์›์„ ์š”๊ตฌํ•  ๋•Œ, ์‹œ์Šคํ…œ์€ ์ž์›์„ ํ• ๋‹นํ•œ ํ›„์—๋„ ์•ˆ์ • ์ƒํƒœ๋กœ ๋‚จ์•„์žˆ๊ฒŒ ๋˜๋Š”์ง€ ์‚ฌ์ „์— ๊ฒ€์‚ฌํ•˜์—ฌ ๊ต์ฐฉ์ƒํƒœ ํšŒํ”ผ
    • ์•ˆ์ • ์ƒํƒœ๋ฉด ์ž์› ํ• ๋‹น, ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋“ค์ด ์ž์› ํ•ด์ง€๊นŒ์ง€ ๋Œ€๊ธฐ
  • ๊ต์ฐฉ ์ƒํƒœ๋ฅผ ํƒ์ง€ & ํšŒ๋ณต
    ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋˜๋„๋ก ํ—ˆ์šฉํ•œ ๋‹ค์Œ ํšŒ๋ณต์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•
  1. ํƒ์ง€(Detection)
    ์ž์› ํ• ๋‹น ๊ทธ๋ž˜ํ”„๋ฅผ ํ†ตํ•ด ๊ต์ฐฉ ์ƒํƒœ๋ฅผ ํƒ์ง€ํ•จ
    ์ž์› ์š”์ฒญ ์‹œ, ํƒ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰์‹œ์ผœ ๊ทธ์— ๋Œ€ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒํ•จ
  2. ํšŒ๋ณต(Recovery)
    ๊ต์ฐฉ ์ƒํƒœ ์ผ์œผํ‚จ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜, ํ• ๋‹น๋œ ์ž์›์„ ํ•ด์ œ์‹œ์ผœ ํšŒ๋ณต์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•
    • ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ๋ฐฉ๋ฒ•
      • ๊ต์ฐฉ ์ƒํƒœ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ชจ๋‘ ์ค‘์ง€
      • ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€ ํ•˜๋‚˜์”ฉ ํ”„๋กœ์„ธ์Šค ์ค‘์ง€
    • ์ž์› ์„ ์  ๋ฐฉ๋ฒ•
      • ๊ต์ฐฉ ์ƒํƒœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ์ž์›์„ ์„ ์ ํ•ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ํ• ๋‹น (ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค ์ผ์‹œ์ •์ง€ ์‹œํ‚ด)
      • ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ํ”„๋กœ์„ธ์Šค๋‚˜ ์ˆ˜ํ–‰ ํšŸ์ˆ˜๊ฐ€ ์ ์€ ํ”„๋กœ์„ธ์Šค ์œ„์ฃผ๋กœ ํ”„๋กœ์„ธ์Šค ์ž์› ์„ ์ 

# 0403 - Object ํด๋ž˜์Šค wait, notify, notifyAll

Java ์ตœ์ƒ์œ„ ํด๋ž˜์Šค = Object ํด๋ž˜์Šค

# Object Class๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฉ”์„œ๋“œ

  • toString()
  • hashCode()
  • wait()
    ๊ฐ–๊ณ  ์žˆ๋˜ ๊ณ ์œ  lock ํ•ด์ œ, Thread๋ฅผ ์ž ๋“ค๊ฒŒ ํ•จ
  • notify()
    ์ž ๋“ค๋˜ Thread ์ค‘ ์ž„์˜์˜ ํ•˜๋‚˜๋ฅผ ๊นจ์›€.
  • notifyAll() ์ž ๋“ค์–ด ์žˆ๋˜ Thread๋ฅผ ๋ชจ๋‘ ๊นจ์›€.

wait, notify, notifyAll : ํ˜ธ์ถœํ•˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ๊ณ ์œ  ๋ฝ์„ ๊ฐ–๊ณ  ์žˆ์–ด์•ผํ•จ.

  • Synchronized ๋ธ”๋ก ๋‚ด์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•จ.
  • ๊ทธ ๋ธ”๋ก ์•ˆ์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ IllegalMonitorStateException ๋ฐœ์ƒ.
Last update: September 13, 2022 21:44
Contributors: ahnjs , jaesungahn91