Sangwon Coding
Spring Boot - 사용자 API CRUD 본문
UserApiController.java
package com.example.study.controller.api;
import com.example.study.ifs.CrudInterface;
import com.example.study.model.network.Header;
import com.example.study.model.network.request.UserApiRequest;
import com.example.study.model.network.response.UserApiResponse;
import com.example.study.model.network.response.UserOrderInfoApiResponse;
import com.example.study.service.UserApiLogicService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("/api/user")
public class UserApiController implements CrudInterface<UserApiRequest, UserApiResponse> {
@Autowired
private UserApiLogicService userApiLogicService;
@Override
@PostMapping("") // /api/user
public Header<UserApiResponse> create(@RequestBody Header<UserApiRequest> request) {
log.info("{}",request);
return userApiLogicService.create(request);
}
@Override
@GetMapping("{id}") // /api/user/{id}
public Header<UserApiResponse> read(@PathVariable(name = "id") Long id) {
log.info("read id : {}",id);
return userApiLogicService.read(id);
}
@Override
@PutMapping("") // /api/user
public Header<UserApiResponse> update(@RequestBody Header<UserApiRequest> request) {
return userApiLogicService.update(request);
}
@Override
@DeleteMapping("{id}") // /api/user/{id}
public Header delete(@PathVariable Long id) {
log.info("delete : {}",id);
return userApiLogicService.delete(id);
}
}
UserApiLogicService.java
package com.example.study.service;
import com.example.study.ifs.CrudInterface;
import com.example.study.model.entity.Item;
import com.example.study.model.entity.OrderGroup;
import com.example.study.model.entity.User;
import com.example.study.model.enumclass.UserStatus;
import com.example.study.model.network.Header;
import com.example.study.model.network.Pagination;
import com.example.study.model.network.request.UserApiRequest;
import com.example.study.model.network.response.ItemApiResponse;
import com.example.study.model.network.response.OrderGroupApiResponse;
import com.example.study.model.network.response.UserApiResponse;
import com.example.study.model.network.response.UserOrderInfoApiResponse;
import com.example.study.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Service
public class UserApiLogicService implements CrudInterface<UserApiRequest , UserApiResponse> {
@Autowired
private UserRepository userRepository;
// 1. request data
// 2. user 생성
// 3. 생성된 데이터 -> UserApiResponse return
@Override
public Header<UserApiResponse> create(Header<UserApiRequest> request) {
// 1. request data
UserApiRequest userApiRequest = request.getData();
// 2. User 생성
User user = User.builder()
.account(userApiRequest.getAccount())
.password(userApiRequest.getPassword())
.status(UserStatus.REGISTERED)
.phoneNumber(userApiRequest.getPhoneNumber())
.email(userApiRequest.getEmail())
.registeredAt(LocalDateTime.now())
.build();
User newUser = userRepository.save(user);
// 3. 생성된 데이터 -> userApiResponse return
return Header.OK(response(newUser));
}
@Override
public Header<UserApiResponse> read(Long id) {
return userRepository.findById(id)
.map(user -> response(user))
.map(Header::OK)
.orElseGet(
()->Header.ERROR("데이터 없음")
);
}
@Override
public Header<UserApiResponse> update(Header<UserApiRequest> request) {
// 1. data
UserApiRequest userApiRequest = request.getData();
// 2. id -> user 데이터 를 찾고
Optional<User> optional = userRepository.findById(userApiRequest.getId());
return optional.map(user -> {
// 3. data -> update
// id
user.setAccount(userApiRequest.getAccount())
.setPassword(userApiRequest.getPassword())
.setStatus(userApiRequest.getStatus())
.setPhoneNumber(userApiRequest.getPhoneNumber())
.setEmail(userApiRequest.getEmail())
.setRegisteredAt(userApiRequest.getRegisteredAt())
.setUnregisteredAt(userApiRequest.getUnregisteredAt())
;
return user;
})
.map(user -> userRepository.save(user)) // update -> newUser
.map(user -> response(user)) // userApiResponse
.map(Header::OK)
.orElseGet(()->Header.ERROR("데이터 없음"));
}
@Override
public Header delete(Long id) {
// 1. id -> repository -> user
Optional<User> optional = userRepository.findById(id);
// 2. repository -> delete
return optional.map(user ->{
userRepository.delete(user);
return Header.OK();
})
.orElseGet(()->Header.ERROR("데이터 없음"));
}
public Header<List<UserApiResponse>> search(Pageable pageable) {
Page<User> users = userRepository.findAll(pageable);
List<UserApiResponse> userApiResponseList = users.stream()
.map(user -> response(user))
.collect(Collectors.toList());
Pagination pagination = Pagination.builder()
.totalPages(users.getTotalPages())
.totalElements(users.getTotalElements())
.currentPage(users.getNumber())
.currentElements(users.getNumberOfElements())
.build();
return Header.OK(userApiResponseList,pagination);
}
private UserApiResponse response(User user){
// user -> userApiResponse
UserApiResponse userApiResponse = UserApiResponse.builder()
.id(user.getId())
.account(user.getAccount())
.password(user.getPassword()) // todo 암호화, 길이
.email(user.getEmail())
.phoneNumber(user.getPhoneNumber())
.status(user.getStatus())
.registeredAt(user.getRegisteredAt())
.unregisteredAt(user.getUnregisteredAt())
.build();
return userApiResponse;
}
}
CREATE
READ
UPDATE
DELETE
'Spring > Spring Boot (어드민 페이지)' 카테고리의 다른 글
Spring Boot - 주문내역 API CRUD (0) | 2020.01.01 |
---|---|
Spring Boot - 상품 API CRUD (0) | 2020.01.01 |
Spring Boot - CRUD 인터페이스 정의와 ResponseBody 공통부 작성 (0) | 2019.12.23 |
Spring Boot - JPA의 추가기능 (Builder, Chain) (0) | 2019.12.06 |
Spring Boot - 연관관계 설정 (0) | 2019.12.06 |
Comments