Home > Backend > Java倚識 > πŸ“[Post] μžλ°”λ‹€μ‹(Java倚識) - 1

πŸ“[Post] μžλ°”λ‹€μ‹(Java倚識) - 1
Post Backend

μžλ°”λ‹€μ‹(Java倚識) 1편.

1. β€˜mainClassName’ 속성 μΆ”κ°€.

메인 클래슀의 경둜λ₯Ό μ§€μ •ν•΄μ£ΌλŠ” 속성을 μΆ”κ°€ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.
초기 μ§„μž…μ μ„ 지정해쀀닀고 μƒκ°ν•˜λ©΄ λ©λ‹ˆλ‹€.

  • application 블둝 μ•ˆμ— 메인 클래슀 이름을 μ§€μ •ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 메인 ν΄λž˜μŠ€κ°€ com.example.Main 이라고 κ°€μ •ν•©λ‹ˆλ‹€.
  • μ•„λž˜μ˜ μ½”λ“œλŠ” bundle.gradle 파일 λ‚΄λΆ€μ—μ„œ μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.
plugins {
    id 'java'
    id 'application'
}

application {
    mainClassName = 'com.example.Main' // 여기에 메인 클래슀의 경둜λ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€.
    applicationDefaultJvmArgs = [
        "-XX:+EnableDynamicAgentLoading",
        "-Djdk.instrument.traceUsage"
    ]
}

repositories {
    mavenCentral()
}

dependencies {
    // Your dependencies here
}

메인 클래슀 μ˜ˆμ‹œ

  • 예λ₯Ό λ“€μ–΄, 메인 ν΄λž˜μŠ€λŠ” λ‹€μŒκ³Ό 같이 생겼을 수 μžˆμŠ΅λ‹ˆλ‹€.
package com.example;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

2. @ExtendWith μ–΄λ…Έν…Œμ΄μ…˜.

  • @ExtendWith μ–΄λ…Έν…Œμ΄μ…˜μ€ Junit 5μ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯으둜, ν…ŒμŠ€νŠΈ ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œμ— ν™•μž₯ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€.
  • JUnit 5의 ν™•μž₯ λͺ¨λΈμ€ λ‹€μ–‘ν•œ ν™•μž₯ κΈ°λŠ₯을 톡해 ν…ŒμŠ€νŠΈ μ‹€ν–‰μ˜ νŠΉμ • μ§€μ μ—μ„œ μ‚¬μš©μž μ •μ˜ λ™μž‘μ„ μˆ˜ν–‰ν•  수 있게 ν•©λ‹ˆλ‹€.

@ExtendWith μ–΄λ…Έν…Œμ΄μ…˜μ˜ μ—­ν• 

  1. ν™•μž₯ 클래슀 지정 : @ExtendWith μ–΄λ…Έν…Œμ΄μ…˜μ€ ν™•μž₯ 클래슀λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. μ§€μ •λœ ν™•μž₯ ν΄λž˜μŠ€λŠ” ν…ŒμŠ€νŠΈ λΌμ΄ν”„μ‚¬μ΄ν΄μ˜ νŠΉμ • μ§€μ μ—μ„œ ν˜ΈμΆœλ©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, ν…ŒμŠ€νŠΈ μ‹€ν–‰ μ „ν›„, 각 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ μ „ν›„ λ“± λ‹€μ–‘ν•œ μ‹œμ μ—μ„œ νŠΉμ • λ™μž‘μ„ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. μ»¨ν…μŠ€νŠΈ μ„€μ • 및 μ£Όμž… : ν™•μž₯ κΈ°λŠ₯을 톡해 ν…ŒμŠ€νŠΈ μ»¨ν…μŠ€νŠΈλ₯Ό μ„€μ •ν•˜κ³ , ν…ŒμŠ€νŠΈ λ©”μ„œλ“œμ— ν•„μš”ν•œ κ°μ²΄λ‚˜ λ¦¬μ†ŒμŠ€λ₯Ό μ£Όμž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 더 κ°„κ²°ν•˜κ³  λͺ¨λ“ˆν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  3. 쑰건뢀 μ‹€ν–‰ : νŠΉμ • 쑰건에 따라 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•˜κ±°λ‚˜ κ±΄λ„ˆλ›Έ 수 μžˆλ„λ‘ μ§€μ›ν•©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, νŠΉμ • ν™˜κ²½ μ„€μ •μ΄λ‚˜ μ‹œμŠ€ν…œ μƒνƒœμ— 따라 ν…ŒμŠ€νŠΈ μ‹€ν–‰ μ—¬λΆ€λ₯Ό κ²°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  4. μ»€μŠ€ν…€ μ–΄μ„œμ…˜ 및 보고 : ν™•μž₯을 톡해 μ‚¬μš©μž μ •μ˜ μ–΄μ„œμ…˜ λ‘œμ§μ„ μΆ”κ°€ν•˜κ±°λ‚˜ ν…ŒμŠ€νŠΈ κ²°κ³Όλ₯Ό μ»€μŠ€ν…€ λ°©μ‹μœΌλ‘œ 보고할 수 μžˆμŠ΅λ‹ˆλ‹€.

