개요
이번에는 매장 서비스를 구현해 보겠다. 매장 서비스는 주로 매장 목록 조회에 필요하고 매장 상세 보기 정도의 정보를 응답할 수 있는 서비스이다. 일단 기본적으로 카테고리와 연관 관계를 맺고 있지만 다른 서비스와는 독립적으로 구성되어 있으므로 따로 카테고리 서비스를 만들지 않고 그냥 매장 + 카테고리로 프로젝트를 만들기로 했다.

Entity
@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
@Table(name = "stores")
@Entity
public class Store {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "category_id")
private Category category;
private String name;
@Column(name = "region_code")
private String regionCode; // 법정동 코드
private String address; // 구 주소
@Column(name = "road_address")
private String roadAddress; // 도로명 주소
private String image;
private String tel;
private String description;
}
@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
@Table(name = "categories")
@Entity
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private String image;
@OneToMany(mappedBy = "category")
List<Store> storeList;
}
매장과 카테고리를 다대일 관계로 매핑해주었다.
이번에 많이 고민했던 점은 어떻게 고객의 지역구를 구할지가 문제였다. 여러 가지 찾아보고 한 결과, 법정동코드를 이용해서 고객의 시군구까지의 법정동코드를 이용해서 동일한 방법으로 매장의 코드를 변경해 찾아보는 방법이 괜찮은 것 같았다.
법정동코드는 10자리로 구성되어 있는데 앞자리부터 시도(2) / 시군구(3) / 읍면동(3) / 리(2) 라고 한다. 그래서 매장과 회원의 법정동코드에서 앞 5자리만 추출하면 같은 구인지 알 수 있는 것이다.
Controller
@RequestMapping("/stores")
@RequiredArgsConstructor
@RestController
public class StoreController {
private final StoreService storeService;
// 카테고리로 매장 검색, 쿼리 파라미터에 page, size, sort 포함
@GetMapping
public Slice<ResponseStore> getStoresByCategory(@RequestParam("region_code") String regionCode,
@RequestParam Integer categoryId, Pageable pageable) {
return storeService.getStoresByCategory(regionCode, categoryId, pageable);
}
}
@RequestMapping("/category")
@RequiredArgsConstructor
@RestController
public class CategoryController {
private final CategoryService categoryService;
@PostMapping
public ResponseCategory save(@RequestBody RequestCategory requestCategory) {
return categoryService.save(requestCategory);
}
}
아직 기능을 전부 구현한 건 아니고 극히 일부만 구현했지만 조금씩 추가할 예정이다.
매장의 경우는 생각할 내용이 많은데 아무래도 매장 목록을 한 번에 보여줄 수는 없으니 페이징 기능을 이용해서 Slice로 반환하도록 했다. 페이징은 처음 사용해 보는데 잘 될지 모르겠다. 이 부분은 테스트해보고 고칠 게 있으면 수정해야겠다.
Service
@RequiredArgsConstructor
@Service
public class StoreServiceImpl implements StoreService {
private final StoreRepository storeRepository;
@Override
public Slice<ResponseStore> getStoresByCategory(String regionCode, Integer categoryId, Pageable pageable) {
Slice<Store> foundStores = storeRepository.findByRegionCodeAndCategoryId(regionCode, categoryId, pageable);
return foundStores.map(StoreMapper.INSTANCE::toResponseStore);
}
}
@RequiredArgsConstructor
@Service
public class CategoryServiceImpl implements CategoryService {
private final CategoryRepository categoryRepository;
@Override
public ResponseCategory save(RequestCategory requestCategory) {
Category savedCategory = categoryRepository.save(CategoryMapper.INSTANCE.toCategory(requestCategory));
return CategoryMapper.INSTANCE.toResponseCategory(savedCategory);
}
}
내용은 별거 없긴 한데 엔티티를 다른 객체 형태로 변환시키는 과정이 있다. 나는 이 부분을 MapStruct를 사용해서 해결했다.
@Mapper(componentModel = ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface StoreMapper {
StoreMapper INSTANCE = Mappers.getMapper(StoreMapper.class);
ResponseStore toResponseStore(Store store);
}
카테고리 부분도 같은 방식으로 처리했다.
Repository
public interface StoreRepository extends JpaRepository<Store, Long> {
Slice<Store> findByRegionCodeAndCategoryId(String regionCode, Integer categoryId, Pageable pageable);
}
public interface CategoryRepository extends JpaRepository<Category, Integer> {
}
Data JPA를 사용하기 때문에 무언가 구현하지 않아도 된다. 페이징이나 조건 부분이 잘 될지 모르겠지만 나중에 검색 조건이 많아지면 Querydsl도 생각해 봐야겠다.
'공부 > Spring Cloud' 카테고리의 다른 글
| [Spring Cloud] EC2에서 Docker Kafka 에러 해결하기 (0) | 2024.05.13 |
|---|---|
| [Spring Cloud][7] config-service 추가 및 설정 대칭키 암호화 (0) | 2024.05.10 |
| [Spring Cloud][5] JWT, OAuth2 로그아웃 구현하기 (0) | 2024.05.04 |
| [Spring Cloud][4] JWT, OAuth2로 로그인 하기 (0) | 2024.05.03 |
| [Spring Cloud][3] User 마이크로 서비스 구현하기 1 (1) | 2024.04.28 |