๊ตฌํ˜„, ํ™•์žฅ: VTB์—์„œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜

์šฐ๋ฆฌ ๋ถ€์„œ๋Š” ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ์ถœ์‹œํ•˜๊ธฐ ์œ„ํ•œ ์™„์ „ ์ž๋™ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ž๋™ํ™”๋œ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ปท์—๋Š” ๋กœ์ปฌ ๋จธ์‹ ์˜ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ…Œ์ŠคํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ GitLab ํŽ˜์ด์ง€์˜ Allure ๋ณด๊ณ ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์˜ Selenoid์—์„œ ์‹คํ–‰๋˜๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์ž๋™ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ตญ ๋ฉ‹์ง„ ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ์–ป์€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์˜ ์‚ฌ๋žŒ๋“ค์€ ํŒ€์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„, ํ™•์žฅ: VTB์—์„œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜

์šฐ๋ฆฌ๋Š” ์–ด๋””์„œ ์‹œ์ž‘ํ–ˆ๋‚˜์š”?

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

  • ์ž๋ฐ”,
  • ๋ฉ”์ด๋ธ,
  • ์…€๋ Œ,
  • ์˜ค์ด+4์›” XNUMX์ผ,
  • ๋งค๋ ฅ,
  • ๊นƒ๋žฉ.

๊ตฌํ˜„, ํ™•์žฅ: VTB์—์„œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜

์™œ ์ด ํŠน๋ณ„ํ•œ ์„ธํŠธ์ธ๊ฐ€์š”? Java๋Š” ์ž๋™ํ™” ํ…Œ์ŠคํŠธ์— ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ๋ชจ๋“  ํŒ€์›์ด Java๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์…€๋ ˆ๋Š„์€ ํ™•์‹คํ•œ ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค๋„ ์˜ค์ด๋Š” ์ˆ˜๋™ ํ…Œ์ŠคํŠธ์— ์ฐธ์—ฌํ•˜๋Š” ๋ถ€์„œ์˜ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์‹ ๋ขฐ๋„๋ฅผ ๋†’์ด๊ธฐ๋กœ ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ…Œ์ŠคํŠธ

๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” GitHub์˜ ๋‹ค์–‘ํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๊ฐœ๋ฐœํ•œ ๋‚ด์šฉ์„ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ธฐ์ดˆ๋กœ ์‚ผ์•„ ์Šค์Šค๋กœ ์กฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ž๋™ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•ต์‹ฌ์ด ํฌํ•จ๋œ ๋ฉ”์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์šฉ ์ €์žฅ์†Œ์™€ ์ฝ”์–ด์— ์ž๋™ ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” Gold ์˜ˆ์ œ๊ฐ€ ํฌํ•จ๋œ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํŒ€์€ ๊ณจ๋“œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์ด๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑํ•œ GitLab-CI ์€ํ–‰์— ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  ์„œ๋ฉด ์ž๋™ ํ…Œ์ŠคํŠธ๋ฅผ ๋งค์ผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฑฐ์˜ ์—†์—ˆ๊ณ  ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Windows ์‹คํ–‰๊ธฐ GitLab์—์„œ ์‹คํ–‰๋˜๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋งค์šฐ ์ ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์—์„œ๋Š” ํ…Œ์ŠคํŠธ ๋ฒค์น˜๋ฅผ ๋งค์šฐ ๊ฐ€๋ณ๊ฒŒ ๋กœ๋“œํ•˜๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ž๋™ ํ…Œ์ŠคํŠธ ์ˆ˜๊ฐ€ ์ ์  ๋” ๋งŽ์•„์กŒ๊ณ  ์ „์ฒด ์‹คํ–‰์— ์•ฝ XNUMX์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ์šฐ๋ฆฌ๋Š” ๋ณ‘๋ ฌ ์‹คํ–‰์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฌธ์ œ๋„ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

  • ํ…Œ์ŠคํŠธ๊ฐ€ ์•ˆ์ •์ ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์—ฐ์†์œผ๋กœ ์‹คํ–‰๋œ ํ…Œ์ŠคํŠธ๊ฐ€ CI์—์„œ ์ถฉ๋Œํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ž๋™ ํ…Œ์ŠคํŠธ ์„ค์ •์˜ ์˜ˆ:

