반응형
CustomerCartController
package com.zerobase.cms.order.controller;
import com.zerobase.cms.order.application.CartApplication;
import com.zerobase.cms.order.application.OrderApplication;
import com.zerobase.cms.order.domain.product.AddProductCartForm;
import com.zerobase.cms.order.domain.redis.Cart;
import com.zerobase.domain.config.JwtAuthenticationProvider;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/customer/cart")
@RequiredArgsConstructor
public class CustomerCartController {
private final CartApplication cartApplication;
private final JwtAuthenticationProvider provider;
private final OrderApplication orderApplication;
@PostMapping
public ResponseEntity<Cart> addCart(
@RequestHeader(name = "X-AUTH-TOKEN") String token,
@RequestBody AddProductCartForm form) {
return ResponseEntity.ok(cartApplication.addCart(provider.getUserVo(token).getId(), form));
}
@GetMapping
public ResponseEntity<Cart> showCart(
@RequestHeader(name = "X-AUTH-TOKEN") String token) {
return ResponseEntity.ok(cartApplication.getCart(provider.getUserVo(token).getId()));
}
@PutMapping
public ResponseEntity<Cart> updateCart(
@RequestHeader(name = "X-AUTH-TOKEN") String token, @RequestBody Cart cart) {
return ResponseEntity.ok(cartApplication.updateCart(provider.getUserVo(token).getId(), cart));
}
@PostMapping("/order")
public ResponseEntity<Cart> order(
@RequestHeader(name = "X-AUTH-TOKEN") String token,
@RequestBody Cart cart) {
orderApplication.order(token, cart);
return ResponseEntity.ok().build();
}
}
고객 장바구니 컨트롤러 (CustomerCartController)
이 코드는 고객의 장바구니와 관련된 HTTP 요청을 처리하는 컨트롤러 클래스(CustomerCartController)입니다. 이 컨트롤러는 장바구니에 상품을 추가하고, 장바구니 내용을 확인하고, 장바구니를 업데이트하고, 주문을 생성하는 기능을 제공합니다.
1. 클래스 구조 및 어노테이션
- package com.zerobase.cms.order.controller;: 이 클래스가 com.zerobase.cms.order.controller 패키지에 속해 있음을 나타냅니다. 패키지는 관련 있는 클래스들을 묶어 관리하는 데 사용됩니다.
- import com.zerobase.cms.order.application.CartApplication;: CartApplication 클래스를 가져옵니다. 이 클래스는 장바구니 관련 비즈니스 로직을 처리하는 서비스입니다.
- import com.zerobase.cms.order.application.OrderApplication;: OrderApplication 클래스를 가져옵니다. 이 클래스는 주문 관련 비즈니스 로직을 처리하는 서비스입니다.
- import com.zerobase.cms.order.domain.product.AddProductCartForm;: AddProductCartForm 클래스를 가져옵니다. 이 클래스는 장바구니에 상품을 추가하기 위한 폼 객체입니다.
- import com.zerobase.cms.order.domain.redis.Cart;: Cart 클래스를 가져옵니다. 이 클래스는 장바구니 정보를 담는 데이터 전송 객체입니다.
- import com.zerobase.domain.config.JwtAuthenticationProvider;: JwtAuthenticationProvider 클래스를 가져옵니다. 이 클래스는 JWT 인증을 처리하는 컴포넌트입니다.
- import lombok.RequiredArgsConstructor;: Lombok 라이브러리의 어노테이션으로, final 필드나 @NonNull 어노테이션이 붙은 필드에 대한 생성자를 자동으로 생성해줍니다.
- import org.springframework.http.ResponseEntity;: ResponseEntity 클래스를 가져옵니다. 이 클래스는 HTTP 응답을 나타냅니다.
- import org.springframework.web.bind.annotation.GetMapping;: GetMapping 어노테이션을 가져옵니다. 이 어노테이션은 HTTP GET 요청을 처리하는 메서드를 지정합니다.
- import org.springframework.web.bind.annotation.PostMapping;: PostMapping 어노테이션을 가져옵니다. 이 어노테이션은 HTTP POST 요청을 처리하는 메서드를 지정합니다.
- import org.springframework.web.bind.annotation.PutMapping;: PutMapping 어노테이션을 가져옵니다. 이 어노테이션은 HTTP PUT 요청을 처리하는 메서드를 지정합니다.
- import org.springframework.web.bind.annotation.RequestBody;: RequestBody 어노테이션을 가져옵니다. 이 어노테이션은 HTTP 요청 body에 담긴 데이터를 메서드 파라미터로 전달합니다.
- import org.springframework.web.bind.annotation.RequestHeader;: RequestHeader 어노테이션을 가져옵니다. 이 어노테이션은 HTTP 요청 헤더 값을 메서드 파라미터로 전달합니다.
- import org.springframework.web.bind.annotation.RequestMapping;: RequestMapping 어노테이션을 가져옵니다. 이 어노테이션은 컨트롤러의 기본 URL을 지정합니다.
- import org.springframework.web.bind.annotation.RestController;: RestController 어노테이션을 가져옵니다. 이 어노테이션은 해당 클래스가 REST 컨트롤러임을 나타냅니다.
- @RestController: 이 어노테이션은 해당 클래스가 REST 컨트롤러임을 나타냅니다. REST 컨트롤러는 HTTP 요청을 처리하고 JSON 또는 XML 형식의 응답을 반환합니다.
- @RequestMapping("/customer/cart"): 이 어노테이션은 컨트롤러의 기본 URL을 /customer/cart로 지정합니다. 즉, 이 컨트롤러의 모든 메서드는 /customer/cart로 시작하는 URL을 통해 접근할 수 있습니다.
- @RequiredArgsConstructor: Lombok 라이브러리의 어노테이션으로, final 필드나 @NonNull 어노테이션이 붙은 필드에 대한 생성자를 자동으로 생성해줍니다. 여기서는 cartApplication, provider, orderApplication을 주입받기 위한 생성자가 만들어집니다.
- public class CustomerCartController { ... }: CustomerCartController 클래스를 정의합니다. public은 이 클래스가 모든 패키지에서 접근 가능하다는 것을 의미합니다.
2. 클래스 필드
- private final CartApplication cartApplication;: CartApplication 타입의 cartApplication 필드를 정의합니다. CartApplication은 장바구니 관련 비즈니스 로직을 처리하는 서비스입니다. final은 이 필드가 한 번 초기화되면 변경될 수 없음을 의미합니다.
- private final JwtAuthenticationProvider provider;: JwtAuthenticationProvider 타입의 provider 필드를 정의합니다. JwtAuthenticationProvider는 JWT 인증을 처리하는 컴포넌트입니다. final은 이 필드가 한 번 초기화되면 변경될 수 없음을 의미합니다.
- private final OrderApplication orderApplication;: OrderApplication 타입의 orderApplication 필드를 정의합니다. OrderApplication은 주문 관련 비즈니스 로직을 처리하는 서비스입니다. final은 이 필드가 한 번 초기화되면 변경될 수 없음을 의미합니다.
3. 메서드
3.1. addCart(String token, AddProductCartForm form)
- 기능: 장바구니에 상품을 추가합니다.public ResponseEntity<Cart> addCart( @RequestHeader(name = "X-AUTH-TOKEN") String token, @RequestBody AddProductCartForm form) { // 1. JWT 토큰에서 사용자 ID 추출 Long customerId = provider.getUserVo(token).getId();}`
- @PostMapping: 이 어노테이션은 HTTP POST 요청을 처리하는 메서드임을 나타냅니다. POST 요청은 주로 새로운 데이터를 생성할 때 사용됩니다. 이 메서드는 /customer/cart URL로 들어오는 POST 요청을 처리합니다.
- public ResponseEntity<Cart> addCart( ... ) { ... }: addCart 메서드를 정의합니다.
- public은 이 메서드가 모든 클래스에서 접근 가능하다는 것을 의미합니다.
- ResponseEntity<Cart>는 반환 타입으로, HTTP 응답을 나타냅니다. Cart는 응답 body에 담긴 장바구니 정보를 나타내는 데이터 전송 객체입니다.
- @RequestHeader(name = "X-AUTH-TOKEN") String token: 이 어노테이션은 HTTP 요청 헤더 X-AUTH-TOKEN의 값을 token 파라미터에 전달합니다. X-AUTH-TOKEN은 인증 토큰으로, 사용자를 인증하고 권한을 확인하는 데 사용됩니다.
- @RequestBody AddProductCartForm form: 이 어노테이션은 HTTP 요청 body에 담긴 데이터를 AddProductCartForm 객체로 변환하여 form 파라미터에 전달합니다. AddProductCartForm은 장바구니에 상품을 추가하기 위한 폼 객체입니다.
- Long customerId = provider.getUserVo(token).getId();: JWT 토큰에서 사용자 ID를 추출합니다. provider.getUserVo(token)는 JWT 토큰을 파싱하여 사용자 정보를 담은 객체를 반환합니다. getId() 메서드는 사용자 ID를 반환합니다.
- Cart cart = cartApplication.addCart(customerId, form);: CartApplication 서비스의 addCart 메서드를 호출하여 장바구니에 상품을 추가합니다. addCart 메서드는 사용자 ID와 장바구니 추가 폼 객체를 인자로 받아 장바구니에 상품을 추가하고, 업데이트된 장바구니 정보를 반환합니다.
- return ResponseEntity.ok(cart);: HTTP 응답을 생성하고 반환합니다. ResponseEntity.ok(cart)는 HTTP 상태 코드 200 (OK)과 함께 장바구니 정보를 응답 body에 담아 반환합니다.
3.2. showCart(String token)
- 기능: 장바구니 내용을 확인합니다.
- @GetMapping: 이 어노테이션은 HTTP GET 요청을 처리하는 메서드임을 나타냅니다. GET 요청은 주로 서버에서 데이터를 가져올 때 사용됩니다. 이 메서드는 /customer/cart URL로 들어오는 GET 요청을 처리합니다.
- public ResponseEntity<Cart> showCart( ... ) { ... }: showCart 메서드를 정의합니다.
- public은 이 메서드가 모든 클래스에서 접근 가능하다는 것을 의미합니다.
- ResponseEntity<Cart>는 반환 타입으로, HTTP 응답을 나타냅니다. Cart는 응답 body에 담긴 장바구니 정보를 나타내는 데이터 전송 객체입니다.
- @RequestHeader(name = "X-AUTH-TOKEN") String token: 이 어노테이션은 HTTP 요청 헤더 X-AUTH-TOKEN의 값을 token 파라미터에 전달합니다. X-AUTH-TOKEN은 인증 토큰으로, 사용자를 인증하고 권한을 확인하는 데 사용됩니다.
- Long customerId = provider.getUserVo(token).getId();: JWT 토큰에서 사용자 ID를 추출합니다.
- Cart cart = cartApplication.getCart(customerId);: CartApplication 서비스의 getCart 메서드를 호출하여 장바구니 정보를 가져옵니다. getCart 메서드는 사용자 ID를 인자로 받아 장바구니 정보를 반환합니다.
- return ResponseEntity.ok(cart);: HTTP 응답을 생성하고 반환합니다.
3.3. updateCart(String token, Cart cart)
- 기능: 장바구니를 업데이트합니다.
- @PutMapping: 이 어노테이션은 HTTP PUT 요청을 처리하는 메서드임을 나타냅니다. PUT 요청은 주로 서버에 존재하는 데이터를 갱신할 때 사용됩니다. 이 메서드는 /customer/cart URL로 들어오는 PUT 요청을 처리합니다.
- public ResponseEntity<Cart> updateCart( ... ) { ... }: updateCart 메서드를 정의합니다.
- public은 이 메서드가 모든 클래스에서 접근 가능하다는 것을 의미합니다.
- ResponseEntity<Cart>는 반환 타입으로, HTTP 응답을 나타냅니다. Cart는 응답 body에 담긴 장바구니 정보를 나타내는 데이터 전송 객체입니다.
- @RequestHeader(name = "X-AUTH-TOKEN") String token: 이 어노테이션은 HTTP 요청 헤더 X-AUTH-TOKEN의 값을 token 파라미터에 전달합니다.
- @RequestBody Cart cart: 이 어노테이션은 HTTP 요청 body에 담긴 데이터를 Cart 객체로 변환하여 cart 파라미터에 전달합니다. Cart는 장바구니 정보를 담는 데이터 전송 객체입니다.
- Long customerId = provider.getUserVo(token).getId();: JWT 토큰에서 사용자 ID를 추출합니다.
- Cart updatedCart = cartApplication.updateCart(customerId, cart);: CartApplication 서비스의 updateCart 메서드를 호출하여 장바구니를 업데이트합니다. updateCart 메서드는 사용자 ID와 업데이트할 장바구니 정보를 인자로 받아 장바구니를 업데이트하고, 업데이트된 장바구니 정보를 반환합니다.
- return ResponseEntity.ok(updatedCart);: HTTP 응답을 생성하고 반환합니다.
3.4. order(String token, Cart cart)
- 기능: 주문을 생성합니다.
- @PostMapping("/order"): 이 어노테이션은 HTTP POST 요청을 /customer/cart/order URL로 매핑합니다. POST 요청은 주로 새로운 데이터를 생성할 때 사용됩니다. 이 메서드는 /customer/cart/order URL로 들어오는 POST 요청을 처리합니다.
- public ResponseEntity<Cart> order( ... ) { ... }: order 메서드를 정의합니다.
- public은 이 메서드가 모든 클래스에서 접근 가능하다는 것을 의미합니다.
- ResponseEntity<Cart>는 반환 타입으로, HTTP 응답을 나타냅니다.
- @RequestHeader(name = "X-AUTH-TOKEN") String token: 이 어노테이션은 HTTP 요청 헤더 X-AUTH-TOKEN의 값을 token 파라미터에 전달합니다.
- @RequestBody Cart cart: 이 어노테이션은 HTTP 요청 body에 담긴 데이터를 Cart 객체로 변환하여 cart 파라미터에 전달합니다.
- orderApplication.order(token, cart);: OrderApplication 서비스의 order 메서드를 호출하여 주문을 생성합니다. order 메서드는 인증 토큰과 장바구니 정보를 인자로 받아 주문을 생성합니다.
- return ResponseEntity.ok().build();: HTTP 응답을 생성하고 반환합니다. ResponseEntity.ok().build()는 HTTP 상태 코드 200 (OK)과 함께 빈 응답 body를 반환합니다.
4. 핵심 개념 및 추가 설명
- REST (Representational State Transfer): REST는 웹 서비스를 설계하기 위한 아키텍처 스타일입니다. REST는 자원 (Resource)을 URI (Uniform Resource Identifier)로 식별하고, HTTP 메서드 (GET, POST, PUT, DELETE 등)를 사용하여 자원을 조작합니다.
- REST 컨트롤러 (REST Controller): REST 컨트롤러는 RESTful API를 제공하는 컨트롤러입니다. REST 컨트롤러는 HTTP 요청을 처리하고 JSON 또는 XML 형식의 응답을 반환합니다.
- HTTP 요청 헤더 (HTTP Request Header): HTTP 요청 헤더는 클라이언트가 서버에 보내는 요청에 대한 추가 정보를 담고 있습니다. 요청 헤더는 인증 토큰, 콘텐츠 타입, 사용자 에이전트 등 다양한 정보를 포함할 수 있습니다.
- HTTP 요청 body (HTTP Request Body): HTTP 요청 body는 클라이언트가 서버에 보내는 데이터
SearchController
package com.zerobase.cms.order.controller;
import com.zerobase.cms.order.domain.model.ProductDto;
import com.zerobase.cms.order.service.ProductSearchService;
import com.zerobase.domain.config.JwtAuthenticationProvider;
import java.util.List;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
@RequestMapping("/search/product")
@RequiredArgsConstructor
public class SearchController {
private final ProductSearchService productSearchService;
@GetMapping
public ResponseEntity<List<ProductDto>> searchByName(@RequestParam String name) {
return ResponseEntity.ok(productSearchService.searchByName(name).stream()
.map(ProductDto::withoutItemsFrom).collect(Collectors.toList()));
}
@GetMapping("/detail")
public ResponseEntity<ProductDto> getDetail(@RequestParam Long productId) {
return ResponseEntity.ok(ProductDto.from(productSearchService.getByProductId(productId)));
}
}
상품 검색 컨트롤러 (SearchController)
이 코드는 상품 검색 기능을 제공하는 컨트롤러 클래스(SearchController)입니다. 이 컨트롤러는 상품 이름으로 검색하거나, 특정 상품 ID를 사용하여 상품 상세 정보를 조회하는 기능을 제공합니다.
1. 클래스 구조 및 어노테이션
- package com.zerobase.cms.order.controller;: 이 클래스가 com.zerobase.cms.order.controller 패키지에 속해 있음을 나타냅니다. 패키지는 관련 있는 클래스들을 묶어 관리하는 데 사용됩니다.
- import com.zerobase.cms.order.domain.model.ProductDto;: ProductDto 클래스를 가져옵니다. 이 클래스는 상품 정보를 담는 데이터 전송 객체입니다.
- import com.zerobase.cms.order.service.ProductSearchService;: ProductSearchService 클래스를 가져옵니다. 이 클래스는 상품 검색 관련 비즈니스 로직을 처리하는 서비스입니다.
- import com.zerobase.domain.config.JwtAuthenticationProvider;: JwtAuthenticationProvider 클래스를 가져옵니다. (이 클래스는 현재 코드에서 사용되지 않지만, import되어 있습니다.)
- import java.util.List;: List 인터페이스를 가져옵니다. List는 순서가 있는 데이터 컬렉션을 나타냅니다.
- import java.util.stream.Collectors;: Collectors 클래스를 가져옵니다. Collectors는 스트림 데이터를 수집하는 데 사용됩니다.
- import lombok.RequiredArgsConstructor;: Lombok 라이브러리의 어노테이션으로, final 필드나 @NonNull 어노테이션이 붙은 필드에 대한 생성자를 자동으로 생성해줍니다.
- import org.springframework.http.ResponseEntity;: ResponseEntity 클래스를 가져옵니다. 이 클래스는 HTTP 응답을 나타냅니다.
- import org.springframework.web.bind.annotation.GetMapping;: GetMapping 어노테이션을 가져옵니다. 이 어노테이션은 HTTP GET 요청을 처리하는 메서드를 지정합니다.
- import org.springframework.web.bind.annotation.RequestParam;: RequestParam 어노테이션을 가져옵니다. 이 어노테이션은 HTTP 요청 파라미터 값을 메서드 파라미터로 전달합니다.
- import org.springframework.web.bind.annotation.RestController;: RestController 어노테이션을 가져옵니다. 이 어노테이션은 해당 클래스가 REST 컨트롤러임을 나타냅니다.
- import org.springframework.web.bind.annotation.RequestMapping;: RequestMapping 어노테이션을 가져옵니다. 이 어노테이션은 컨트롤러의 기본 URL을 지정합니다.
- @RestController: 이 어노테이션은 해당 클래스가 REST 컨트롤러임을 나타냅니다. REST 컨트롤러는 HTTP 요청을 처리하고 JSON 또는 XML 형식의 응답을 반환합니다.
- @RequestMapping("/search/product"): 이 어노테이션은 컨트롤러의 기본 URL을 /search/product로 지정합니다. 즉, 이 컨트롤러의 모든 메서드는 /search/product로 시작하는 URL을 통해 접근할 수 있습니다.
- @RequiredArgsConstructor: Lombok 라이브러리의 어노테이션으로, final 필드나 @NonNull 어노테이션이 붙은 필드에 대한 생성자를 자동으로 생성해줍니다. 여기서는 productSearchService를 주입받기 위한 생성자가 만들어집니다.
- public class SearchController { ... }: SearchController 클래스를 정의합니다.
2. 클래스 필드
- private final ProductSearchService productSearchService;
: ProductSearchService 타입의 productSearchService 필드를 정의합니다. ProductSearchService는 상품 검색 관련 비즈니스 로직을 처리하는 서비스입니다. final은 이 필드가 한 번 초기화되면 변경될 수 없음을 의미합니다.
3. 메서드
3.1. searchByName(String name)
- 기능: 상품 이름으로 검색합니다.
- @GetMapping: 이 어노테이션은 HTTP GET 요청을 처리하는 메서드임을 나타냅니다. GET 요청은 주로 서버에서 데이터를 가져올 때 사용됩니다. 이 메서드는 /search/product URL로 들어오는 GET 요청을 처리합니다.
- public ResponseEntity<List<ProductDto>> searchByName( ... ) { ... }: searchByName 메서드를 정의합니다.
- public은 이 메서드가 모든 클래스에서 접근 가능하다는 것을 의미합니다.
- ResponseEntity<List<ProductDto>>는 반환 타입으로, HTTP 응답을 나타냅니다. List<ProductDto>는 응답 body에 담긴 상품 정보 목록을 나타내는 데이터 전송 객체 리스트입니다.
- @RequestParam String name: 이 어노테이션은 HTTP 요청 파라미터 name의 값을 name 파라미터에 전달합니다.
즉, 클라이언트가 ?name=검색어와 같은 형식으로 요청하면, name 파라미터에 "검색어"가 전달됩니다. - List<ProductDto> productDtos = productSearchService.searchByName(name).stream() ... collect(Collectors.toList());: 상품 이름으로 검색하고, 결과를 ProductDto 리스트로 변환합니다.
- productSearchService.searchByName(name): ProductSearchService 서비스의 searchByName 메서드를 호출하여 상품 이름으로 검색합니다. searchByName 메서드는 상품 정보 목록을 반환합니다.
- .stream(): 검색 결과를 Stream으로 변환합니다. Stream은 컬렉션 데이터를 효율적으로 처리하기 위한 기능입니다.
- .map(ProductDto::withoutItemsFrom): 스트림의 각 요소를 ProductDto로 변환합니다. ProductDto::withoutItemsFrom은 ProductDto 클래스의 withoutItemsFrom 메서드를 호출하는 메서드 레퍼런스입니다. 이 메서드는 상품 아이템 정보를 제외한 ProductDto 객체를 생성합니다.
- .collect(Collectors.toList()): 스트림의 요소들을 List로 수집합니다. Collectors.toList()는 스트림의 요소들을 List로 수집하는 Collector입니다.
- return ResponseEntity.ok(productDtos);: HTTP 응답을 생성하고 반환합니다. ResponseEntity.ok(productDtos)는 HTTP 상태 코드 200 (OK)과 함께 상품 정보 리스트를 응답 body에 담아 반환합니다.
3.2. getDetail(Long productId)
- 기능: 상품 ID를 사용하여 상품 상세 정보를 조회합니다.
- @GetMapping("/detail"): 이 어노테이션은 HTTP GET 요청을 /search/product/detail URL로 매핑합니다. GET 요청은 주로 서버에서 데이터를 가져올 때 사용됩니다. 이 메서드는 /search/product/detail URL로 들어오는 GET 요청을 처리합니다.
- public ResponseEntity<ProductDto> getDetail( ... ) { ... }: getDetail 메서드를 정의합니다.
- public은 이 메서드가 모든 클래스에서 접근 가능하다는 것을 의미합니다.
- ResponseEntity<ProductDto>는 반환 타입으로, HTTP 응답을 나타냅니다. ProductDto는 응답 body에 담긴 상품 정보를 나타내는 데이터 전송 객체입니다.
- @RequestParam Long productId: 이 어노테이션은 HTTP 요청 파라미터 productId의 값을 productId 파라미터에 전달합니다.
- ProductDto productDto = ProductDto.from(productSearchService.getByProductId(productId));: 상품 ID로 상품 상세 정보를 조회하고, ProductDto로 변환합니다.
- productSearchService.getByProductId(productId): ProductSearchService 서비스의 getByProductId 메서드를 호출하여 상품 ID로 상품 상세 정보를 조회합니다.
- ProductDto.from(...): ProductDto 클래스의 from 메서드를 호출하여 상품 정보를 ProductDto 객체로 변환합니다.
- return ResponseEntity.ok(productDto);: HTTP 응답을 생성하고 반환합니다.
4. 핵심 개념 및 추가 설명
- REST (Representational State Transfer): REST는 웹 서비스를 설계하기 위한 아키텍처 스타일입니다. REST는 자원 (Resource)을 URI (Uniform Resource Identifier)로 식별하고, HTTP 메서드 (GET, POST, PUT, DELETE 등)를 사용하여 자원을 조작합니다.
- REST 컨트롤러 (REST Controller): REST 컨트롤러는 RESTful API를 제공하는 컨트롤러입니다. REST 컨트롤러는 HTTP 요청을 처리하고 JSON 또는 XML 형식의 응답을 반환합니다.
- HTTP 메서드 (HTTP Method): HTTP 메서드는 서버에 요청하는 동작을 지정합니다. 주요 HTTP 메서드는 다음과 같습니다.
- GET: 서버에서 데이터를 가져옵니다.
- POST: 서버에 새로운 데이터를 생성합니다.
- PUT: 서버에 존재하는 데이터를 갱신합니다.
- DELETE: 서버에서 데이터를 삭제합니다.
- URL (Uniform Resource Locator): URL은 웹에서 자원의 위치를 나타내는 문자열입니다.
예를 들어, https://www.example.com/search/product?name=검색어는 www.example.com 서버의 /search/product 경로에 있으며, name 파라미터가 "검색어"인 요청을 나타냅니다. - 요청 파라미터 (Request Parameter): 요청 파라미터는 HTTP 요청 URL에 포함된 파라미터입니다. 요청 파라미터는 ? 기호 뒤에 이름=값 형식으로 지정되며, 여러 파라미터를 지정할 때는 & 기호를 사용합니다.
- DTO (Data Transfer Object): DTO는 서비스 간에 데이터를 주고받을 때 사용되는 객체입니다. DTO는 데이터베이스의 엔티티와 유사하지만, 영속성을 가지지 않고 단순히 데이터를 담는 역할만 합니다.
- Stream API: Stream API는 Java 8부터 도입된 기능으로, 컬렉션 데이터를 효율적으로 처리하기 위한 기능입니다. stream(), map(), filter(), collect() 등의 메서드를 사용하여 데이터를 변환하고 수집할 수 있습니다.
- 메서드 레퍼런스 (Method Reference): 메서드 레퍼런스는 람다 표현식을 간결하게 표현하는 방법입니다. 메서드 레퍼런스는 클래스::메서드 또는 객체::메서드 형식으로 작성됩니다.
SellerProductController
package com.zerobase.cms.order.controller;
import com.zerobase.cms.order.domain.model.ProductDto;
import com.zerobase.cms.order.domain.model.ProductItemDto;
import com.zerobase.cms.order.domain.product.AddProductForm;
import com.zerobase.cms.order.domain.product.AddProductItemForm;
import com.zerobase.cms.order.domain.product.UpdateProductForm;
import com.zerobase.cms.order.domain.product.UpdateProductItemForm;
import com.zerobase.cms.order.service.ProductItemService;
import com.zerobase.cms.order.service.ProductService;
import com.zerobase.domain.config.JwtAuthenticationProvider;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/seller/product")
@RequiredArgsConstructor
public class SellerProductController {
private final ProductService productService;
private final ProductItemService productItemService;
private final JwtAuthenticationProvider provider;
@PostMapping
public ResponseEntity<ProductDto> addProduct(@RequestHeader(name = "X-AUTH-TOKEN") String token,
@RequestBody AddProductForm form) {
return ResponseEntity.ok(ProductDto.from(productService.addProduct(provider.getUserVo(token).getId(), form)));
}
@PostMapping("/item")
public ResponseEntity<ProductDto> addProductItem(@RequestHeader(name = "X-AUTH-TOKEN") String token,
@RequestBody AddProductItemForm form) {
return ResponseEntity.ok(ProductDto.from(productItemService
.addProductItem(provider.getUserVo(token).getId(), form)));
}
@PutMapping
public ResponseEntity<ProductDto> updateProduct(@RequestHeader(name = "X-AUTH-TOKEN") String token,
@RequestBody UpdateProductForm form) {
return ResponseEntity.ok(ProductDto.from(productService.updateProduct(provider.getUserVo(token).getId(), form)));
}
@PutMapping("/item")
public ResponseEntity<ProductItemDto> updateProductItem(@RequestHeader(name = "X-AUTH-TOKEN") String token,
@RequestBody UpdateProductItemForm form) {
return ResponseEntity.ok(ProductItemDto.from(productItemService
.updateProductItem(provider.getUserVo(token).getId(), form)));
}
@DeleteMapping
public ResponseEntity<Void> deleteProduct(@RequestHeader(name = "X-AUTH-TOKEN") String token,
@RequestParam Long id) {
productService.deleteProduct(provider.getUserVo(token).getId(), id);
return ResponseEntity.ok().build();
}
@DeleteMapping("/item")
public ResponseEntity<Void> deleteProductItem(@RequestHeader(name = "X-AUTH-TOKEN") String token,
@RequestParam Long id) {
productItemService.deleteProductItem(provider.getUserVo(token).getId(), id);
return ResponseEntity.ok().build();
}
}
판매자 상품 관리 컨트롤러 (SellerProductController)
이 코드는 판매자가 상품 및 상품 아이템을 관리하는 기능을 제공하는 컨트롤러 클래스(SellerProductController)입니다. 이 컨트롤러는 상품 추가, 상품 아이템 추가, 상품 수정, 상품 아이템 수정, 상품 삭제, 상품 아이템 삭제 기능을 제공합니다.
1. 클래스 구조 및 어노테이션
- package com.zerobase.cms.order.controller;: 이 클래스가 com.zerobase.cms.order.controller 패키지에 속해 있음을 나타냅니다. 패키지는 관련 있는 클래스들을 묶어 관리하는 데 사용됩니다.
- import com.zerobase.cms.order.domain.model.ProductDto;: ProductDto 클래스를 가져옵니다. 이 클래스는 상품 정보를 담는 데이터 전송 객체입니다.
- import com.zerobase.cms.order.domain.model.ProductItemDto;: ProductItemDto 클래스를 가져옵니다. 이 클래스는 상품 아이템 정보를 담는 데이터 전송 객체입니다.
- import com.zerobase.cms.order.domain.product.AddProductForm;: AddProductForm 클래스를 가져옵니다. 이 클래스는 상품 추가 폼 데이터를 담는 객체입니다.
- import com.zerobase.cms.order.domain.product.AddProductItemForm;: AddProductItemForm 클래스를 가져옵니다. 이 클래스는 상품 아이템 추가 폼 데이터를 담는 객체입니다.
- import com.zerobase.cms.order.domain.product.UpdateProductForm;: UpdateProductForm 클래스를 가져옵니다. 이 클래스는 상품 수정 폼 데이터를 담는 객체입니다.
- import com.zerobase.cms.order.domain.product.UpdateProductItemForm;: UpdateProductItemForm 클래스를 가져옵니다. 이 클래스는 상품 아이템 수정 폼 데이터를 담는 객체입니다.
- import com.zerobase.cms.order.service.ProductItemService;: ProductItemService 클래스를 가져옵니다. 이 클래스는 상품 아이템 관련 비즈니스 로직을 처리하는 서비스입니다.
- import com.zerobase.cms.order.service.ProductService;: ProductService 클래스를 가져옵니다. 이 클래스는 상품 관련 비즈니스 로직을 처리하는 서비스입니다.
- import com.zerobase.domain.config.JwtAuthenticationProvider;: JwtAuthenticationProvider 클래스를 가져옵니다. 이 클래스는 JWT 인증을 처리하는 컴포넌트입니다.
- import lombok.RequiredArgsConstructor;: Lombok 라이브러리의 어노테이션으로, final 필드나 @NonNull 어노테이션이 붙은 필드에 대한 생성자를 자동으로 생성해줍니다.
- import org.springframework.http.ResponseEntity;: ResponseEntity 클래스를 가져옵니다. 이 클래스는 HTTP 응답을 나타냅니다.
- import org.springframework.web.bind.annotation.DeleteMapping;: DeleteMapping 어노테이션을 가져옵니다. 이 어노테이션은 HTTP DELETE 요청을 처리하는 메서드를 지정합니다.
- import org.springframework.web.bind.annotation.PostMapping;: PostMapping 어노테이션을 가져옵니다. 이 어노테이션은 HTTP POST 요청을 처리하는 메서드를 지정합니다.
- import org.springframework.web.bind.annotation.PutMapping;: PutMapping 어노테이션을 가져옵니다. 이 어노테이션은 HTTP PUT 요청을 처리하는 메서드를 지정합니다.
- import org.springframework.web.bind.annotation.RequestBody;: RequestBody 어노테이션을 가져옵니다. 이 어노테이션은 HTTP 요청 body에 담긴 데이터를 메서드 파라미터로 전달합니다.
- import org.springframework.web.bind.annotation.RequestHeader;: RequestHeader 어노테이션을 가져옵니다. 이 어노테이션은 HTTP 요청 헤더 값을 메서드 파라미터로 전달합니다.
- import org.springframework.web.bind.annotation.RequestMapping;: RequestMapping 어노테이션을 가져옵니다. 이 어노테이션은 컨트롤러의 기본 URL을 지정합니다.
- import org.springframework.web.bind.annotation.RequestParam;: RequestParam 어노테이션을 가져옵니다. 이 어노테이션은 HTTP 요청 파라미터 값을 메서드 파라미터로 전달합니다.
- import org.springframework.web.bind.annotation.RestController;: RestController 어노테이션을 가져옵니다. 이 어노테이션은 해당 클래스가 REST 컨트롤러임을 나타냅니다.
- @RestController: 이 어노테이션은 해당 클래스가 REST 컨트롤러임을 나타냅니다. REST 컨트롤러는 HTTP 요청을 처리하고 JSON 또는 XML 형식의 응답을 반환합니다.
- @RequestMapping("/seller/product"): 이 어노테이션은 컨트롤러의 기본 URL을 /seller/product로 지정합니다. 즉, 이 컨트롤러의 모든 메서드는 /seller/product로 시작하는 URL을 통해 접근할 수 있습니다.
- @RequiredArgsConstructor: Lombok 라이브러리의 어노테이션으로, final 필드나 @NonNull 어노테이션이 붙은 필드에 대한 생성자를 자동으로 생성해줍니다. 여기서는 productService, productItemService, provider를 주입받기 위한 생성자가 만들어집니다.
- public class SellerProductController { ... }: SellerProductController 클래스를 정의합니다. public은 이 클래스가 모든 패키지에서 접근 가능하다는 것을 의미합니다.
2. 클래스 필드
- private final ProductService productService;: ProductService 타입의 productService 필드를 정의합니다. ProductService는 상품 관련 비즈니스 로직을 처리하는 서비스입니다. final은 이 필드가 한 번 초기화되면 변경될 수 없음을 의미합니다.
- private final ProductItemService productItemService;: ProductItemService 타입의 productItemService 필드를 정의합니다. ProductItemService는 상품 아이템 관련 비즈니스 로직을 처리하는 서비스입니다. final은 이 필드가 한 번 초기화되면 변경될 수 없음을 의미합니다.
- private final JwtAuthenticationProvider provider;: JwtAuthenticationProvider 타입의 provider 필드를 정의합니다. JwtAuthenticationProvider는 JWT 인증을 처리하는 컴포넌트입니다. final은 이 필드가 한 번 초기화되면 변경될 수 없음을 의미합니다.
3. 메서드
3.1. addProduct(String token, AddProductForm form)
- 기능: 상품을 추가합니다.
- @PostMapping: 이 어노테이션은 HTTP POST 요청을 처리하는 메서드임을 나타냅니다. POST 요청은 주로 새로운 데이터를 생성할 때 사용됩니다. 이 메서드는 /seller/product URL로 들어오는 POST 요청을 처리합니다.
- public ResponseEntity<ProductDto> addProduct( ... ) { ... }: addProduct 메서드를 정의합니다.
- public은 이 메서드가 모든 클래스에서 접근 가능하다는 것을 의미합니다.
- ResponseEntity<ProductDto>는 반환 타입으로, HTTP 응답을 나타냅니다. ProductDto는 응답 body에 담긴 상품 정보를 나타내는 데이터 전송 객체입니다.
- @RequestHeader(name = "X-AUTH-TOKEN") String token: 이 어노테이션은 HTTP 요청 헤더 X-AUTH-TOKEN의 값을 token 파라미터에 전달합니다. X-AUTH-TOKEN은 인증 토큰으로, 판매자를 인증하고 권한을 확인하는 데 사용됩니다.
- @RequestBody AddProductForm form: 이 어노테이션은 HTTP 요청 body에 담긴 데이터를 AddProductForm 객체로 변환하여 form 파라미터에 전달합니다. AddProductForm은 상품 추가 폼 데이터를 담는 객체입니다.
- Long sellerId = provider.getUserVo(token).getId();: JWT 토큰에서 판매자 ID를 추출합니다. provider.getUserVo(token)는 JWT 토큰을 파싱하여 사용자 정보를 담은 객체를 반환합니다. getId() 메서드는 판매자 ID를 반환합니다.
- ProductDto productDto = ProductDto.from(productService.addProduct(sellerId, form));: ProductService 서비스의 addProduct 메서드를 호출하여 상품을 추가합니다. addProduct 메서드는 판매자 ID와 상품 추가 폼 객체를 인자로 받아 상품을 추가하고, 추가된 상품 정보를 반환합니다. ProductDto.from(...)은 상품 정보를 ProductDto 객체로 변환합니다.
- return ResponseEntity.ok(productDto);: HTTP 응답을 생성하고 반환합니다. ResponseEntity.ok(productDto)는 HTTP 상태 코드 200 (OK)과 함께 상품 정보를 응답 body에 담아 반환합니다.
3.2. addProductItem(String token, AddProductItemForm form)
- 기능: 상품 아이템을 추가합니다.
- @PostMapping("/item"): 이 어노테이션은 HTTP POST 요청을 /seller/product/item URL로 매핑합니다.
- public ResponseEntity<ProductDto> addProductItem( ... ) { ... }: addProductItem 메서드를 정의합니다.
- @RequestHeader(name = "X-AUTH-TOKEN") String token: 이 어노테이션은 HTTP 요청 헤더 X-AUTH-TOKEN의 값을 token 파라미터에 전달합니다.
- @RequestBody AddProductItemForm form: 이 어노테이션은 HTTP 요청 body에 담긴 데이터를 AddProductItemForm 객체로 변환하여 form 파라미터에 전달합니다.
- Long sellerId = provider.getUserVo(token).getId();: JWT 토큰에서 판매자 ID를 추출합니다.
- ProductDto productDto = ProductDto.from(productItemService.addProductItem(sellerId, form));: ProductItemService 서비스의 addProductItem 메서드를 호출하여 상품 아이템을 추가합니다.
- return ResponseEntity.ok(productDto);: HTTP 응답을 생성하고 반환합니다.
3.3. updateProduct(String token, UpdateProductForm form)
- 기능: 상품을 수정합니다.
- @PutMapping: 이 어노테이션은 HTTP PUT 요청을 처리하는 메서드임을 나타냅니다. PUT 요청은 주로 서버에 존재하는 데이터를 갱신할 때 사용됩니다. 이 메서드는 /seller/product URL로 들어오는 PUT 요청을 처리합니다.
- public ResponseEntity<ProductDto> updateProduct( ... ) { ... }: updateProduct 메서드를 정의합니다.
- @RequestHeader(name = "X-AUTH-TOKEN") String token: 이 어노테이션은 HTTP 요청 헤더 X-AUTH-TOKEN의 값을 token 파라미터에 전달합니다.
- @RequestBody UpdateProductForm form: 이 어노테이션은 HTTP 요청 body에 담긴 데이터를 UpdateProductForm 객체로 변환하여 form 파라미터에 전달합니다.
- Long sellerId = provider.getUserVo(token).getId();: JWT 토큰에서 판매자 ID를 추출합니다.
- ProductDto productDto = ProductDto.from(productService.updateProduct(sellerId, form));: ProductService 서비스의 updateProduct 메서드를 호출하여 상품을 수정합니다.
- return ResponseEntity.ok(productDto);: HTTP 응답을 생성하고 반환합니다.
3.4. updateProductItem(String token, UpdateProductItemForm form)
- 기능: 상품 아이템을 수정합니다.
- @PutMapping("/item"): 이 어노테이션은 HTTP PUT 요청을 /seller/product/item URL로 매핑합니다.
- public ResponseEntity<ProductItemDto> updateProductItem( ... ) { ... }: updateProductItem 메서드를 정의합니다.
- @RequestHeader(name = "X-AUTH-TOKEN") String token: 이 어노테이션은 HTTP 요청 헤더 X-AUTH-TOKEN의 값을 token 파라미터에 전달합니다.
- @RequestBody UpdateProductItemForm form: 이 어노테이션은 HTTP 요청 body에 담긴 데이터를 UpdateProductItemForm 객체로 변환하여 form 파라미터에 전달합니다.
- Long sellerId = provider.getUserVo(token).getId();: JWT 토큰에서 판매자 ID를 추출합니다.
- ProductItemDto productItemDto = ProductItemDto.from(productItemService.updateProductItem(sellerId, form));
: ProductItemService 서비스의 updateProductItem 메서드를 호출하여 상품 아이템을 수정합니다. - return ResponseEntity.ok(productItemDto);: HTTP 응답을 생성하고 반환합니다.
3.5. deleteProduct(String token, Long id)
- 기능: 상품을 삭제합니다.
- @DeleteMapping: 이 어노테이션은 HTTP DELETE 요청을 처리하는 메서드임을 나타냅니다. DELETE 요청은 주로 서버에 존재하는 데이터를 삭제할 때 사용됩니다. 이 메서드는 /seller/product URL로 들어오는 DELETE 요청을 처리합니다.
- public ResponseEntity<Void> deleteProduct( ... ) { ... }: deleteProduct 메서드를 정의합니다.
- public은 이 메서드가 모든 클래스에서 접근 가능하다는 것을 의미합니다.
- ResponseEntity<Void>는 반환 타입으로, HTTP 응답을 나타냅니다. Void는 응답 body가 없음을 나타냅니다.
- @RequestHeader(name = "X-AUTH-TOKEN") String token: 이 어노테이션은 HTTP 요청 헤더 X-AUTH-TOKEN의 값을 token 파라미터에 전달합니다.
- @RequestParam Long id: 이 어노테이션은 HTTP 요청 파라미터 id의 값을 id 파라미터에 전달합니다.
- Long sellerId = provider.getUserVo(token).getId();: JWT 토큰에서 판매자 ID를 추출합니다.
- productService.deleteProduct(sellerId, id);: ProductService 서비스의 deleteProduct 메서드를 호출하여 상품을 삭제합니다.
- return ResponseEntity.ok().build();: HTTP 응답을 생성하고 반환합니다. ResponseEntity.ok().build()는 HTTP 상태 코드 200 (OK)과 함께 빈 응답 body를 반환합니다.
3.6. deleteProductItem(String token, Long id)
- 기능: 상품 아이템을 삭제합니다.
- @DeleteMapping("/item"): 이 어노테이션은 HTTP DELETE 요청을 /seller/product/item URL로 매핑합니다.
- public ResponseEntity<Void> deleteProductItem( ... ) { ... }: deleteProductItem 메서드를 정의합니다.
- @RequestHeader(name = "X-AUTH-TOKEN") String token: 이 어노테이션은 HTTP 요청 헤더 X-AUTH-TOKEN의 값을 token 파라미터에 전달합니다.
- @RequestParam Long id: 이 어노테이션은 HTTP 요청 파라미터 id의 값을 id 파라미터에 전달합니다.
- Long sellerId = provider.getUserVo(token).getId();: JWT 토큰에서 판매자 ID를 추출합니다.
- productItemService.deleteProductItem(sellerId, id);: ProductItemService 서비스의 deleteProductItem 메서드를 호출하여 상품 아이템을 삭제합니다.
- return ResponseEntity.ok().build();: HTTP 응답을 생성하고 반환합니다.
반응형