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

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

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

1. @AfterEach μ–΄λ…Έν…Œμ΄μ…˜.

  • @AfterEach μ–΄λ…Έν…Œμ΄μ…˜μ€ JUnit 5μ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.
  • 각 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œκ°€ μ‹€ν–‰λœ 후에 μˆ˜ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” μž‘μ—…μ„ μ§€μ •ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • 이 μ–΄λ…Έν…Œμ΄μ…˜μ€ ν…ŒμŠ€νŠΈ 클래슀 λ‚΄μ˜ λ©”μ„œλ“œμ— μ μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈ λ©”μ„œλ“œκ°€ 끄탄 ν›„ ν•„μš”ν•œ 정리 μž‘μ—…(cleanup)을 μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

μ£Όμš” μ—­ν• 

1. μžμ› ν•΄μ œ : ν…ŒμŠ€νŠΈ λ©”μ„œλ“œκ°€ μ‚¬μš©ν•œ μžμ›(예: 파일, λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²°, λ„€νŠΈμ›Œν¬ μ—°κ²° λ“±)을 ν•΄μ œν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

2. μƒνƒœ μ΄ˆκΈ°ν™” : ν…ŒμŠ€νŠΈκ°€ μ™„λ£Œλœ ν›„ μƒνƒœλ₯Ό μ΄ˆκΈ°ν™”ν•˜μ—¬ λ‹€μŒ ν…ŒμŠ€νŠΈκ°€ κΉ¨λ—ν•œ ν™˜κ²½μ—μ„œ 싀행될 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

3. 둜그 기둝 : ν…ŒμŠ€νŠΈ μ‹€ν–‰ κ²°κ³Όλ₯Ό λ‘œκ·Έμ— κΈ°λ‘ν•˜κ±°λ‚˜ 좔가적인 뢄석을 μœ„ν•΄ 데이터λ₯Ό μ €μž₯ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예제 μ½”λ“œ

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

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class MyTest {
    
    @BeforeEach
    void setUp() {
        System.out.println("Setting up before each test");
    }
    
    @Test
    void testMethod1() {
        System.out.println("Executing test method 1");
    }
    
    @Test
    void testMethod2() {
        Systemo.out.println("Executing test method 2");
    }
    
    @AfterEach
    void tearDown() {
        System.out.println("Tearing down after each test")
    }
}

μ‹€ν–‰ μˆœμ„œ

  1. setUp() : 각 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ μ‹€ν–‰ μ „ @BeforeEach λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.

  2. testMethod1() : 첫 번째 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.

  3. tearDown() : 첫 번째 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ μ‹€ν–‰ ν›„ @AfterEach λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.

  4. setUp() : 두 번째 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ μ‹€ν–‰ μ „ @BeforeEach λ©”μ„œλ“œκ°€ λ‹€μ‹œ ν˜ΈμΆœλ©λ‹ˆλ‹€.

  5. testMethod2() : 두 번째 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.

  6. tearDown() : 두 번째 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ μ‹€ν–‰ ν›„ @AfterEach λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.

μš”μ•½

  • @AfterEach μ–΄λ…Έν…Œμ΄μ…˜μ€ 각 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ μ‹€ν–‰ ν›„ ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œλ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
  • 주둜 μžμ› ν•΄μ œ, μƒνƒœ μ΄ˆκΈ°ν™”, 둜그 기둝 λ“±μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • 각 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œλ§ˆλ‹€ μ‹€ν–‰λ˜λ―€λ‘œ, ν…ŒμŠ€νŠΈ κ°„μ˜ 독립성을 μœ μ§€ν•˜κ³  κΉ¨λ—ν•œ ν…ŒμŠ€νŠΈ ν™˜κ²½μ„ 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

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

  • @Builder λŠ” Lombok λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ, λΉŒλ” νŒ¨ν„΄μ„ κ°„νŽΈν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ§€μ›ν•©λ‹ˆλ‹€.
  • λΉŒλ” νŒ¨ν„΄μ€ 객체의 생성과 κ΄€λ ¨λœ λ³΅μž‘μ„±μ„ 쀄이고, 가독성을 높이며, κ°€λ³€ 객체λ₯Ό λ§Œλ“€μ§€ μ•Šλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.
    • 특히, λ§Žμ€ ν•„λ“œλ₯Ό 가진 객체λ₯Ό 생성할 λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

