본문 바로가기
BackEnd/Project

[Loan] Ch02. 대출 상담 수정 기능 구현

by 개발 Blog 2024. 9. 11.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

이번 글에서는 대출 상담 정보를 수정하는 기능을 구현한다. 기존에 등록된 상담 정보를 수정할 수 있도록 CounselController와 CounselService에 필요한 메서드를 추가하고, 테스트 코드를 통해 해당 기능을 검증한다.

 

1. CounselController 수정

CounselController에 상담 정보를 수정할 수 있는 메서드를 추가한다. 이 메서드는 HTTP PUT 요청을 받아 특정 상담 ID에 해당하는 정보를 수정한다.

@PutMapping("/{counselId}")
public ResponseDTO<Response> update(@PathVariable Long counselId, @RequestBody Request request) {
    return ok(counselService.update(counselId, request));
}
  • @PutMapping("/{counselId}"): PUT 요청을 받아 해당 counselId의 상담 정보를 수정한다.
  • @PathVariable Long counselId: URL 경로에서 상담 ID를 가져온다.
  • @RequestBody Request request: 수정할 상담 정보가 담긴 요청 객체를 받는다.
  • counselService.update(counselId, request): CounselService의 update 메서드를 호출하여 상담 정보를 수정한다.

2. CounselService에 메서드 추가

CounselService에 상담 정보를 수정하는 메서드를 정의한다.

Response update(Long counselId, Request request);

3. CounselServiceImpl에 구현체 추가

CounselServiceImpl에서 상담 정보를 실제로 수정하는 로직을 구현한다. 먼저, 해당 상담 ID로 데이터를 조회하고, 요청받은 정보로 상담 내용을 수정한 후 데이터베이스에 저장한다.

@Override
public Response update(Long counselId, Request request) {
    Counsel counsel = counselRepository.findById(counselId)
        .orElseThrow(() -> {
            throw new BaseException(ResultType.SYSTEM_ERROR);
        });

    counsel.setName(request.getName());
    counsel.setCellPhone(request.getCellPhone());
    counsel.setEmail(request.getEmail());
    counsel.setMemo(request.getMemo());
    counsel.setAddress(request.getAddress());
    counsel.setAddressDetail(request.getAddressDetail());
    counsel.setZipCode(request.getZipCode());

    counselRepository.save(counsel);

    return modelMapper.map(counsel, Response.class);
}
  • findById: 해당 counselId로 상담 데이터를 조회하며, 데이터가 없을 경우 BaseException을 던진다.
  • set 메서드들: 요청받은 데이터를 사용하여 기존 상담 정보를 수정한다.
  • save: 수정된 상담 데이터를 데이터베이스에 저장한다.
  • modelMapper.map: 저장된 Counsel 객체를 Response 객체로 변환하여 반환한다.

4. 테스트 코드 추가

상담 정보 수정 기능을 검증하는 테스트 코드를 작성한다.

@Test
void Should_ReturnUpdatedResponseOfExistCounselEntity_When_RequestUpdateExistCounselInfo() {
    Long firstId = 1L;

    Counsel entity = Counsel.builder()
        .counselId(1L)
        .name("Member Kim")
        .build();

    Request request = Request.builder()
        .name("Member Kang")
        .build();

    when(counselRepository.save(ArgumentMatchers.any(Counsel.class))).thenReturn(entity);
    when(counselRepository.findById(firstId)).thenReturn(Optional.ofNullable(entity));

    Response actual = counselService.update(firstId, request);

    assertThat(actual.getCounselId()).isSameAs(firstId);
    assertThat(actual.getName()).isSameAs(request.getName());
}
  • firstId: 테스트에서 사용할 상담 ID이다.
  • Counsel.builder(): 테스트용 상담 엔티티 생성한다.
  • Request.builder(): 테스트용 요청 객체 생성한다.
  • when: Mockito를 사용하여 counselRepository의 동작을 모의(Mock)한다.
  • assertThat: 수정된 상담 정보가 요청된 데이터와 일치하는지 검증한다.

5. API 호출 테스트

1번 상담에 대해 수정 요청을 정상적으로 처리하고, 이후 조회했을 때 수정된 데이터를 성공적으로 가져오는 것을 확인할 수 있다. 이를 통해 상담 수정 기능이 올바르게 동작함을 검증할 수 있다.