<plugins>
	
<plugin>
    	
<groupId>org.apache.maven.plugins</groupId>
    	
<artifactId>maven-surefire-plugin</artifactId>
    	
<version>2.20</version>
    	
<configuration>
        	
<skipTests>${skipTests}</skipTests>
        	
<testFailureIgnore>false</testFailureIgnore>
        	
<argLine>
            	
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
            	
-Dcucumber.options="--tags ${TAGS} --plugin io.qameta.allure.cucumber2jvm.AllureCucumber2Jvm --plugin pretty"
        	
</argLine>
    	
</configuration>
	
    <dependencies>
        	
<dependency>
            	
<groupId>org.aspectj</groupId>
            	
<artifactId>aspectjweaver</artifactId>
            	
<version>${aspectj.version}</version>
        	
</dependency>
    	
</dependencies>
	
</plugin>
	
<plugin>
    	
<groupId>io.qameta.allure</groupId>
    	
<artifactId>allure-maven</artifactId>
    	
<version>2.9</version>
	
</plugin>
</plugins>

 ๊ตฌํ˜„, ํ™•์žฅ: VTB์—์„œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜
์–ผ๋ฃจ์–ด ๋ฆฌํฌํŠธ ์˜ˆ์‹œ

 ๊ตฌํ˜„, ํ™•์žฅ: VTB์—์„œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜
ํ…Œ์ŠคํŠธ ์ค‘ ๋Ÿฌ๋„ˆ ๋กœ๋“œ(8๊ฐœ ์ฝ”์–ด, 8GB RAM, 1๊ฐœ ์Šค๋ ˆ๋“œ)
 
๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ…Œ์ŠคํŠธ์˜ ์žฅ์ :

  • ์„ค์ • ๋ฐ ์‹คํ–‰์ด ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • CI ์ถœ์‹œ๋Š” ์‚ฌ์‹ค์ƒ ๋กœ์ปฌ ์ถœ์‹œ์™€ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ๋Š” ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋Ÿฌ๋„ˆ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ตœ์†Œ ์š”๊ตฌ ์‚ฌํ•ญ.

๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ…Œ์ŠคํŠธ์˜ ๋‹จ์ :

  • ์™„๋ฃŒํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋งค์šฐ ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ์˜ ์žฅ๊ธฐ๊ฐ„ ์•ˆ์ •ํ™”;
  • ๋Ÿฌ๋„ˆ ๋ฆฌ์†Œ์Šค์˜ ๋น„ํšจ์œจ์  ์‚ฌ์šฉ, ๊ทน๋„๋กœ ๋‚ฎ์€ ํ™œ์šฉ๋„.

JVM ํฌํฌ ํ…Œ์ŠคํŠธ

๊ธฐ๋ณธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ค์ด-jvm-๋ณ‘๋ ฌ-ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฉ”์ด๋ธ์˜ ๊ฒฝ์šฐ. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ตฌ์„ฑํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅธ ๋ณ‘๋ ฌ ์ž‘๋™์„ ์œ„ํ•ด์„œ๋Š” ๋ณ„๋„์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋™ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ• ๊ฒŒ ์—†์–ด์„œ ์…€๋ ˆ๋…ธ์ด๋“œ๋ฅผ ์จ์•ผ๋งŒ ํ–ˆ์–ด์š”.

