티스토리 뷰

이번 글은 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이 나온 거다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/08   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함