Justin의 개발 로그
import java.time.LocalDate;
import java.time.Month;

public record Paystub(int amount, int bonus, String reasonCode) {

    public static Paystub noPay(String reasonCode) {
        return new Paystub(0, 0, reasonCode);
    }
}


public class Employee {
    private boolean isSeparated;
    private boolean isRetired;
    private int salary;

    public Employee(boolean isSeparated, boolean isRetired, int salary) {
        this.isSeparated = isSeparated;
        this.isRetired = isRetired;
        this.salary = salary;
    }

    public Paystub getPaystub() {
        Paystub result;

        if (isSeparated) {  //퇴사한 직원
            result = new Paystub(0, 0, "SEP");
        }
        else {
            if (isRetired) {    //은퇴한 직원
                result = new Paystub(0, 0,"RET");
            }
            else {  //일반 직원
                result = new Paystub(salary / 12 , 0, "SAL");

                // 12월에는 보너스 지급 (연봉의 10%)
                if( LocalDate.now().getMonth() == Month.SEPTEMBER )
                    result = new Paystub(result.amount(), (int)(salary * 0.1) , "BONUS");

            }
        }
        return result;
    }

    public static void main(String[] args) {
        Employee employee = new Employee(false, false, 48000000);
        Paystub paystub = employee.getPaystub();
        System.out.println("Paystub Amount: " + paystub.amount());
        System.out.println("Paystub Bonus: " + paystub.bonus());
        System.out.println("Paystub Reason Code: " + paystub.reasonCode());
    }
}

 

 

import java.time.LocalDate;

//Mock으로 항상 같은 테스트 결과가 나오도록 개선
public interface LocalDateFactory {
    default LocalDate now() {
        return LocalDate.now();
    }
}


public class Employee {
    private boolean isSeparated;
    private boolean isRetired;
    private int salary;

    public Employee(boolean isSeparated, boolean isRetired, int salary) {
        this.isSeparated = isSeparated;
        this.isRetired = isRetired;
        this.salary = salary;
    }

    public Paystub getPaystub(LocalDateFactory localDate) {
        Paystub result;

        if (isSeparated) {  //퇴사한 직원
            result = new Paystub(0, 0, "SEP");
        }
        else {
            if (isRetired) {    //은퇴한 직원
                result = new Paystub(0, 0,"RET");
            }
            else {  //일반 직원
                result = new Paystub(salary / 12 , 0, "SAL");

                // 12월에는 보너스 지급 (연봉의 10%)
                if( localDate.now().getMonth() == Month.DECEMBER )
                    result = new Paystub(result.amount(), (int)(salary * 0.1) , "BONUS");

            }
        }
        return result;
    }

}




class EmployeeTest {

	@DisplayName("pay 값을 계산한다")
	@Test
	void getPayAmount_평월(){
	    // given
		Employee employee = new Employee(false, false, 48000000);
		LocalDateFactory localDate = Mockito.mock(LocalDateFactory.class);
		given(localDate.now()).willReturn(LocalDate.of(2025, 1, 1));

		// when
		Paystub paystub = employee.getPaystub(localDate);
		// then
		Assertions.assertEquals(4000000, paystub.amount());
		Assertions.assertEquals(0, paystub.bonus());
	}

	@Test
	void getPayAmount_12월보너스(){
		// given
		Employee employee = new Employee(false, false, 48000000);
		LocalDateFactory localDate = Mockito.mock(LocalDateFactory.class);
		given(localDate.now()).willReturn(LocalDate.of(2025, 12, 1));

		// when
		Paystub paystub = employee.getPaystub(localDate);
		// then
		Assertions.assertEquals(4000000, paystub.amount());
		Assertions.assertEquals(4800000, paystub.bonus());
	}

	@Test
	void getPayAmount_은퇴직원(){
		// given
		Employee employee = new Employee(false, true, 100000000);
		LocalDateFactory localDate = Mockito.mock(LocalDateFactory.class);
		given(localDate.now()).willReturn(LocalDate.of(2025, 12, 1));

		// when
		Paystub paystub = employee.getPaystub(localDate);
		// then
		Assertions.assertEquals(0, paystub.amount());
		Assertions.assertEquals(0, paystub.bonus());
	}
}

 

이후는 github 참고~ (76e262d)

https://github.com/Justin-ad-Park/refactoring-2nd-edition

 

 

GitHub - Justin-ad-Park/refactoring-2nd-edition: 리팩터링 2nd Java 버전

리팩터링 2nd Java 버전. Contribute to Justin-ad-Park/refactoring-2nd-edition development by creating an account on GitHub.

github.com

 

 

profile

Justin의 개발 로그

@라이프노트

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!