Selenoid ์„œ๋ฒ„๋Š” 32๊ฐœ ์ฝ”์–ด์™€ 24GB RAM์„ ๊ฐ–์ถ˜ ์‹œ์Šคํ…œ์—์„œ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œํ•œ์€ 48๊ฐœ ๋ธŒ๋ผ์šฐ์ €(์ฝ”์–ด๋‹น 1,5๊ฐœ ์Šค๋ ˆ๋“œ, ์•ฝ 400MB RAM)๋กœ ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„์ด 40์‹œ๊ฐ„์—์„œ 20๋ถ„์œผ๋กœ ๋‹จ์ถ•๋๋‹ค. ์‹คํ–‰ ์†๋„๋ฅผ ๋†’์ด๋ฉด ์•ˆ์ •ํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์•ˆ์ •์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ํ™•์‹ ์ด ๋“ค ๋•Œ๊นŒ์ง€ ์ƒˆ๋กœ์šด ์ž๋™ ํ…Œ์ŠคํŠธ๋ฅผ 30~XNUMXํšŒ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์†”๋ฃจ์…˜์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ์ ์€ ์ ์€ ์ˆ˜์˜ ๋ณ‘๋ ฌ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰๊ธฐ ๋ฆฌ์†Œ์Šค์˜ ํ™œ์šฉ๋„๊ฐ€ ๋†’๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, 4๊ฐœ ์ฝ”์–ด์™€ 8GB RAM์—์„œ ํ…Œ์ŠคํŠธ๋Š” 6๊ฐœ ์ดํ•˜์˜ ์Šค๋ ˆ๋“œ์—์„œ ์•ˆ์ •์ ์œผ๋กœ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋‹จ์ : ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์‹คํ–‰๋˜๋Š” ์ˆ˜์— ๊ด€๊ณ„์—†์ด ๊ฐ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด ์‹คํ–‰๊ธฐ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”! ํƒœ๊ทธ๊ฐ€ ํฌํ•จ๋œ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์ง€ ๋งˆ์„ธ์š”. ์ธ์ˆ˜๋ผ์ธ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<argLine>-Dcucumber.options="--tags ${TAGS} --plugin io.qameta.allure.cucumber2jvm.AllureCucumber2Jvm --plugin pretty"</argLine>
โ€ฆ
Mvn โ€“DTAGS="@smoke"

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํƒœ๊ทธ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋ชจ๋“  ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์‹คํ–‰๊ธฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์‹คํ–‰ ํ›„ ์ฆ‰์‹œ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋งŽ์€ JVM ํฌํฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋˜์ง€๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค. ํƒœ๊ทธ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ •์—์„œ ์•„๋ž˜ ์˜ˆ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ํ…Œ์ŠคํŠธํ•œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์—์„œ๋Š” Allure ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ์„ค์ •์œผ๋กœ 6๋ฒˆ์˜ ์งง์€ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ๊ฐ„์˜ ์˜ˆ:

[INFO] Total time: 03:17 min

ํƒœ๊ทธ๋ฅผ ์ง์ ‘ ์ „์†กํ•˜๋Š” ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ๊ฐ„์˜ ์˜ˆ mvn... โ€“Dcucumber.options:

[INFO] Total time: 44.467 s

์ž๋™ ํ…Œ์ŠคํŠธ ์„ค์ •์˜ ์˜ˆ:

<profiles>
	
<profile>
    	
<id>parallel</id>
    	
<build>
        	
<plugins>
            	
<plugin>
                	
<groupId>com.github.temyers</groupId>
                	
<artifactId>cucumber-jvm-parallel-plugin</artifactId>
                	
<version>5.0.0</version>
                	
<executions>
                    	
<execution>
                        	
<id>generateRunners</id>
                        	
<phase>generate-test-sources</phase>
                        	
<goals>
                            	
<goal>generateRunners</goal>
                        	
</goals>
                        	
<configuration>
                	
            <tags>
                            	
<tag>${TAGS}</tag>
                            	
</tags>
                            	
<glue>
                                	
<package>stepdefs</package>
                            	
</glue>
                        	
</configuration>
     	
               </execution>
                	
</executions>
    	
        </plugin>
            	
<plugin>
                	
<groupId>org.apache.maven.plugins</groupId>
                	
<artifactId>maven-surefire-plugin</artifactId>
        	
        <version>2.21.0</version>
                	
<configuration>
                    	
<forkCount>12</forkCount>
                    	
<reuseForks>false</reuseForks>
                    	
