Context
Table of Content
쿠폰 발급 요청 및 반환 기능 구현
REST API를 통해 사용자로부터 발급 요청을 받고, 처리 결과를 반환하는 인터페이스를 제공한다. 클라이언트와 명확한 데이터 교환을 통해 사용자 경험을 개선하고, 서비스의 응답성을 높인다.
구조 및 구현
├── coupon-api/
│ ├── src/main/java/com/example/couponapi/
│ ├── controller/ # REST API 요청을 처리하는 컨트롤러 클래스
│ │ ├── dto/ # 데이터 전송 객체(Data Transfer Object) 관련 클래스가 포함
│ │ │ ├── CouponIssueRequestDto.java
│ │ │ └── CouponIssueResponseDto.java
│ │ └── HelloController.java
│ ├── service/ # 비즈니스 로직을 처리하는 서비스 계층 클래스
│ │ ├── CouponIssueRequestService.java
│ │ ├── CouponApiApplication.java
│ │ ├── CouponControllerAdvice.java
│ │ └── CouponIssueController.java
Java
복사
클래스명 | 내용 |
CouponIssueRequestDto.java | 클라이언트가 요청한 쿠폰 발급 정보를 담는 데이터 전송 객체(DTO)
userId와 couponId를 포함 |
CouponIssueResponseDto.java | 쿠폰 발급 결과를 클라이언트에게 전달하기 위한 DTO
성공 여부(isSuccess)와 메시지(comment)를 포함 |
HelloController.java | 테스트용 컨트롤러로, 기본적인 HTTP 요청과 응답을 처리하며 애플리케이션 상태 확인에 사용됨 |
CouponIssueRequestService.java | 비즈니스 로직을 처리하는 서비스 계층
쿠폰 발급 요청을 처리하고 관련 로직을 실행하며 성공 메시지를 로그로 기록 |
CouponApiApplication.java | 애플리케이션의 진입점으로, Spring Boot 애플리케이션 실행을 담당 |
CouponIssueController.java | RESTful API 엔드포인트를 제공하는 컨트롤러
클라이언트의 쿠폰 발급 요청을 받아 서비스를 호출하고 결과를 반환 |
소스코드
•
CouponIssueRequestDto.java
클라이언트의 쿠폰 발급 요청 데이터를 담는 Dto로, couponId, userId를 포함한다.
package com.example.couponapi.controller.dto;
public record CouponIssueRequestDto(long userId, long couponId) {
}
Java
복사
필드명 | 설명 |
userId | 요청한 사용자의 ID |
couponId | 발급할 쿠폰의 ID |
•
CouponIssueResponseDto.java
쿠폰 발급 요청의 결과를 클라이언트에게 반환하는 DTO로, 성공 여부와 결과 메시지를 포함한다.
package com.example.couponapi.controller.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
@JsonInclude(value = NON_NULL)
public record CouponIssueResponseDto(boolean isSuccess, String comment) {
}
Java
복사
필드명 | 설명 |
isSuccess | 쿠폰 발급 성공 여부를 나타냄 |
comment | 결과 메시지 (성공 시 null) |
•
HelloController.java
테스트용 컨트롤러로, HTTP 요청을 받아 간단한 문자열 응답을 반환한다.
package com.example.couponapi.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello!";
}
}
Java
복사
메서드명 | 내용 |
hello() | HTTP GET 요청을 /hello 경로로 받아 "hello!" 문자열을 반환 |
•
CouponIssueRequestService.java
쿠폰 발급 요청을 처리하는 서비스 계층으로, 발급 로직을 호출하고 성공 메시지를 로그로 기록한다.
package com.example.couponapi.service;
import com.example.couponapi.controller.dto.CouponIssueRequestDto;
import com.example.couponcore.service.CouponIssueService;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@RequiredArgsConstructor
@Service
public class CouponIssueRequestService {
private final CouponIssueService couponIssueService;
private final Logger log = LoggerFactory.getLogger(this.getClass().getSimpleName());
public void issueRequestV1(CouponIssueRequestDto requestDto) {
couponIssueService.issue(requestDto.couponId(), requestDto.userId());
log.info("쿠폰 발급 완료. couponId: %s, userId: %s".formatted(requestDto.couponId(), requestDto.userId()));
}
}
Java
복사
메서드명 | 설명 |
issueRequestV1 | 쿠폰 발급 로직 호출 및 성공 메시지 로그 기록 |
•
CouponApiApplication.java
애플리케이션의 진입점으로, Spring Boot 애플리케이션 실행을 담당한다.
package com.example.couponapi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CouponApiApplication {
public static void main(String[] args) {
SpringApplication.run(CouponApiApplication.class, args);
}
}
Java
복사
•
CouponControllerAdvice.java
글로벌 예외처리를 담당하며, 쿠폰 발급 관련 예외를 처리하여 클라이언트에게 표준화된 응답을 반환한다.
package com.example.couponapi;
import com.example.couponapi.controller.dto.CouponIssueResponseDto;
import com.example.couponcore.exception.CouponIssueException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class CouponControllerAdvice {
@ExceptionHandler(CouponIssueException.class)
public CouponIssueResponseDto couponIssueExceptionHandler(CouponIssueException exception) {
return new CouponIssueResponseDto(false, exception.getErrorCode().message);
}
}
Java
복사
메서드명 | 내용 |
couponIssueExceptionHandler | CouponIssueException 예외 발생 시 표준화된 실패 응답(CouponIssueResponseDto)을 반환 |
•
CouponIssueController.java
HTTP 요청을 처리하는 컨트롤러로, RESTful API 엔트포인트를 제공하며 쿠폰 발급 요청을 처리한다.
package com.example.couponapi;
import com.example.couponapi.controller.dto.CouponIssueRequestDto;
import com.example.couponapi.controller.dto.CouponIssueResponseDto;
import com.example.couponapi.service.CouponIssueRequestService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor
@RestController
public class CouponIssueController {
private final CouponIssueRequestService couponIssueRequestService;
@PostMapping("/v1/issue")
public CouponIssueResponseDto issueV1(@RequestBody CouponIssueRequestDto body) {
couponIssueRequestService.issueRequestV1(body);
return new CouponIssueResponseDto(true, null);
}
}
Java
복사
메서드명 | 설명 |
issueV1 | 쿠폰 발급 요청을 처리
성공 여부를 응답(CouponIssueResponseDto)으로 반환 |
확인
postman으로 요청
정상요청
중복 발급 요청
Related Posts
Search