반응형

🏁 학습할 내용
- 필요한 이유
- 정의
- 간단하게 만들어보기
- 도입된 후 레이어
✅ 필요한 이유
🙋 없어도 문제가 되지 않았던 이유

현재 우리의 구조는 Controller에서 직접 repository를 들고있는 형태다.
더 자세히 설명하면, repository가 DB에 접근해 원하는 결과 entitiy를 얻어오고,
그 결과를 템플릿에게 전달해서 표시해주고 있다.
현재는 단일 페이지라 문제가 없어보이지만, 조금 더 복잡한 화면들이 있다고 상상해보자.
🧩역할
1️⃣모듈화
만약 A,B 컨트롤러들이 C라는 레포지토리에서 여러개의 함수가 순차적으로 실행된 결과를
사용한다고 가정해보자.
그렇다면 A,B는 C 레포지토리를 순차적으로 호출하는 중복코드를 갖게되고, 이 코드는
유지보수에 좋지 않은 영향을 줄 수 있다.
이 때, 서비스에 해당 코드를 한번 정의해 놓고, 서비스를 컨트롤러에서 사용하면
중복코드에 대한 문제를 해결할 수 있다.
2️⃣보안 및 DTO 변환
Entitiy는 DB와 직접 맞닿아 있는 클래스이므로, 컨트롤러 또는 타임리프와 같은 템플릿 엔진에
직접 전달되어 사용되는 것은 보안적으로 좋지않다.
DB 스킴이 거의 노출된다고 봐도 무방하다.
그렇기 때문에, 서비스는 Repository에서 얻은 Entitiy를
다른 레이어(Controller..)로 필요한 데이터만 담은 DTO를 변환하여 전달하는 역할을 할 수 있다.
반대로 다른 레이어(Controller)에서 서비스로 DTO를 보내주면, 해당 DTO를 Entity로 변환하여
Repository로 전달해주는 역할을 할 수 있다.
⭐정의
핵심 비지니스 로직을 담는 계층
서로 다른 계층을 연동할 때
데이터를 가공 및 변환하여 반환하는 역할
📌특징
- 모듈화
- 유지보수성
- 재사용성
- 테스트 용이성
🤝간단하게 만들어보기
@Service
class QuestionService(
private val repository: QuestionRepository
) {
fun getList(): List<Question> {
return repository.findAll()
}
}
🪜도입된 후 레이어

출처
반응형