테스트 -> 리팩토링 -> 테스트 -> 리팩토링 -> 테스트를 하면서 프로그램을 점진적으로 개선하도록 노력한다.
출처 : https://nesoy.github.io/articles/2018-05/Refactoring
@NonNull
어노테이션 추가@Transactional의 readOnly 옵션은 해당 트랜잭션을 읽기 전용으로 설정한다.
->해당 옵션은 성능 최적화를 위해서 사용할 수도 있고, 특정 트랜잭션 작업 안에서 쓰기 작업이 일어나는 것을 의도적으로 방지하기 위해서 사용할 수도 있다.
getDeveloperByMemberId 부분이 중복해서 사용되므로 Refactor-> Extract Method를 이용해 메소드를 따로 작성해준다.
private void validateDeveloperLevel(DeveloperLevel developerLevel, Integer experienceYears) {
if(developerLevel == DeveloperLevel.SENIOR && experienceYears < 10){
throw new DMakerException(LEVEL_EXPERIENCE_YEAR_NOT_MATCHED);
}
if(developerLevel == DeveloperLevel.JUNIOR && experienceYears > 4 ){
throw new DMakerException(LEVEL_EXPERIENCE_YEAR_NOT_MATCHED);
}
}
package com.fastcampus.programming.dmaker.constant;
public class DMakerConstant {
public static final Integer MIN_SENIOR_EXPERIENCE_YEARS = 10;
public static final Integer MAX_JUNIOR_EXPERIENCE_YEARS = 4;
}
public enum DeveloperLevel {
NEW("신입 개발자",0,0),
JUNIOR("주니어 개발자",1,MAX_JUNIOR_EXPERIENCE_YEARS),
SENIOR("시니어 개발자",MIN_SENIOR_EXPERIENCE_YEARS, 70);
private final String description;
private final Integer minExperience;
private final Integer maxExperience;
}
private void validateDeveloperLevel(DeveloperLevel developerLevel, Integer experienceYears) {
if(developerLevel.getMinExperience() > experienceYears
|| developerLevel.getMaxExperience() < experienceYears)
throw new DMakerException(LEVEL_EXPERIENCE_YEAR_NOT_MATCHED);
}
@AllArgsConstructor
@Getter
public enum DeveloperLevel {
NEW("신입 개발자",years-> years == 0),
JUNIOR("주니어 개발자",years -> years <= MAX_JUNIOR_EXPERIENCE_YEARS),
SENIOR("시니어 개발자",years -> years >= MIN_SENIOR_EXPERIENCE_YEARS);
private final String description;
private final Function<Integer,Boolean> validateFunction;
public void validateExperienceYears(Integer years){
if(!validateFunction.apply(years))
throw new DMakerException(LEVEL_EXPERIENCE_YEAR_NOT_MATCHED);
}
}
private void validateDeveloperLevel(DeveloperLevel developerLevel, Integer experienceYears) {
developerLevel.validateExperienceYears(experienceYears);
}
정상적으로 동작하는지 확인하기 위해 테스트 케이스를 추가해준다.
@Test
void createDeveloperTest_fail_with_unmatched_level(){
//given
//when
//then
DMakerException dMakerException = assertThrows(DMakerException.class,
() -> dMakerService.createDeveloper(
getCreateRequest(SENIOR,FRONT_END,MIN_SENIOR_EXPERIENCE_YEARS-1)));
assertEquals(LEVEL_EXPERIENCE_YEAR_NOT_MATCHED,
dMakerException.getDMakerErrorCode());
dMakerException = assertThrows(DMakerException.class,
() -> dMakerService.createDeveloper(
getCreateRequest(JUNIOR,FRONT_END,MAX_JUNIOR_EXPERIENCE_YEARS+1)));
assertEquals(LEVEL_EXPERIENCE_YEAR_NOT_MATCHED,
dMakerException.getDMakerErrorCode());
}