예제 μ½”λ“œ

μ•„λž˜λŠ” @ExtendWith μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•œ κ°„λ‹¨ν•œ μ˜ˆμ œμž…λ‹ˆλ‹€.

import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.Test;

class MyExtension implements BeforeEachCallback {
    @Override
    public void beforeEach(ExtensionContext context) {
        System.out.println("Before each test method");
    }
}

@ExtendWith(MyExtension.class)
public class MyTest {
    
    @Test
    void testMethod1() {
        System.out.println("Test method 1");
    }
    
    @Test
    void testMethod2() {
        System.out.println("Test method 2");
    }
}
  • μœ„ μ½”λ“œμ—μ„œ MyExtension ν΄λž˜μŠ€λŠ” BeforeEachCallback μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜μ—¬ 각 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œκ°€ μ‹€ν–‰λ˜κΈ° 전에 λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.
  • @ExtendWith(MyExtension.class) μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 MyTest ν΄λž˜μŠ€μ— 이 ν™•μž₯ κΈ°λŠ₯을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.
    • λ”°λΌμ„œ 각 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ μ‹€ν–‰ 전에 β€œBefore each test method” λ©”μ‹œμ§€κ°€ 좜λ ₯λ©λ‹ˆλ‹€.
  • 이처럼 @ExtendWith μ–΄λ…Έν…Œμ΄μ…˜μ€ JUnit 5의 ν™•μž₯ λͺ¨λΈμ„ ν™œμš©ν•˜μ—¬ ν…ŒμŠ€νŠΈμ— ν•„μš”ν•œ λ‹€μ–‘ν•œ κΈ°λŠ₯을 μΆ”κ°€ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

3. μ–΄μ„œμ…˜(Assertion)

  • μ–΄μ„œμ…˜(Assertion)은 ν”„λ‘œκ·Έλž˜λ° 및 μ†Œν”„νŠΈμ›¨μ–΄ ν…ŒμŠ€νŠΈμ—μ„œ μ½”λ“œμ˜ νŠΉμ • μƒνƒœλ‚˜ 쑰건이 참인지 ν™•μΈν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” λ¬Έμž₯μ΄λ‚˜ λͺ…령문을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • μ–΄μ„œμ…˜μ„ 톡해 μ½”λ“œμ˜ 논리적 일관성과 정확성을 검증할 수 있으며, 주둜 디버깅과 ν…ŒμŠ€νŠΈμ— μ‚¬μš©λ©λ‹ˆλ‹€.

