- 공통부를 작성 후 요청/응 답마다 달라지는 data 부분을 작성한다.
요청으로 받는 data(json body)
//com/example/study/model/network/request/UserApiReuqest.java
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserApiReuqest {
private Long id;
private String account;
private String password; //요청일 때 평문으로 들어옴
private String status;
private String email;
private String phoneNumber;
//가입일자, 생성일자는 서버 단에서 생성되기 때문에 생략함
}
응답으로 보내는 data(json body)
//com/example/study/model/network/response/UserApiResponse.java
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserApiResponse {
private String account;
private Long id;
private String password; //암호화하여 응답
private String status;
private String email;
private String phoneNumber;
private LocalDateTime registeredAt;
private LocalDateTime unregisteredAt;
}
- 이때 API를 작성할 때 snake case로 작성하므로 application.properties에 다음을 추가한다.
spring.jackson.property-naming-strategy=SNAKE_CASE
Service 작성
- CrudInterface를 모든 Controller와 Service에서 공통으로 구현하도록 아래와 같이 수정한다.
public interface CrudInterface<Req, Res> {
Header<Res> create(Header<Req> request);
Header<Res> read(Long id);
Header<Res> update(Header<Req> request);
Header delete(Long id);
}
//com/example/study/service/UserApiLogicService.java
@Service
public class UserApiLogicService implements CrudInterface<UserApiReuqest, UserApiResponse>{
@Autowired
private UserRepository userRepository;
@Override
public Header<UserApiResponse> create(Header<UserApiReuqest> request) {
//1. request data를 가져옴
UserApiReuqest userApiReuqest = request.getData();
//2. User 생성
User user = User.builder()
.account(userApiReuqest.getAccount())
.password(userApiReuqest.getPassword())
.status("REGISTERED")
.phoneNumber(userApiReuqest.getPhoneNumber())
.email(userApiReuqest.getEmail())
.registeredAt(LocalDateTime.now())
.build();
User newUser = userRepository.save(user);
//3. 생성된 데이터를 UserApiResponse로 만들어 리턴
return response(newUser);
}
//...
/**
* User -> UserApiResponse
* @param user
* @return
*/
private Header<UserApiResponse> response(User user){
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 Header.OK(userApiResponse);
}
}
- Service에서도 마찬가지로 CrudInterface를 구현한다.
- create는 UserApiReuqest를 UserApiResponse로 바꿔 리턴하도록 작성한다.
- 응답은 다른 메소드에서 공통으로 사용하기 위해 따로 빼서 작성한다.
Controller 작성
@Slf4j //JAVA에서 간단하게 사용하는 로깅 시스템
@RestController
@RequestMapping("/api/user")
public class UserApiController implements CrudInterface<UserApiReuqest, UserApiResponse> {
@Autowired
private UserApiLogicService userApiLogicService;
@Override
@PostMapping("") // /api/user
public Header<UserApiResponse> create(@RequestBody Header<UserApiReuqest> request) {
log.info("{}", request);
return userApiLogicService.create(request);
}
}
- Controller에서는 데이터를 받고 리턴하는 역할만 수행하도록 작성하면 된다.
- lombok의
@Slf4j
을 사용하여 로그를 나타낼 수 있다.