<includes>**/*IT.class</includes>
                   	
 <testFailureIgnore>false</testFailureIgnore>
                    	
<!--suppress UnresolvedMavenProperty -->
                    	
<argLine>
  	
 -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" -Dcucumber.options="--plugin io.qameta.allure.cucumber2jvm.AllureCucumber2Jvm TagPFAllureReporter --plugin pretty"
                    	
</argLine>
                	
</configuration>
                	
<dependencies>
                    	
<dependency>
                        	
<groupId>org.aspectj</groupId>
                        	
<artifactId>aspectjweaver</artifactId>
                        	
<version>${aspectj.version}</version>
                 	
   </dependency>
                	
</dependencies>
         	
   </plugin>
        	
</plugins>
    	
</build>
	
</profile>

๊ตฌํ˜„, ํ™•์žฅ: VTB์—์„œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜
Allure ๋ณด๊ณ ์„œ์˜ ์˜ˆ(๊ฐ€์žฅ ๋ถˆ์•ˆ์ •ํ•œ ํ…Œ์ŠคํŠธ, 4ํšŒ ์žฌ์‹คํ–‰)

๊ตฌํ˜„, ํ™•์žฅ: VTB์—์„œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜ํ…Œ์ŠคํŠธ ์ค‘ ๋Ÿฌ๋„ˆ ๋กœ๋“œ(8๊ฐœ ์ฝ”์–ด, 8GB RAM, 12๊ฐœ ์Šค๋ ˆ๋“œ)
 
์žฅ์  :

  • ์‰ฌ์šด ์„ค์ • - ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์ˆ˜์˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜๋Š” ๋Šฅ๋ ฅ;
  • 1๋‹จ๊ณ„ ๋•๋ถ„์— ํ…Œ์ŠคํŠธ ์•ˆ์ •ํ™”๊ฐ€ ๊ฐ€์†ํ™”๋ฉ๋‹ˆ๋‹ค. 

๋‹จ์  :

  • ์—ฌ๋Ÿฌ OS/์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ํฌํฌ์— ๋Œ€ํ•œ ๋†’์€ ๋ฆฌ์†Œ์Šค ์†Œ๋น„;
  • ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์˜ค๋ž˜๋˜์–ด ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

๋ถˆ์•ˆ์ •์„ฑ์„ ๊ทน๋ณตํ•˜๋Š” ๋ฐฉ๋ฒ• 

ํ…Œ์ŠคํŠธ ๋ฒค์น˜๋Š” ์ž๋™ ํ…Œ์ŠคํŠธ ์ž์ฒด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถˆ์•ˆ์ •ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋งŽ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ตฌ์กฐํ•˜๋Ÿฌ ์™”์–ด์š” ๋ฉ”์ด๋ธ ํ™•์‹คํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ, ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ ๋‹ค์‹œ ์‹œ์ž‘์„ ์ฆ‰์‹œ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฒ„์ „์„ 2.21 ์ด์ƒ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  pom ํŒŒ์ผ์— ์žฌ์‹œ์ž‘ ํšŸ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ํ•œ ์ค„์„ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ Maven์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ ํ…Œ์ŠคํŠธ ์„ค์ •์˜ ์˜ˆ:

   	
<plugin>
        	
<groupId>org.apache.maven.plugins</groupId>
  	
      <artifactId>maven-surefire-plugin</artifactId>
        	
<version>2.21.0</version>
        	
<configuration>
           	
โ€ฆ.
            	
<rerunFailingTestsCount>2</rerunFailingTestsCount>
            	
โ€ฆ.
            	
</configuration>
</plugin>

๋˜๋Š” ์‹œ์ž‘ ์‹œ: mvn โ€ฆ -Dsurefire.rerunFailingTestsCount=2 โ€ฆ
์˜ต์…˜์œผ๋กœ PowerShell ์Šคํฌ๋ฆฝํŠธ(PS1)์— ๋Œ€ํ•œ Maven ์˜ต์…˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  
Set-Item Env:MAVEN_OPTS "-Dfile.encoding=UTF-8 -Dsurefire.rerunFailingTestsCount=2"

์žฅ์  :

  • ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ถˆ์•ˆ์ •ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ๋ฒค์น˜ ์•ˆ์ •์„ฑ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์  :

  • ๋ถ€๋™ ๊ฒฐํ•จ์„ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹คํ–‰ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.

Cucumber 4 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ๋ณ‘๋ ฌ ํ…Œ์ŠคํŠธ

ํ…Œ์ŠคํŠธ ํšŸ์ˆ˜๋Š” ๋งค์ผ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‹คํ–‰ ์†๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋‹ค์‹œ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์–ด์…ˆ๋ธ”๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์š”์ธ์€ Maven ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ๋•Œ ๋Ÿฌ๋„ˆ ์ƒ์„ฑ์— ๋„ˆ๋ฌด ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹œ Cucumber 4๊ฐ€ ์ด๋ฏธ ์ถœ์‹œ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์ด ๋ฒ„์ „์— ๋งž๊ฒŒ ์ปค๋„์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ์—์„œ ์šฐ๋ฆฌ๋Š” ์Šค๋ ˆ๋“œ ์ˆ˜์ค€์—์„œ ๋ณ‘๋ ฌ ์‹คํ–‰์„ ์•ฝ์†ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ ๋Š˜๋ ค ์ž๋™ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์†๋„๋ฅผ ํฌ๊ฒŒ ๋†’์ž…๋‹ˆ๋‹ค.
  • ๊ฐ ์ž๋™ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ๋Ÿฌ๋„ˆ ์ƒ์„ฑ์— ๋”ฐ๋ฅธ ์‹œ๊ฐ„ ์†์‹ค์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์ž๋™ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. Cucumber 4๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ „์šฉ ์Šค๋ ˆ๋“œ์—์„œ ๊ฐ ๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ์ผ๋ถ€ ์ผ๋ฐ˜์ ์ธ ์ •์  ํ•ญ๋ชฉ์€ ๋‹จ์ˆœํžˆ ThreadLocal ๋ณ€์ˆ˜๋กœ ๋ณ€ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 
Idea ๋ฆฌํŒฉํ† ๋ง ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€ํ™˜ํ•  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ณ€์ˆ˜๊ฐ€ ๋น„๊ต๋œ ์œ„์น˜๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: null ํ™•์ธ). ๋˜ํ•œ Junit Runner ํด๋ž˜์Šค ์ฃผ์„์— Allure ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ ํ…Œ์ŠคํŠธ ์„ค์ •์˜ ์˜ˆ:

 
<profile>
	
<id>parallel</id>
	
<build>
    	
<plugins>
        	
<plugin>
            	
<groupId>org.apache.maven.plugins</groupId>
 	
           <artifactId>maven-surefire-plugin</artifactId>
            	
<version>3.0.0-M3</version>
   	
         <configuration>
                	
<useFile>false</useFile>
                	
<testFailureIgnore>false</testFailureIgnore>
        	
        <parallel>methods</parallel>
                	
<threadCount>6</threadCount>
                	
<perCoreThreadCount>true</perCoreThreadCount>
                	
<argLine>
                    	
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
                	
</argLine>
            	
</configuration>
            	
<dependencies>
                	
<dependency>
                    	
<groupId>org.aspectj</groupId>
   	
                 <artifactId>aspectjweaver</artifactId>
                    	
<version>${aspectj.version}</version>
                	
</dependency>
            	
</dependencies>
        	
</plugin>
    	
</plugins>
	
</build>
</profile>

๊ตฌํ˜„, ํ™•์žฅ: VTB์—์„œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜Allure ๋ณด๊ณ ์„œ์˜ ์˜ˆ(๊ฐ€์žฅ ๋ถˆ์•ˆ์ •ํ•œ ํ…Œ์ŠคํŠธ, 5ํšŒ ์žฌ์‹คํ–‰)

๊ตฌํ˜„, ํ™•์žฅ: VTB์—์„œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜ํ…Œ์ŠคํŠธ ์ค‘ ๋Ÿฌ๋„ˆ ๋กœ๋“œ(8๊ฐœ ์ฝ”์–ด, 8GB RAM, 24๊ฐœ ์Šค๋ ˆ๋“œ)

์žฅ์  :

  • ๋‚ฎ์€ ์ž์› ์†Œ๋น„;
  • Cucumber์˜ ๊ธฐ๋ณธ ์ง€์› - ์ถ”๊ฐ€ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด๋‹น 6๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์  :

  • ์ฝ”๋“œ๊ฐ€ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์‹คํ–‰์„ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ง„์ž… ๋ฌธํ„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

GitLab ํŽ˜์ด์ง€์˜ Allure ๋ณด๊ณ ์„œ

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์‹คํ–‰์„ ๋„์ž…ํ•œ ํ›„ ๋ณด๊ณ ์„œ ๋ถ„์„์— ํ›จ์”ฌ ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ ์šฐ๋ฆฌ๋Š” ๊ฐ ๋ณด๊ณ ์„œ๋ฅผ GitLab์— ์•„ํ‹ฐํŒฉํŠธ๋กœ ์—…๋กœ๋“œํ•œ ๋‹ค์Œ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์••์ถ•์„ ํ’€์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋กœ ํŽธ๋ฆฌํ•˜์ง€๋„ ์•Š๊ณ  ์‹œ๊ฐ„๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ง์ ‘ ๋ณด๊ณ ์„œ๋ฅผ ๋ณด๋ ค๋ฉด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋” ๋นจ๋ฆฌ ๋ฐ›๊ณ  ์‹ถ์—ˆ๊ณ , GitLab ํŽ˜์ด์ง€๋ผ๋Š” ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” GitLab์˜ ๋ชจ๋“  ์ตœ์‹  ๋ฒ„์ „์—์„œ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„์— ์ •์  ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์ง์ ‘ ๋งํฌ๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Allure ๋ณด๊ณ ์„œ์˜ ๋ชจ๋“  ์Šคํฌ๋ฆฐ์ƒท์€ GitLab ํŽ˜์ด์ง€์—์„œ ์ดฌ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณด๊ณ ์„œ๋ฅผ GitLab ํŽ˜์ด์ง€์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ - Windows PowerShell์—์„œ(์ด์ „์— ์ž๋™ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•จ):

New-Item -ItemType directory -Path $testresulthistory | Out-Null

try {Invoke-WebRequest -Uri $hst -OutFile $outputhst}
Catch{echo "fail copy history"}
try {Invoke-WebRequest -Uri $hsttrend -OutFile $outputhsttrnd}
Catch{echo "fail copy history trend"}

mvn allure:report
#mvn assembly:single -PzipAllureReport
xcopy $buildlocationtargetsiteallure-maven-plugin* $buildlocationpublic /s /i /Y

๊ฒฐ๊ณผ์™€์˜ 

๋”ฐ๋ผ์„œ Cucumber ์ž๋™ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์— ์Šค๋ ˆ๋“œ ์•ˆ์ „ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด ์ด์ œ ๋‹ต์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. Cucumber 4๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์‰ฌ์›Œ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์Šค๋ ˆ๋“œ ์ˆ˜๊ฐ€ ํฌ๊ฒŒ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. ์ด ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ œ ์…€๋ ˆ๋…ธ์ด๋“œ์™€ ํ…Œ์ŠคํŠธ ๋ฒค์น˜๋ฅผ ๊ฐ–์ถ˜ ๊ธฐ๊ณ„์˜ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด ์ƒ๊น๋‹ˆ๋‹ค.

์‹ค์Šต์— ๋”ฐ๋ฅด๋ฉด ์Šค๋ ˆ๋“œ์—์„œ ์ž๋™ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ตœ์ƒ์˜ ์„ฑ๋Šฅ์œผ๋กœ ๋ฆฌ์†Œ์Šค ์†Œ๋น„๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋‘ ๋ฐฐ๋กœ ๋Š˜๋ ค๋„ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์œ ์‚ฌํ•œ ๊ฐ€์†์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ์— 2๊ฐœ ์ด์ƒ์˜ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉฐ 200๋ฒˆ์˜ ์žฌ์‹คํ–‰์—๋„ ์•ฝ 5๋ถ„ ๋งŒ์— ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ณ€๊ฒฝํ•˜๊ณ  ์ ˆ์ฐจ๋ฅผ ๋‹ค์‹œ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€