Java

[어드민 페이지 만들기] 서비스 로직 개발_API 만들기 (Update, Delete)

15호의 개발자 2022. 3. 24. 12:00
반응형

[어드민 페이지 만들기] 서비스 로직 개발_API 만들기 (Update, Delete)

 


 

 

 

3. Update

 

 

update의 경우 create와 URL 주소도 동일하는 등 매우 유사하다. 대신 id 값이 들어있고, 메소드 방식은 PUT이라는 차이점이 있다. request는 어떤 id에 대해서 어떤 값을 업데이트 해달라는 요청이 오면 그 값들을 바꿔주고, response는 동일하게 user 객체를 가지고 해당 정보를 내려주면 된다.

 

 

 

UserApiController

@Slf4j
@RestController
@RequestMapping("/api/user")
public class UserApiController implements CrudInterface<UserApiRequest, UserApiResponse> {

    @Autowired
    private UserApiLogicService userApiLogicService;
    
    // create, read 생략, 이전 글 참고
    
    @Override
    @PutMapping("") // /api/user
    public Header<UserApiResponse> update(@RequestBody Header<UserApiRequest> request) {
        return userApiLogicService.update(request);
    }
    
}

 

우선 return에 userApiLogicService에 update로 request를 연결시켜 준다. 그리고 서비스단을 작성한다. 

 

 

 

UserApiLogicService

@Service
public class UserApiLogicService implements CrudInterface<UserApiRequest, UserApiResponse> {

    // create, read 생략, 이전 글참고
    
    @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. 1번에서 받아온 data를 가지고 update하기
        // 4. userApiResponse 만들기
            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가 일어나고
        .map(updateUser -> response(updateUser)) // 여기서 userApiResponse가 만들어진다
        .map(userApiResponse -> Header.OK(userApiResponse))
        .orElseGet(() -> Header.ERROR("데이터 없음"));

    }
    
    private UserApiResponse response(User user) {
    
        // user 객체를 가지고 userApiResponse를 return해주는 함수
        UserApiResponse userApiResponse = UserApiResponse.builder()
                .id(user.getId())
                .account(user.getAccount())
                .password(user.getPassword())   // todo 암호화, 길이를 return한다든지 등의 옵션이 생길 수 있음
                .email(user.getEmail())
                .phoneNumber(user.getPhoneNumber())
                .status(user.getStatus())
                .registeredAt(user.getRegisteredAt())
                .unregisteredAt(user.getUnregisteredAt())
                .build();

        // Header에 data 부분을 합쳐서 return하기
        return Header.OK(response(newUser));
        
    }
    
}

service 레벨에서 하는 것은, 먼저 데이터를 가져온 후 id를 가지고 user 데이터를 찾은 다음에, update를 시켜주고 userApiResponse를 만들어주면 된다. 이때, request를 받을 때 여러 예외사항이 있을 수 있지만, 일단 모든 값이 정상적으로 들어왔다고 가정하고 코딩을 했다.

 

 

컨트롤러와 update가 연결되었기 때문에 프로젝트를 다시 실행시킨다. 먼저 데이터가 잘 내려오는지 rest client 툴을 이용해 확인해보자.

 

 

1번 user는 존재하므로 response가 위와 같이 내려왔을 것이다. 이 response body 부분은 우리가 요청하려고 하는 request와 유사하므로 일단 이 부분을 복사해놓고 update시 이용해보자.

 

 

메서드 방식을 PUT 방식으로 바꾼 다음에, BODY 부분에 아까 복사한 것을 붙여넣기 한 다음에 위와 같이 몇 가지 값들을 직접 변경한 후 send를 누른다. 

 

id 1번에 대해서 변경한 값들이 정상적으로 바뀐 것을 확인할 수 있다. GET 방식으로 바꿔서 1번 유저에 대한 정보를 받아오면 update된 값으로 조회될 것이다.

 

 


 

4. Delete

 

 

delete의 경우 get 방식과 동일하게 path parameter로 받을 예정이고, 대신 http 메서드를 DELETE를 호출해줘야한다. 삭제할 user의 id 값을 알고 있으면 /api/user/{id} 주소로 DELETE 메서드를 요청하게 된다. response의 경우, 데이터를 삭제했기 때문에 따로 데이터를 내려줄 것은 없으며, 응답코드에 따라서 delete가 정상적으로 되었는지 혹은 존재하지 않는 사용자인지를 알려줄 예정이다.

 

 

 

UserApiController

@Slf4j
@RestController
@RequestMapping("/api/user")
public class UserApiController implements CrudInterface<UserApiRequest, UserApiResponse> {

    @Autowired
    private UserApiLogicService userApiLogicService;
    
    // create, read, update 생략, 이전 글 참고
    
    @Override
    @DeleteMapping("{id}")  // /api/user/{id}
    public Header delete(@PathVariable Long id) {
        log.info("delete: {}", id);
        return userApiLogicService.delete(id);
    }
    
}

 

어떤 사용자가 삭제되었는지를 확인하기 위해 log.info로 찍어보는 코드도 추가했다.

 

 

 

UserApiLogicService

@Service
public class UserApiLogicService implements CrudInterface<UserApiRequest, UserApiResponse> {

    // create, read, update 생략, 이전 글참고
    
    @Override
    public Header delete(Long id) {
    
        // 1. id를 가지고 repository를 통해 user를 찾고
        Optional<User> optional = userRepository.findById(id);

        // 2. repository를 통해 delete를 해주고
        // 3. response를 return해주기기
        return optional.map(user -> {
            userRepository.delete(user);
            return Header.OK();
        })
        .orElseGet( ()-> Header.ERROR("데이터 없음"));
        
    }
    
    private UserApiResponse response(User user) {
    
        // user 객체를 가지고 userApiResponse를 return해주는 함수
        UserApiResponse userApiResponse = UserApiResponse.builder()
                .id(user.getId())
                .account(user.getAccount())
                .password(user.getPassword())   // todo 암호화, 길이를 return한다든지 등의 옵션이 생길 수 있음
                .email(user.getEmail())
                .phoneNumber(user.getPhoneNumber())
                .status(user.getStatus())
                .registeredAt(user.getRegisteredAt())
                .unregisteredAt(user.getUnregisteredAt())
                .build();

        // Header에 data 부분을 합쳐서 return하기
        return Header.OK(response(newUser));
        
    }
    
}

 

순서는 다음과 같다. id를 가지고 repository를 통해 user를 먼저 찾고, repository를 통해 delete를 해준 다음에, delete가 잘 되었는지에 대한 response를 return 해주면 된다.

 

 

 

 

 

rest client 툴을 통해 1번 user를 delete해보자. 메서드 방식을 DELETE로 선택한 후 /api/user/1을 입력한 다음에 send를 누른다. 

 

 

정상적으로 지워졌으면 result_code에 "OK"라고 뜰 것이다. 

 

 

GET 메서드로 1번 user를 조회해보면 "데이터 없음"이라고 뜨면 정상적으로 삭제가 된 것이다. 

 

 

 

또한 위와 같이 100번 user로 없는 데이터를 delete한다고 하면 result_code가 "ERROR"로 뜨면서 "데이터 없음"이라고 뜬다.

 


 

지금까지 CRUD를 직접 작성해봤다. CRUD의 경우 공통되는 부분이라 이를 추상화하여 작업하기도 하지만, 공부를 위해 직접 작성해보았다.

 

 

 

 

(출처: 패스트캠퍼스 Java & SpringBoot로 시작하는 웹 프로그래밍)

 

 

 

 

 

반응형