## 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` 작성]]