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
# ์ ์ฅ์ ๋ฏธ๋ฌ๋ง
- ๋ณต์ฌํ๊ณ ์ํ๋ ์ ์ฅ์์ bare clone ์์ฑ
git clone --bare {๋ณต์ฌํ๊ณ ์ํ๋ ์ ์ฅ์์ git ์ฃผ์}
- ์๋ก์ด ์ ์ฅ์๋ก mirror-push
cd {๋ณต์ฌํ๊ณ ์ํ๋ ์ ์ฅ์์ git ์ฃผ์}
git push --mirror {๋ถ์ฌ๋์์ ์ฅ์์ git ์ฃผ์}
- 1๋ฒ์์ ์์ฑ๋ ์ ์ฅ์ ์ญ์
# 100MB๋ฅผ ๋์ด๊ฐ๋ ํ์ผ์ ๊ฐ์ง ์ ์ฅ์ ๋ฏธ๋ฌ๋ง
- git lfs์ BFG Repo Cleaner ์ค์น
- ๋ณต์ฌํ๊ณ ์ ํ๋ ์ ์ฅ์์ bare clone ์์ฑ
git clone --mirror {๋ณต์ฌํ๊ณ ์ํ๋์ ์ฅ์์ git ์ฃผ์}
- commit history์์ large file์ ์ฐพ์ ํธ๋ํน
git filter-branch --tree-filter 'git lfs track "*.{zip,jar}"' -- --all
- 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'
- ์๋ก์ด ์ ์ฅ์๋ก mirror-push
cd {๋ณต์ฌํ๊ณ ์ํ๋์ ์ฅ์์ git ์ฃผ์}
git push --mirror {๋ถ์ฌ๋์์ ์ฅ์์ git wnth}
- 1๋ฒ์์ ์์ฑ๋ ์ ์ฅ์ ์ญ์
# 0401 - ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฆฌ
์น ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ HTTP ์์ฒญ์ ๋ฐ๊ณ HTTP ์๋ต์ ๋ง๋๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋๊ฒ
์ด์ ์ ์ธ์งํ๊ณ ๊ฐ๋ฐํ๋๊ฒ ์ค์ => ์น ๊ธฐ์ ๋น ๋ฅด๊ฒ ํ์ ๊ฐ๋ฅ
# HTTP ์์ฒญ
- URI
- METHOD
- HEADER
- BODY
์คํ๋ง์ HTTP ์์ฒญ์ ํตํด ๋๊ฐ์ง ์์ ์ ํ๋ค.
- ์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋ ์์ - Mapping
- ์ปจํธ๋กค๋ฌ ๋ฉ์๋์ ์์ฒญ ์ ๋ณด๋ฅผ ์ด๋ค ์์ผ๋ก ์ ๋ฌํ ๊น๋ฅผ ๊ฒฐ์ ํ๋ ์์
@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๊ฐ์ง ๋ชจ๋ ์ฑ๋ฆฝํด์ผ ๋ฐ๋๋ฝ ๋ฐ์(ํ๋๋ผ๋ ์ฑ๋ฆฝํ์ง ์์ผ๋ฉด ๋ฐ๋๋ฝ ๋ฌธ์ ํด๊ฒฐ ๊ฐ๋ฅ)
- ์ํธ ๋ฐฐ์ (Mutual exclusion)
- ์์์ ํ ํ๋ก์ธ์ค๋ง ์ฌ์ฉํ ์ ์์
- ์ ์ ๋๊ธฐ(Hold and wait)
- ์ต์ํ ํ๋์ ์์์ ์ ์ ํ๊ณ ์์ผ๋ฉด์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ํ ๋น๋์ด ์ฌ์ฉํ๊ณ ์๋ ์์์ ์ถ๊ฐ๋ก ์ ์ ํ๊ธฐ ์ํด ๋๊ธฐํ๋ ํ๋ก์ธ์ค๊ฐ ์กด์ฌํด์ผ ํจ
- ๋น์ ์ (No preemption)
- ๋ค๋ฅธ ํ๋ก์ธ์ค์ ํ ๋น๋ ์์์ ์ฌ์ฉ์ด ๋๋ ๋๊น์ง ๊ฐ์ ๋ก ๋นผ์์ ์ ์์
- ์ํ ๋๊ธฐ(Circular wait)
- ํ๋ก์ธ์ค ์งํฉ์์ ์ํ ํํ๋ก ์์์ ๋๊ธฐํ๊ณ ์์ด์ผ ํจ
# ๋ฐ๋๋ฝ ์ฒ๋ฆฌ
- ๊ต์ฐฉ ์ํ๋ฅผ ์๋ฐฉ & ํํผ
- ์๋ฐฉ(prevention)
๊ต์ฐฉ ์ํ ๋ฐ์ ์กฐ๊ฑด ์ค ํ๋๋ฅผ ์ ๊ฑฐํ๋ฉด์ ํด๊ฒฐํ๋ค (์์ ๋ญ๋น ์์ฒญ ์ฌํจ)- ์ํธ๋ฐฐ์ ๋ถ์ : ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ์์ ์ฌ์ฉ
- ์ ์ ๋๊ธฐ ๋ถ์ : ํ๋ก์ธ์ค ์คํ์ ๋ชจ๋ ์์์ ํ ๋น
- ๋น์ ์ ๋ถ์ : ์์ ์ ์ ์ค์ธ ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ์์์ ์๊ตฌํ ๋ ๊ฐ์ง ์์ ๋ฐ๋ฉ
- ์ํ๋๊ธฐ ๋ถ์ : ์์์ ๊ณ ์ ๋ฒํธ ํ ๋น ํ ์์๋๋ก ์์ ์๊ตฌ
- ํํผ(avoidance)
๊ต์ฐฉ ์ํ ๋ฐ์ ์ ํผํด๋๊ฐ๋ ๋ฐฉ๋ฒ
์ํ์ ์๊ณ ๋ฆฌ์ฆ(Banker's Algorithm)- ์ํ์์ ๋ชจ๋ ๊ณ ๊ฐ์ ์๊ตฌ๊ฐ ์ถฉ์กฑ๋๋๋ก ํ๊ธ์ ํ ๋นํ๋๋ฐ์ ์ ๋ํจ
- ํ๋ก์ธ์ค๊ฐ ์์์ ์๊ตฌํ ๋, ์์คํ ์ ์์์ ํ ๋นํ ํ์๋ ์์ ์ํ๋ก ๋จ์์๊ฒ ๋๋์ง ์ฌ์ ์ ๊ฒ์ฌํ์ฌ ๊ต์ฐฉ์ํ ํํผ
- ์์ ์ํ๋ฉด ์์ ํ ๋น, ์๋๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ด ์์ ํด์ง๊น์ง ๋๊ธฐ
- ๊ต์ฐฉ ์ํ๋ฅผ ํ์ง & ํ๋ณต
๊ต์ฐฉ ์ํ๊ฐ ๋๋๋ก ํ์ฉํ ๋ค์ ํ๋ณต์ํค๋ ๋ฐฉ๋ฒ
- ํ์ง(Detection)
์์ ํ ๋น ๊ทธ๋ํ๋ฅผ ํตํด ๊ต์ฐฉ ์ํ๋ฅผ ํ์งํจ
์์ ์์ฒญ ์, ํ์ง ์๊ณ ๋ฆฌ์ฆ์ ์คํ์์ผ ๊ทธ์ ๋ํ ์ค๋ฒํค๋ ๋ฐ์ํจ - ํ๋ณต(Recovery)
๊ต์ฐฉ ์ํ ์ผ์ผํจ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๊ฑฐ๋, ํ ๋น๋ ์์์ ํด์ ์์ผ ํ๋ณต์ํค๋ ๋ฐฉ๋ฒ- ํ๋ก์ธ์ค ์ข
๋ฃ ๋ฐฉ๋ฒ
- ๊ต์ฐฉ ์ํ์ ํ๋ก์ธ์ค๋ฅผ ๋ชจ๋ ์ค์ง
- ๊ต์ฐฉ ์ํ๊ฐ ์ ๊ฑฐ๋ ๋๊น์ง ํ๋์ฉ ํ๋ก์ธ์ค ์ค์ง
- ์์ ์ ์ ๋ฐฉ๋ฒ
- ๊ต์ฐฉ ์ํ์ ํ๋ก์ธ์ค๊ฐ ์ ์ ํ๊ณ ์๋ ์์์ ์ ์ ํด ๋ค๋ฅธ ํ๋ก์ธ์ค์๊ฒ ํ ๋น (ํด๋น ํ๋ก์ธ์ค ์ผ์์ ์ง ์ํด)
- ์ฐ์ ์์๊ฐ ๋ฎ์ ํ๋ก์ธ์ค๋ ์ํ ํ์๊ฐ ์ ์ ํ๋ก์ธ์ค ์์ฃผ๋ก ํ๋ก์ธ์ค ์์ ์ ์
- ํ๋ก์ธ์ค ์ข
๋ฃ ๋ฐฉ๋ฒ
# 0403 - Object ํด๋์ค wait, notify, notifyAll
Java ์ต์์ ํด๋์ค = Object ํด๋์ค
# Object Class๊ฐ ๊ฐ๊ณ ์๋ ๋ฉ์๋
- toString()
- hashCode()
- wait()
๊ฐ๊ณ ์๋ ๊ณ ์ lock ํด์ , Thread๋ฅผ ์ ๋ค๊ฒ ํจ - notify()
์ ๋ค๋ Thread ์ค ์์์ ํ๋๋ฅผ ๊นจ์. - notifyAll() ์ ๋ค์ด ์๋ Thread๋ฅผ ๋ชจ๋ ๊นจ์.
wait, notify, notifyAll : ํธ์ถํ๋ ์ค๋ ๋๊ฐ ๋ฐ๋์ ๊ณ ์ ๋ฝ์ ๊ฐ๊ณ ์์ด์ผํจ.
- Synchronized ๋ธ๋ก ๋ด์์ ์คํ๋์ด์ผ ํจ.
- ๊ทธ ๋ธ๋ก ์์์ ํธ์ถํ๋ ๊ฒฝ์ฐ IllegalMonitorStateException ๋ฐ์.