μ£Όμš” νŠΉμ§• 및 μ—­ν• .

  1. μœ μ—°ν•œ 객체 생성
    • λΉŒλ” νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄ 객체λ₯Ό 생성할 λ•Œ μƒμ„±μžλ‚˜ 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œλ³΄λ‹€ 더 μœ μ—°ν•˜κ²Œ 객체λ₯Ό ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • ν•„μš”ν•œ ν•„λ“œλ§Œ μ„€μ •ν•  수 있고, μ„€μ • μˆœμ„œμ— ꡬ애받지 μ•ŠμŠ΅λ‹ˆλ‹€.
  2. 가독성 ν–₯상
    • λ§Žμ€ ν•„λ“œλ₯Ό 가진 객체λ₯Ό 생성할 λ•Œ, λΉŒλ” νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄ μ½”λ“œμ˜ 가독성이 λ†’μ•„μ§‘λ‹ˆλ‹€.
    • 각 ν•„λ“œμ˜ 이름을 λͺ…μ‹œμ μœΌλ‘œ μ„€μ •ν•  수 μžˆμ–΄ μ–΄λ–€ 값이 μ–΄λ–€ ν•„λ“œμ— μ„€μ •λ˜λŠ”μ§€ μ‰½κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  3. λΆˆλ³€ 객체 생성
    • λΉŒλ” νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄ λΆˆλ³€ 객체λ₯Ό μ‰½κ²Œ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 객체가 μƒμ„±λœ ν›„μ—λŠ” ν•„λ“œ 값을 λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ‚¬μš© μ˜ˆμ‹œ

Lombok 없이 λΉŒλ” νŒ¨ν„΄ κ΅¬ν˜„

public class User {
    private final String name;
    private final int age;
    private final String email;

    private User(UserBuilder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.email = builder.email;
    }

    public static class UserBuilder {
        private String name;
        private int age;
        private String email;

        public UserBuilder setName(String name) {
            this.name = name;
            return this;
        }

        public UserBuilder setAge(int age) {
            this.age = age;
            return this;
        }

        public UserBuilder setEmail(String email) {
            this.email = email;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }
}

Lombok을 μ‚¬μš©ν•œ λΉŒλ” νŒ¨ν„΄ κ΅¬ν˜„

Lombok의 @Builder μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ μœ„μ˜ μ½”λ“œκ°€ 크게 λ‹¨μΆ•λ©λ‹ˆλ‹€.

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class User {
    private String name;
    private int age;
    private String email;
}

객체 생성 μ˜ˆμ‹œ

μœ„μ˜ Lombok을 μ‚¬μš©ν•œ User 클래슀λ₯Ό μ΄μš©ν•΄ 객체λ₯Ό μƒμ„±ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.

public class Main {
    public static void main(String[] args) {
        User user = User.builder()
                        .name("devKobe")
                        .age(77)
                        .email(devKobe@gamil.com)
                        .build();
        
        System.out.println(user.getName()); // devKobe
        System.out.println(user.getAge()); // 77
        System.out.println(user.getEmail()) // devKobe@gmail.com
    }
}

μœ„ μ˜ˆμ‹œμ²˜λŸΌ Lombok의 @Builder λ₯Ό μ‚¬μš©ν•˜λ©΄ λΉŒλ” νŒ¨ν„΄μ„ κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•˜κ³  μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
이둜 인해 객체 생성 μ½”λ“œκ°€ 더 κΉ”λ”ν•˜κ³  μ§κ΄€μ μœΌλ‘œ λ³€ν•©λ‹ˆλ‹€.