• 공통부를 작성 후 요청/응 답마다 달라지는 data 부분을 작성한다.

요청으로 받는 data(json body)

Request

//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)

Response

//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을 사용하여 로그를 나타낼 수 있다.