## PromptTemplateService ### 클래스 생성 및 의존성 주입 ```java @Service public class PromptTemplateService { @Autowired private PromptTemplateRepository promptTemplateRepository; ... (생략) } ``` ### CRUD 메서드 ```java public PromptTemplate create(PromptTemplate promptTemplate){ return promptTemplateRepository.save(promptTemplate); } public PromptTemplate readById(String id){ return promptTemplateRepository.findById(id) .orElseThrow(EntityNotFoundException::new); } public PromptTemplate updateById(String id, PromptTemplate promptTemplate){ PromptTemplate origin = readById(id); origin.setContent(promptTemplate.getContent()); return promptTemplateRepository.save(origin); } public void deleteById(String id){ promptTemplateRepository.deleteById(id); } ``` - `modifiedTime`은 데이터베이스에 들어갈 때 자동으로 수정되므로 `updateById`에 수정하는 코드를 넣을 필요가 없다. ### 템플릿을 통한 프롬프트 생성 메서드 #### `processTemplateIntoString` ```java private String processTemplateIntoString(Template template, Map<String, String> map) throws TemplateException, IOException { StringWriter writer = new StringWriter(); template.process(map, writer); return writer.toString(); } ``` - `freemarker.template.Template`은 `freemarker`의 템플릿 클래스다. - `Template::process`는 첫 번째 인자로 키워드에 해당하는 `Object` 타입을 받고 두 번째 인자로 출력을 관리하는 `java.io.StringWriter`를 받는다. 이때 첫 인자로 `Map`을 전달하면 `Map`의 `key`를 바탕으로 `value`를 템플릿에 삽입한다. 작업된 텍스트는 `StringWriter`에 저장된다. #### `generatePromptByTemplate` ```java public String generatePromptByTemplate(String templateId, Map<String, String> map) throws IOException, TemplateException { return processTemplateIntoString( new Template( "_", new StringReader(readById(templateId).getContent()), new Configuration(Configuration.VERSION_2_3_32) ), map ); } ``` ## [[4-1. 서비스 테스트 코드|테스트 코드]] ![[4-1. 서비스 테스트 코드#`PromptTemplateServiceTest` 작성]]