공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.
대출 서비스에서는 대출 이용자에게 필요한 약관 정보를 제공해야 하며, 이를 위해 약관 등록 및 조회 기능이 필요하다. 이 기능은 주로 내부 관리자가 새로운 약관을 시스템에 등록하는 용도로 사용되며, 등록된 약관 정보는 고객이 접근할 수 있는 형태로 제공된다.
1. TermsController 메서드 추가
TermsController에서 약관 등록 요청을 처리하는 POST 메서드를 추가한다. 관리자가 약관 정보를 입력하여 등록하면, 시스템에서 이를 저장하고 성공적으로 등록되었음을 반환한다.
package com.example.loan.controller;
import com.example.loan.dto.ResponseDTO;
import com.example.loan.dto.TermsDTO;
import com.example.loan.service.TermsService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static com.example.loan.dto.TermsDTO.*;
@RequiredArgsConstructor
@RestController
@RequestMapping("/terms")
public class TermsController extends AbstractController{
private final TermsService termsService;
@PostMapping
public ResponseDTO<Response> create(@RequestBody Request request) {
return ok(termsService.create(request));
}
}
- create 메서드 :
약관 정보를 요청받아 TermsService.create() 메서드를 통해 저장 후, 등록된 약관 정보를 응답한다. 약관 이름과 상세 URL 정보를 함께 등록한다.
2. Terms 엔티티 클래스 정의
약관 정보는 데이터베이스에 저장되어야 하며, 이를 위한 엔티티 클래스 Terms를 정의한다. 이 클래스는 약관 이름과 약관 상세 내용을 제공하는 URL을 저장한다.
package com.example.loan.domain;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.Where;
import javax.persistence.*;
@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@DynamicInsert
@DynamicUpdate
@Where(clause = "is_deleted=false")
public class Terms extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false, updatable = false)
private Long termsId;
@Column(columnDefinition = "varchar(255) NOT NULL COMMENT '약관'")
private String name;
@Column(columnDefinition = "varchar(255) NOT NULL COMMENT '약관상세 URL'")
private String termsDetailUrl;
}
- termsId: 약관의 고유 식별자.
- name: 약관의 이름.
- termsDetailUrl: 약관의 상세 내용이 저장된 URL.
3. TermsDTO 클래스 정의
TermsDTO 클래스는 약관 등록과 응답에 사용되는 데이터 전송 객체이다. Request 객체는 약관 이름과 URL 정보를 담아 서버로 전송하며, Response 객체는 등록된 약관 정보를 클라이언트로 반환한다.
package com.example.loan.dto;
import lombok.*;
import java.io.Serializable;
import java.time.LocalDateTime;
public class TermsDTO implements Serializable {
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
public static class Request {
private String name;
private String termsDetailUrl;
}
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Setter
public static class Response{
private Long termsId;
private String name;
private String termsDetailUrl;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
}
- Request 클래스:
관리자가 입력한 약관 이름과 약관 상세 URL을 포함한다. - Response 클래스:
등록된 약관의 ID, 이름, 상세 URL, 생성 및 수정 일자 등의 정보를 포함한다.
4. TermsRepository 인터페이스 정의
약관 정보를 저장하고 관리하기 위한 TermsRepository를 정의한다. JPA를 사용하여 데이터베이스와 상호작용하며, CRUD 작업을 처리한다.
package com.example.loan.repository;
import com.example.loan.domain.Terms;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface TermsRepository extends JpaRepository<Terms, Long> {
}
5. TermsService 및 TermsServiceImpl 구현
약관 등록 로직은 서비스 레이어에서 처리된다. TermsService 인터페이스에서 정의된 create 메서드는 약관 등록 요청을 처리하고, 이를 TermsServiceImpl 클래스에서 구현한다.
package com.example.loan.service;
import static com.example.loan.dto.TermsDTO.*;
public interface TermsService {
Response create(Request request);
}
- 약관 등록과 관련된 주요 메서드를 정의한다. 여기서는 create 메서드를 정의하여 약관 등록 요청을 처리한다.
TermsService 인터페이스의 구현체로, 약관 등록의 실제 로직을 담당한다. create 메서드는 관리자가 입력한 약관 정보를 받아 데이터베이스에 저장하고, 저장된 약관 정보를 반환한다.
package com.example.loan.service;
import com.example.loan.domain.Terms;
import com.example.loan.dto.TermsDTO;
import com.example.loan.repository.TermsRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.modelmapper.ModelMapper;
import org.springframework.stereotype.Service;
import static com.example.loan.dto.TermsDTO.*;
@Service
@Slf4j
@RequiredArgsConstructor
public class TermsServiceImpl implements TermsService{
private final TermsRepository termsRepository;
private final ModelMapper modelMapper;
@Override
public Response create(Request request) {
Terms terms = modelMapper.map(request, Terms.class);
Terms created = termsRepository.save(terms);
return modelMapper.map(created, Response.class);
}
}
create 메서드
- DTO → 엔티티 변환: 관리자가 입력한 약관 정보를 ModelMapper를 사용해 Terms 엔티티로 변환한다.
- 데이터 저장: 변환된 Terms 엔티티를 TermsRepository를 통해 데이터베이스에 저장한다.
- 응답 반환: 저장된 엔티티를 다시 ModelMapper를 통해 Response DTO로 변환하여 클라이언트에게 반환한다.
6. 테스트 코드 작성
약관 등록 기능이 올바르게 동작하는지 검증하기 위해 테스트 코드를 작성한다.
package com.example.loan.service;
import com.example.loan.domain.Terms;
import com.example.loan.dto.TermsDTO;
import com.example.loan.repository.TermsRepository;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.*;
import org.mockito.junit.jupiter.MockitoExtension;
import org.modelmapper.ModelMapper;
import org.springframework.stereotype.Repository;
import static com.example.loan.dto.TermsDTO.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.atIndex;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class TermsServiceImplTest {
@InjectMocks
TermsServiceImpl termsService;
@Mock
private TermsRepository termsRepository;
@Spy
private ModelMapper modelMapper;
@Test
void Should_ReturnResponseOfNewTermsEntity_When_RequestTerms() {
Terms entity = Terms.builder()
.name("대출 이용 약관")
.termsDetailUrl("https://abc-storage.acc/asdfasdf")
.build();
Request request = Request.builder()
.name("대출 이용 약관")
.termsDetailUrl("https://abc-storage.acc/asdfasdf")
.build();
when(termsRepository.save(ArgumentMatchers.any(Terms.class))).thenReturn(entity);
Response actual = termsService.create(request);
assertThat(actual.getName()).isSameAs(entity.getName());
assertThat(actual.getTermsDetailUrl()).isSameAs(entity.getTermsDetailUrl());
}
}
- 새로운 약관을 등록했을 때, 입력된 정보가 올바르게 저장되었는지 확인한다.
- Mockito를 사용하여 TermsRepository의 동작을 모의하고, 등록된 약관 정보가 반환되는지 검증한다.
7. 실행 테스트
실제로 약관 등록 기능을 테스트한 결과, API를 통해 정상적으로 약관이 등록되는 것을 확인할 수 있었다. 요청된 약관 정보는 데이터베이스에 저장되었으며, 응답으로 등록된 약관 정보가 반환되었다.
- 약관 이름과 약관 상세 URL을 입력하여 약관을 등록하는 요청을 보냈다. 정상적으로 약관이 등록되었고, 등록된 약관의 ID와 생성 일자, 수정 일자 등의 정보가 응답으로 반환되었다.
- 약관 등록 시 실행된 SQL 쿼리도 확인할 수 있었다. insert into terms 쿼리가 실행되었으며, 약관의 이름, 상세 URL, 생성 일자 및 수정 일자가 데이터베이스에 정상적으로 저장되었음을 확인할 수 있었다.
'BackEnd > Project' 카테고리의 다른 글
[Loan] Ch03. 대출 신청 이용 약관 등록 기능 구현 (0) | 2024.09.12 |
---|---|
[Loan] Ch03. 약관 조회 기능 구현 (0) | 2024.09.12 |
[Loan] Ch03. 대출 신청 삭제 기능 구현 (0) | 2024.09.11 |
[Loan] Ch03. 대출 신청 수정 기능 구현 (0) | 2024.09.11 |
[Loan] Ch03. 대출 신청 조회 기능 구현 (0) | 2024.09.11 |