μ£Όμš” κΈ°λŠ₯κ³Ό λͺ©μ .

  1. 쑰건 검증 : μ–΄μ„œμ…˜(Assertion)은 νŠΉμ • 쑰건이 참인지 κ²€μ¦ν•©λ‹ˆλ‹€. 쑰건이 거짓이면 ν”„λ‘œκ·Έλž¨μ€ μ¦‰μ‹œ 싀행을 μ€‘λ‹¨ν•˜κ³  였λ₯˜λ₯Ό λ³΄κ³ ν•©λ‹ˆλ‹€.

  2. 디버깅 도ꡬ : μ–΄μ„œμ…˜(Assertion)은 개발 쀑에 μ½”λ“œμ˜ 였λ₯˜λ₯Ό 쑰기에 λ°œκ²¬ν•˜κ³  μˆ˜μ •ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€. μ½”λ“œμ˜ 가정이 잘λͺ»λœ 경우 μ–΄μ„œμ…˜μ„ 톡해 문제λ₯Ό 빨리 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

  3. λ¬Έμ„œν™” : μ–΄μ„œμ…˜(Assertion)은 μ½”λ“œμ˜ 논리적 μ „μ œ 쑰건을 λͺ…μ‹œμ μœΌλ‘œ ν‘œν˜„ν•˜μ—¬, μ½”λ“œκ°€ μ–΄λ–€ μƒνƒœμ— μž‘λ™ν•΄μ•Ό ν•˜λŠ”μ§€ λͺ…ν™•ν•˜κ²Œ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

μ–΄μ„œμ…˜(Assertion)의 예

  1. μžλ°”(Java)
    public void setAge(int age) {
     assert age > 0 : "Age must be positive";
     this.age = age;
    }
    
  2. JUnit (Java)
    ```java
    import static org.junit.jupiter.api.Assertions.assertEquals;
    import org.junit.jupiter.api.Test;

public class MyTest {

@Test
void testAddition() {
    int result = 2 + 3;
    assertEquals(5, result, "2 + 3 should equal 5");
} } ```

μ–΄μ„œμ…˜ μ‚¬μš© μ‹œκΈ°

  • 개발 쀑 : κ°œλ°œμžκ°€ μ½”λ“œμ˜ 논리적 일관성을 κ²€μ¦ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€. 디버깅 κ³Όμ •μ—μ„œ 주둜 μ‚¬μš©λ˜λ©°, ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” 보톡 λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€.
  • ν…ŒμŠ€νŠΈ μ½”λ“œ : ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬(JUnit, TestNG λ“±)λ₯Ό μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•  λ•Œ, νŠΉμ • 쑰건이 κΈ°λŒ€ν•œ λŒ€λ‘œ λ™μž‘ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

주의 사항

  • ν”„λ‘œλ•μ…˜ μ½”λ“œμ—μ„œμ˜ μ‚¬μš© : μ–΄μ„œμ…˜μ€ 주둜 개발 및 ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œ μ‚¬μš©λ˜λ©°, ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” λΉ„ν™œμ„±ν™”λ˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€. ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œ 쑰건 검증이 ν•„μš”ν•œ κ²½μš°μ—λŠ” μ˜ˆμ™Έ 처리λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • λΆ€μž‘μš© μ—†λŠ” μ½”λ“œ : μ–΄μ„œμ…˜ λ‚΄λΆ€μ—μ„œλŠ” λΆ€μž‘μš©μ΄ μ—†λŠ” μ½”λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μ–΄μ„œμ…˜μ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  쑰건만 검증해야 ν•©λ‹ˆλ‹€.

μš”μ•½.

  • μ–΄μ„œμ…˜μ€ μ½”λ“œμ˜ νŠΉμ • 쑰건이 μ°Έμž„μ„ κ²€μ¦ν•˜λŠ” λ„κ΅¬λ‘œ, 디버깅과 ν…ŒμŠ€νŠΈ κ³Όμ •μ—μ„œ μ½”λ“œμ˜ 논리적 일관성을 μœ μ§€ν•˜λŠ”λ° μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 κ°œλ°œμžλŠ” μ½”λ“œμ˜ κ°€μ •κ³Ό μ‹€μ œ λ™μž‘μ΄ μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•˜κ³ , 문제λ₯Ό 쑰기에 λ°œκ²¬ν•˜μ—¬ μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.