티스토리 뷰
이번 글은 Category 조회 API 하나 완성하면서 배운 것들 정리해보았다
코드보다는 개념 정리하는 데 시간을 더 많이 쓴거같다
전체 흐름부터 정리
코드 짜기 전에 요청 하나가 어떻게 돌아가는지 순서부터 확실히 잡고 갔다.
| 1. 클라이언트 → Controller (요청 도착) 2. Controller → Service (서비스 메서드 호출) 3. Service → Mapper (매퍼 메서드 호출) 4. Mapper → DB (SQL 실행) 5. DB → Mapper (결과 row들 반환) 6. Mapper → Service (List 반환) 7. Service → Converter (Entity를 넘겨서 변환 요청) 8. Converter → Service (Response 반환) 9. Service → Controller (List 반환) 10. Controller → 클라이언트 (JSON으로 응답) |
여기서 처음에 헷갈렸던 7번 DB나 Mapper가 Converter를 직접 부르는 게 아니라, Service가 Mapper한테서 받은 Entity를 다시 Converter한테 넘겨서 변환을 요청하는 구조였다. Converter는 Service 내부에서만 호출되는, DB랑은 완전히 무관한 존재
Mapper가 곧 Repository였다
이런 착각을 왜 했냐면 MyBatis를 처음 써보면서 제일 헷갈렸던 게 이거였다. 예전에 JPA 쓸 때는 Repository라고 부르던 걸, MyBatis에서는 Mapper라고 부른다. 이름만 다르지 하는 역할(DB 접근을 인터페이스 뒤에 숨기는 것)은 완전히 같은 거였다. Repository는 왜 없지? 하고 헤맸는데, 알고 보니 애초에 Repository라는 개념 자체가 빠진 게 아니라 기술 스택에 따라 부르는 이름이 다른 것뿐이었다.
즉 현재 프로젝트 Mapper의 역할이 JPA의 Repository고, Converter의 역할이 Mapper인 셈이다.
이번 스택은 MyBatis + MapStruct를 같이 쓰는데, 둘 다 자기 어노테이션 이름이 @Mapper다. MyBatis의 Mapper는 DB↔Entity를 담당하고, MapStruct의 Mapper는 Entity↔DTO 변환을 담당하는데, 이름이 겹치면 프로젝트 안에서 헷갈리니까 MapStruct 쪽은 Converter로 이름을 다르게 부르기로 했다.
정리하자면
DB ↔ Entity : Mapper (MyBatis)
// CategoryMapper.java (MyBatis) - DB ↔ Entity
package com.study.category;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CategoryMapper {
List<CategoryEntity> getCategories();
}
Entity ↔ DTO : Converter (MapStruct)
// CategoryConverter.java (MapStruct) - Entity ↔ DTO
package com.study.category;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface CategoryConverter {
CategoryResponse toResponse(CategoryEntity category);
}
이렇다

결과적으로는 성공적으로 구현해냈고 /api/categories 엔드포인트를 찔렀을때 정상적으로 응답이 오는걸 확인할 수 있다.
맨 처음 정리했던 1~10단계 흐름 그대로, Controller → Service → Mapper → DB → Converter를 거쳐서 이 JSON이 나온 거다.
'게시판 만들기 > 2주차' 카테고리의 다른 글
| 만들자 게시판 2주차 (6) - Board 삭제 API 구현 (0) | 2026.07.11 |
|---|---|
| 만들자 게시판 2주차 (5) - Board 수정 API 구현 (0) | 2026.07.11 |
| 만들자 게시판 2주차 (4) - Board 조회 API 구현 (0) | 2026.07.11 |
| 만들자 게시판 2주차 (3) - Board 등록 API 구현 (0) | 2026.07.10 |
| 만들자 게시판 2주차 (1) - 1주차 마무리, 그리고 2주차 스프링부트로 (0) | 2026.07.09 |
