조금 친절한 코드 생성기 7(일단 완성) - DAO 생성기 코딩
이전 글에서 예고한데로, 테스트 코드 부터 작성했습니다.
public void generateDao(){
RepositorySettings settings = new FreemarkerRepositorySettings("test", "repository.ftl", "repository_impl.ftl", "test/springsprout/modules", Study.class);
service.generateRepository(settings);
assertTrue(new File("test/springsprout/modules/test/StudyRepository.java").exists());
assertTrue(new File("test/springsprout/modules/test/StudyRepositoryImpl.java").exists());
service.deleteRepository();
assertFalse(new File("test/springsprout/modules/test/StudyRepository.java").exists());
assertFalse(new File("test/springsprout/modules/test/StudyRepositoryImpl.java").exists());
}
그리고 컴파일 에러를 없애기 위해서 필요한 인터페이스, 클래스, 메서드들을 추가했습니다. 먼저, RepositorySettings를 만들었습니다.
}
이 구현체인 FreemarkerRepositorySettings는 다음과 같습니다.
private String module;
private String interfaceTemplateName;
private String implTemplateName;
private String destinationDirPath;
private Class domainClass;
private Map<String, String> modelMap;
private List<File> destinationDirs;
private File interfaceFile;
private File implFile;
public FreemarkerRepositorySettings(String module, String interfaceTemplateName, String implTemplateName, String destinationDirPath, Class domainClass) {
this.module = module;
this.interfaceTemplateName = interfaceTemplateName;
this.implTemplateName = implTemplateName;
this.destinationDirPath = destinationDirPath;
this.domainClass = domainClass;
String domainClassName = domainClass.getSimpleName();
modelMap = new HashMap<String, String>();
modelMap.put("module", module);
modelMap.put("domainClass", domainClassName);
interfaceFile = new File(destinationDirPath + "/" + module + "/" + domainClassName + "Repository.java");
implFile = new File(destinationDirPath + "/" + module + "/" + domainClassName + "RepositoryImpl.java");
destinationDirs = new ArrayList<File>();
destinationDirs.add(new File(destinationDirPath));
destinationDirs.add(new File(destinationDirPath + "/" + module));
}
...
}
이전에 만들었던 FreemarkerControllerSettings와 비슷하지만, 살짝 다릅니다. 그래도 비슷한 코드가 많으니.. 어떻게 중복을 좀 제거할 방법을 생각해 봐야겠습니다. 일단은 계속 ㄱㄱ
이제는 CodeGenerationService 인터페이스에 메서드를 추가할 차례로군요.
void generateController(ControllerSettings settings) throws CodeGenerationException;
void generateRepository(RepositorySettings settings) throws CodeGenerationException;
}
Settins를 만들 때 빼고는 여태까진 편했습니다. 아직까지는 테스트를 돌려도 분명히 에러가 날 것이기 때문에 별로 돌려보고 싶지도 않습니다.
이제 본격적으로 프리마커 코드 생성기에 위 인터페이스 구현체를 만들겠습니다.
generatedFiles = new Stack<File>();
FreemarkerRepositorySettings frSettings = (FreemarkerRepositorySettings)settings;
generateDirs(frSettings.getDestinationDirs());
generateCode(frSettings.getInterfaceTemplateName(), frSettings.getModelMap(), frSettings.getInterfaceFile());
generateCode(frSettings.getImplTemplateName(), frSettings.getModelMap(), frSettings.getImplFile());
}
어머나.. 끝이로군요!! 이전 코드를 리팩토링한 효과가 있었습니다. 원래는 이 부분도 굉장히 장황해질뻔 했는데, 다행입니다. 이제 테스트를 돌려볼까요.
로깅은 귀찮아서 Sout으로 해결했습니다.
만들때
삭제 대상
삭제된 후
조금 친절한 코드 생성기는 그럼 여기서 끝!!