JVM์ ์๋ฆฌ์ ๋ฐ์ดํธ์ฝ๋
by JiwonDevํด๋น ๊ธ์ https://www.inflearn.com/course/the-java-code-manipulation/ ๋ฅผ ๊ณต๋ถํ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
#1 JVM ์ฉ์ด ์ ๋ฆฌ
2021.06.30 - [๊ธฐ๋ณธ ์ง์/Java ๊ธฐ๋ณธ์ง์] - JVM(์๋ฐ๊ฐ์๋จธ์ )๊ณผ JRE, JDK
์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ JRE(์๋ฐ ๋ฐํ์ ํ๊ฒฝ)์์ ๋์ํ๋ค. JRE์๋ [JVM]๊ณผ [์๋ฐ API] ์์ญ์ผ๋ก ๋๋ ์ ์๋ค.
์ต๊ทผ ์๋ฐ ์คํ์์๋ JRE๋ฅผ ๋ณ๋๋ก ์ ๊ณตํ์ง ์๊ณ , ๊ฐ๋ฐ๋๊ตฌ์ ํจ๊ป JDK๋ก ํฌ์ฅํ์ฌ ์ ๊ณตํ๋ค.
- JVM (Java Virtual Machine)
- ๋ฐ์ดํธ์ฝ๋(.class)๋ฅผ ํด๋น OS์ ํนํ๋ ์ฝ๋๋ก ๋ณํํ๋ค. ์ธํฐํ๋ฆฌํฐ์ JIT์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ค.
- JVM์ API ์คํ๋ง ์ ๊ณตํ ๋ฟ, ํน์ ํ์ฌ๊ฐ ๋ง๋ ์ํ๋ ๊ตฌํ์ฒด(๋ฒค๋)๋ฅผ ์ ํํ ์ ์๋ค.
- JVM ํ๋ก๊ทธ๋จ์ ํน์ ํ๋ซํผ์ ์ข ์์ ์ด๋ค. ์๋ฐ๋ ๊ฐ ํ๋ซํผ์ ๋ง๋ JVM์ ์ ๊ณตํ๋ค.
- JIT ์ปดํ์ผ๋ฌ (Just In Time)
- ์๋ฐ์ ๋ฐ์ดํธ์ฝ๋๋ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์ฆ์ ์ฝ์ด๋ค์ฌ ๋์ํ๋ ๋ฐฉ์์ด๋ค.
- ์ด๋ฌํ ๋ฐฉ์์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด, ์ด๊ธฐ ์คํ์์ ์ ์์ฃผ ์ฌ์ฉ๋ ๋งํ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ๊ธฐ๊ณ์ด๋ก ํด์ํ์ฌ ์ ์ฅ(์บ์ฑ)ํด๋จ๋ค ์ฌ์ฌ์ฉํ๋๋ฐ, ์ด๋ฅผ JIT ์ปดํ์ผ ๋ฐฉ์์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. - JRE (Java Runtime Environment): JVM + ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ API
- ์๋ฐ ์ฑ์ ์คํํ ์ ์๋๋ก ๊ตฌ์ฑ๋ ๋ฐฐํฌ์ฉ ํ๋ก๊ทธ๋จ์ด๋ค.
- JVM๊ณผ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์๋ฐ ๋ฐํ์ ํ๊ฒฝ์ ์ฌ์ฉ๋๋ ์ค์ ๊ฐ๊ณผ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ๊ฐ๋ฐ๊ณผ ๊ด๋ จ๋ ๋๊ตฌ๋ ํฌํจํ์ง ์๋๋ค. (* ์ค๋ผํด11๋ถํฐ JRE๋ ๋ฐ๋ก ์ ๊ณตํด์ฃผ๊ณ ์์ง์๋ค. JDK๋ก ์ ๊ณต) - JDK (Java Development Kit)
- JRE + ์๋ฐ ์ปดํ์ผ๋ฌ, ์๋ฐ ๊ฐ๋ฐ ๋๊ตฌ
- Java ์ฝ๋๋ JDK์ ์๋ ์ปดํ์ผ๋ฌ(javac)๋ฅผ ํตํด ๋ฐํ์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํธ์ฝ๋(.class)๋ก ์ปดํ์ผ ๋๋ค.
- OpenJDK ๋ฒค๋๋ ์คํ์์ค์ด์ง๋ง [์ค๋ผํด SE]๋ ํจํค์ง๋ก ํ๋งคํด์๋ค. 2019๋ ๋ถํฐ ๊ตฌ๋ ํ ๊ฒฐ์ ๋ก ๋ณ๊ฒฝ๋จ. - JVM์ ์ ์ฐํ ์ธ์ด์ง์, Java์ Kotlin
- ์์์ ๋งํ๋ฏ์ด, ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ ์ธ์ด๋ ์๋ฐ๋ง ์๋ ๊ฒ์ด ์๋๋ค.
- ๋ํ์ ์ผ๋ก Kotlin๊ณผ Scala. ๊ทธ๋ฆฌ๊ณ ํด๋ก์ , ๊ทธ๋ฃจ๋น, JRuby, Jython(๋ค๋ฅธ ์ธ์ด๋ฅผ ๋ฐ์ดํธ์ฝ๋๋ก ์ ํ)์ด ์๋ค.
#2. JVM ๊ตฌ์กฐ
- ํด๋์ค ๋ก๋
- ๋ฐ์ดํธ์ฝ๋(.class)๋ฅผ ์ฝ๊ณ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ. ๋ฉ๋ชจ๋ฆฌ ๋ ํผ๋ฐ์ค๋ฅผ ์ฐ๊ฒฐํ๊ณ static ๊ฐ๋ค์ ์ด๊ธฐํ, ๋ณ์์ ํ ๋นํจ. - ๋ฉ๋ชจ๋ฆฌ (์คํ, PC, ๋ค์ดํฐ๋ธ, ํ, ๋ฉ์๋)
- ๋ฉ์๋ : ํด๋์ค ์์ค์ ์ ๋ณด๊ฐ ์ ์ฅ๋จ. ์ฌ๋ฌ ์ค๋ ๋์์ ๊ณต์ ํด์ ์์ฉํ๋ ์์ (ํด๋์ค ์ด๋ฆ, ๋ฉ์๋, ๋ณ์ ์ ์)
- ํ : ๊ฐ์ฒด๋ฅผ ์ ์ฅ, ์ฌ๋ฌ ์ค๋ ๋์์ ๋ ํผ๋ฐ์ค ์ฌ๋ณผ(* ํฌ์ธํฐ ์ฃผ์๊ฐ์ด ์๋)๋ก ์ ๊ทผํ ์ ์๋ ๊ณต์ ์์
- ์คํ : ์ฐ๋ ๋๋ง๋ค ๋ฐํ์ ์คํ์ ๋ง๋ฆ. ๊ทธ ์์ ๋ฉ์๋ ํธ์ถ, ์ง์ญ ๋ณ์๋ฑ์ ์คํ์ ์์์ ์ฌ์ฉ
- PC : ํ๋ก๊ทธ๋จ ์นด์ดํฐ ๋ ์ง์คํฐ์ฒ๋ผ ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ. ์ค๋ ๋๋ง๋ค ํ์ฌ ์คํํ ์คํ ํ๋ ์์ ๊ฐ๋ฅดํค๋ ํฌ์ธํฐ
- ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ : ๋ฐ์ดํธ์ฝ๋๊ฐ ์๋ ๋ค๋ฅธ์ธ์ด(C,C++) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ์ ์ฅํ๋ ๊ณต๊ฐ. (JNI ๊ธฐ์ ) - JNI (Java Native Interface)
- ์๋ฐ ์ฑ์์ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ ํจ์ (C, C++, ์ด์ ๋ธ๋ฆฌ๋ฑ)๋ฅผ ์ฌ์ฉํ ์ ์๋ ํ์ค API.
- ์๋ฐ ์ฝ๋์์ native ํค์๋๋ฅผ ์ด์ฉํ์ฌ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์ฌ์ฉํ ์์์. - ์คํ์์ง
- ์ธํฐํ๋ฆฌํฐ : ๋ฐ์ดํธ์ฝ๋๋ฅผ ํ์ค ์ฉ ์ฝ์ด๋ค์ฌ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ, ์คํํจ.
- JIT ์ปดํ์ผ๋ฌ : ์ธํฐํ๋ฆฌํฐ์ ํจ์จ์ ๋์ด๊ธฐ ์ํด ์์ฃผ์ฌ์ฉ๋๋ ์ฝ๋๋ฅผ ๋ค์ดํฐ๋ธ(๊ธฐ๊ณ์ด)๋ก ๋ณํํด์ ์ฌ์ฉ
- Garbage Collector : ๋ ์ด์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ๋ชจ์์ ์๋ฉธ์ํจ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํจ.
# JVM์ ํด๋์ค๋ก๋์ ๋์๊ณผ์
JVM์ ์ฌ๋ฌ๊ฐ์ ํด๋์ค๋ก๋๋ฅผ ๊ณ์ธต ๊ตฌ์กฐ๋ก ์ฌ์ฉํ๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก 3๊ฐ์ง ํด๋์ค ๋ก๋๊ฐ ์ ๊ณต๋๋ค.
- Bootstrap ํด๋์ค๋ก๋ : JAVA_HOME/lib์ ์๋ Core Java API๋ฅผ ์ฝ์ด๋ค์. ์ต์์ ์ฐ์ ์์
- Platform ํด๋์ค๋ก๋ : JAVA_HOME/lib/ext ๋๋ java.ext.dirs ์์คํ ๋ณ์์ ์๋ ํด๋์ค๋ฅผ ์ฝ์ด๋ค์
- App ํด๋์ค๋ก๋ : ๊ฐ๋ฐ์๊ฐ ๋ง๋ ์๋ฐ ์ฑ์ ํด๋์ค ๊ฒฝ๋ก(-classpath ๋๋ java.class.path ํ๊ฒฝ๋ณ์ ๊ฐ์ ํด๋นํ๋์์น)์ ํด๋์ค๋ค์ ์ฝ์.
์ฐธ๊ณ ๋ก ๋ชจ๋ ๊ฐ์ฒด์ ์กฐ์์ธ Object์๋ getClassLoader()๋ผ๋ ๋ฉ์๋๊ฐ ์๋ค. ์ด๋ ํด๋น ํด๋์ค๋ฅผ ์ฝ์ ํด๋์ค ๋ก๋ ๊ฐ์ฒด๋ฅผ ๋ฐํ ๋ฐ์ ์ ์๋ค. ๋ค๋ง Bootstrap ClassLoader๋ C์ธ์ด๋ก ์์ฑ๋์ด์๊ธฐ์ ํธ์ถํ๋ฉด null์ ๋ฐํํ๋ค.
* ์? ์๋ฐ์ฝ๋๋ฅผ ์ฝ๋ ํด๋์ค๋ก๋๋ ๋๊ฐ ์ฝ๊ณ ์ด๋ป๊ฒ ๊ฐ์ฒด๋ก ๋ฐ์ฃ ?? ํ๋ฉด์ ํท๊ฐ๋ฆด์๋ ์๋๋ฐ, ๊ฒฐ๊ตญ ์ปดํ์ผ๋ฌ๋ ๊ธฐ๊ณ์ด๋ก ํ๋ํ๋ ์ฐ์ด์ ๋ง๋ ๊ฒ ์๋๋ผ ๋ค๋ฅธ ์ปดํ์ผ๋ฌ๋ฅผ ์ด์ฉํด์ ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผ ๋ ํ๋ก๊ทธ๋จ์์ ๊ธฐ์ตํ์.
- ๋ก๋ฉ
- ํด๋์ค ๋ก๋๊ฐ ๋ฐ์ดํธ์ฝ๋(.class)๋ฅผ ์ฝ๊ณ ์ ์ ํ ์ด์ง ๋ฐ์ดํฐ๋ฅผ [๋ฉ์๋ ์์ญ]์ ์ ์ฅํจ.
- FQCN(Fully Qualified Class Name), ํด๋์ค, ์ธํฐํ์ด์ค, Enum, ๋ฉ์๋, ๋ณ์ ์ ๋ณด๋ฅผ ์ ์ฅํจ
- ์ด๋ ๊ฒ [๋ฉ์๋ ์์ญ]์ ์ ์ฅํ๊ณ ๋ก๋ฉ์ด ์๋ฃ๋๋ฉด ์ดํ [ํ ์์ญ]์ ํด๋น Class ๊ฐ์ฒด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฑ. - ๋งํฌ
- Verify(๊ฒ์ฆ) : ๋ฐ์ดํธ์ฝ๋(.class)๊ฐ ๋ณํ๋์ง ์๊ณ ์ ํจํ์ง ํ์ธํจ.
- Prepare(์ค๋น) : ํด๋์ค ๋ณ์(static)์ ๊ธฐ๋ณธ๊ฐ์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์.
- Resolve(์๋ฃ) : ์ฌ๋ณผ๋ฆญ ๋ ํผ๋ฐ์ค(myClass)๋ฅผ ๋ฉ์๋ ์์ญ์ ์๋ ์ค์ ๋ ํผ๋ฐ์ค(ํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์)๋ก ๊ต์ฒดํจ.
* ์ฌ๋ณผ๋ฆญ -> ์ค์ ๋ ํผ๋ฐ์ค ๊ต์ฒด๋ ๋งํฌ๊ฐ ์๋ ๋ค๋ฅธ์์ ์ ์ผ์ด๋ ์๋ ์์. - ์ด๊ธฐํ
- Static ๋ณ์์ ๊ฐ์ ํ ๋นํจ. (static block์ด ์๋ค๋ฉด ์ด ์๊ธฐ์ ์คํ๋จ)
# ์ด๋ ๊ฒ ์์ธํ๊ฒ ์ค๋ช ํ๋ ์ด์ ๊ฐ ๋ญ์ฃ ?
=> JVM์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ ์ฐํ๊ฒ ์์ฑํ ์ ์๋๋ก ์ ๊ณตํด์ค๋ค. ์ฆ ์ปดํ์ผ๋ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์กฐ์ํ์ฌ ๋ด๊ฐ ์ํ๋ ๋์์ ํ๋๋ก ๋ง๋ค ์ ์๋ค.
์ค์ ๋ก ์๋์ ๊ฐ์ด ๋ค์ํ ๋ฐ์ดํธ์ฝ๋ ์กฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์กด์ฌํ๋ค.
- CGLib (Code Generator Library)
- ASM
- Javassist
- ByteBuddy
# JaCoCo๋ ์ด๋ป๊ฒ ๋ง๋ค์์๊น?
์๋์ ๊ฐ์ ๊ฐ๋จํ ์ค์ ํ์ผ๋ก ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ฉ์ด๋ธ์ pom.xml์ ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํ๊ณ , ์ปค๋ฒ๋ฆฌ์ง ๋ง์กฑ ๋ชปํ๋ฉด ๋น๋๋ฅผ ์คํจํ๋๋ก ์ค์ .
<execution>
<id>jacoco-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>PACKAGE</element>
<limits>
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>0.50</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
์๋ฐ์ฝ๋๋ฅผ ํ๋๋ ๊ฑด๋๋ฆฌ์ง์๊ณ , jacoco๋ ์ด๋ป๊ฒ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํ์ธํ๊ณ ๋์ํ๊ฒ ๋ง๋ค ์ ์์๊น?
=> ๋ฐ์ดํธ์ฝ๋ ์กฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ๊ธฐ ๋๋ฌธ!
JaCoCo์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๋ญ์ฃ ?
# ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง(Code Coverage)๋?
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ์ํํธ์จ์ด์ ํ ์คํธ ์ผ์ด์ค๊ฐ ์ผ๋ง๋ ์ถฉ์กฑ๋์๋์ง๋ฅผ ๋ํ๋ด๋ ์งํ ์ค ํ๋.
ํ ์คํธ๋ฅผ ์งํํ์์ ๋ '์ฝ๋ ์์ฒด๊ฐ ์ผ๋ง๋ ์คํ๋์๋๊ฐ' ์ ๋ํ ์์น.
@ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ์ด๋ป๊ฒ ์ธก์ ํ ๊น?
- ๋ธ๋๋ฐ์ค ํ
์คํธ
- ์ํํธ์จ์ด์ ๋ด๋ถ ๊ตฌ์กฐ, ์๋ฆฌ๋ฅผ ๋ชจ๋ฅด๋ ์ํ์์ ๋์์ ๊ฒ์ฌํ๋ ๋ฐฉ์
- ์ฌ์ฉ์ ๊ด์ ์ ํ ์คํธ. ์ด์ํ ๊ฐ์ ์ ๋ ฅํ์ ๋ ์ฌ๋ฐ๋ฅธ ์ถ๋ ฅ์ด ๋์ค๋๊ฐ? - ํ์ดํธ๋ฐ์ค ํ
์คํธ
- ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ด๋ถ ๊ตฌ์กฐ์ ๋์์ ๊ฒ์ฌํ๋ ํ ์คํธ ๋ฐฉ์.
- ๊ฐ๋ฐ์์ ๊ด์ ์์ ์ํํธ์จ์ด ๋ด๋ถ์ ์์ค์ฝ๋๋ฅผ ํ ์คํธ
@ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ธก์ ํ๋ ๊ธฐ์ค๊ฐ์ ์ด๋ค๊ฒ์ด ์์๊น?
- ๊ตฌ๋ฌธ(Statement) ๋๋ ๋ผ์ธ(Line) ์ปค๋ฒ๋ฆฌ์ง
- ์กฐ๊ฑด์ ๋ฐ๋ฅธ ๋ก์ง(์๋๋ฆฌ์ค)๋ฅผ ํ์ธํ ์๋ ์์ง๋ง, ๋ชจ๋ ์ฝ๋๊ฐ ์คํ๋๋์ง๋ ํ์ธ ๊ฐ๋ฅํ ์งํ
// ํ
์คํธ์์ ์ ์ฒด(100%) ์ฝ๋ ์ค, ๋ช ๋ผ์ธ์ด ์คํ๋๋๊ฐ?
// 4๊ฐ์ ๋ผ์ธ์ค 3๊ฐ๊ฐ ์คํ๋ฌ๋ค๋ฉด ๊ตฌ๋ฌธ ์ปค๋ฒ๋ฆฌ์ง๋ 75% (3/4)
void foo (int x) {
system.out("start line"); // ํ
์คํธ 1๋ฒ
if (x > 0) { // ํ
์คํธ 2๋ฒ
system.out("middle line"); // ํ
์คํธ 3๋ฒ
}
system.out("last line"); // ํ
์คํธ 4๋ฒ
}
- ์กฐ๊ฑด(Condition) ์ปค๋ฒ๋ฆฌ์ง
- ์กฐ๊ฑด๋ฌธ์ ๋ด๋ถ์กฐ๊ฑด(if)๊ฐ ์ด์ํ ๊ฐ์ด ์๋ true, false๋ฅผ ๋ฐํํ๋์ง ํ์ธํ๋ ์งํ
// ๋ชจ๋ ์กฐ๊ฑด์์ ๋ด๋ถ์กฐ๊ฑด(if)์ ๋ํด ์ปจ๋์
๊ฐ์ด true ๋๋ false๋ฅผ ๋ฐํํ๋์ง ํ
์คํธ
// ๋จ, ์กฐ๊ฑด์ด ์๋ฏธ์๋ ๊ฒฝ์ฐ(๋ฌด์กฐ๊ฑด true)๋ ํ
์คํธ ์ฑ๊ณต์ผ๋ก ํ๊ธฐํ๋ค๋ ๋จ์ ์ด ์์.
void foo (int x, int y) {
system.out("start line");
if (x > 0 && y < 0) { // ํ
์คํธ. x,y ์ฌ๋ฌ๊ฐ์ ๋์
ํ๋ฉฐ true or false๊ฐ ๋์ค๋์ง ํ์ธ
system.out("middle line");
}
system.out("last line");
}
- ๊ฒฐ์ (Decision) ์ปค๋ฒ๋ฆฌ์ง ๋๋ ๋ธ๋ ์น(Branch) ์ปค๋ฒ๋ฆฌ์ง
- ํ ์คํธ์ ๋ํด์ ๋ชจ๋ ์กฐ๊ฑด์์ด true, false๋ฅผ ๋ ๋ค ๊ฐ์ ธ์ผํจ. ์ฆ ๋ก์ง์ ๋ฐ๋ผ ์คํํ๋ฆ์ด ๋ณํ๋์ง ํ์ธํ๋ ์งํ
- ๋จ ์กฐ๊ฑด๋ฌธ์ด ์์ผ๋ฉด ์์ ํ ์คํธ๋ฅผ ํ์ง ์๋๋ค๋ ๋จ์ ์ด ์์. => ๊ทธ๋์ ๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ฃผ๋ก ์ฌ์ฉ.
@ ์ด๊ฒ ์ ์ค์ํ์ฃ ?
ํ ์คํธ ์ฝ๋๋ ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ์๋๋ฆฌ์ค์ ๋ํด ์์ฑ๋์ด์ผํ๋ค. ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํตํ ํ ์คํธ์ ์์นํ๋ ๊ฐ๋ฐ์๊ฐ ๋์น ๋ก์ง์ ํ๋ฆ์ด๋ ์ฝ๋๋ฅผ ๋ณด์ํ ์ ์๊ฒ ๋ง๋ค์ด์ค๋ค.
์ค์ ํ์ ์์๋ ํ ์คํธ ์ฝ๋์ ์ค์์ฑ์ ์ธ์งํ๊ณ , ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ๋ค. ๋ํ์ ์ผ๋ก ์๋ํ๋ธ(SonarQube)์ ๊ฐ์ ์ ์ ์ฝ๋ ๋ถ์๋๊ตฌ๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๊ฐ์ด ๊ธฐ์กด๋ณด๋ค ๋จ์ด์ง๋ ๊ฒฝ์ฐ ์ปค๋ฐ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํ๊ฒ ์ ํํ ์ ์๋ค.
'๐๊ธฐ๋ณธ ์ง์ > Java ๊ธฐ๋ณธ์ง์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ์ ์์ฑ์ ๋์๋ฐฉ์ (+Innerํด๋์ค) (0) | 2021.08.22 |
---|---|
๋ฐ์ดํธ์ฝ๋ ์กฐ์(๋ฆฌํ๋ ์ , ๋ค์ด๋๋ฏน ํ๋ก์, ์ ๋ ธํ ์ด์ ํ๋ก์ธ์) (0) | 2021.08.17 |
์์ธ ์ฒ๋ฆฌ์ ๋ค์ํ ๋ฐฉ๋ฒ (0) | 2021.08.16 |
์๋ฐ์ ์ง๋ ฌํ(Serialization)๋? (0) | 2021.08.04 |
์๋ฐ ์ด๋ ธํ ์ด์ (@Annotation) (0) | 2021.08.03 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev