Member 도메인에서의 페이지네이션을 구현을 예시로 실습해보려 한다.
페이지네이션을 위해 사용할 데이터들은 아래의 그림과 같다.
페이지네이션 메소드에 Get 방식으로 Page 번호와 데이터 갯수 Size를 쿼리문에 담아 요청을 보낸다.
요청을 보내게 되면 데이터베이스에서의 정보를 불러와 응답을 받도록 설계하려고 한다.
먼저 페이지네이션에서 요구하는 하위 도메인은 pageInfo와 Member 들이 있다.
응답 받을 형태는 Map 형태로 data : {}, pageInfo : {} 을 응답으로 받는다.
[그림] 레포지토리 코드
[그림] data 응답
서비스 설계
[그림] PageInfo 응답 서비스 설계
[그림] 페이지네이션 컨트롤러 설계 코드
Response 응답을 Map 형태로 만들어주기 위해 responseMapper를 인터페이스 형태로 작성했고, 맵퍼를 구현한 클래스인 responseMapperImpl를 생성하였다.
오류는
Parameter 2 of constructor in com.codestates.member.controller.MemberController required a bean of type 'com.codestates.member.mapper.ResponseMapper' that could not be found.
MemberController에서 ResponseMapper가 의존성을 주입받지 못해 오류가 발생하였다.
private final MemberService memberService;
private final MemberMapper mapper;
private final ResponseMapper responseMapper;
@Autowired
public MemberController(MemberService memberService, MemberMapper mapper,ResponseMapper responseMapper) {
this.memberService = memberService;
this.mapper = mapper;
this.responseMapper = responseMapper;
}
필드 부분과 생성자를 잘 작성하였다고 생각했었지만, 예상과는 달리 MemberResponseMapper을 주입 받지 못하고 있었다.
그래서 MemberResponseMapper의 주입 문제를 해결하기 위해 responseMapperImpl 클래스에 @Component 애너테이션을 붙여 의존성 주입이 가능하였고 MemberResponseMapper는 이 애너테이션을 통해 구현한 클래스를 참조받도록 하여 의존성 주입이 정상적으로 실행되게끔 수정하였다.
@Component
public class ResponseMapperImpl implements ResponseMapper{
@Override
public Map<String,Object> response(Object res1,Object res2){
Map<String,Object> result = new HashMap<>();
result.put("data",res1);
result.put("pageInfo",res2);
return result;
}
}