프로그래머스 과제관을 둘러보다가 실무 역량 과제라길래 한 번 구현해보았다.
/
: { "message": "server check"}
로 응답/sum
: user.json
파일을 읽어 { "sum" : <값> }
형태로 반환.200
Java
를 사용했고, json 파싱을 위해 사용한org.json
를 제외하면 나머진 전부 기본 라이브러리로 구현했다.응답 형태가 모두 JSON이었기에 Spring
에서 ResponseEntity<T>
형태로 JSON 응답을 반환하는 것 처럼, 선언한 Dto클래스 반환하면 바로 JSON 응답으로 가도록 만들었다.
이를 위해 따로 Json응답을 반환할 수 있는 JsonHttpHandler 추상 클래스를 만들고, 각 응답별로 구현 클래스를 두었다.
public abstract class JsonHttpHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
// Set headers
Headers headers = exchange.getResponseHeaders();
headers.set("Content-Type", "application/json");
String response = "";
// Get response
try {
response = JsonMapper.toJson(this.response());
exchange.sendResponseHeaders(200, response.length());
}
catch (Exception e){
exchange.sendResponseHeaders(500, response.length());
}
finally {
OutputStream os = exchange.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
public abstract <T> T response() throws Exception;
}
자바의 Reflection 을 이용해서 Dto 클래스의 필드에 json을 파싱한 결과를 매핑시켰는데, 보통 자바에서는 필드명은 주로 camelCase
를 쓰는 반면에 과제관에서 준 user.json
의 필드는 user_id
같은 snake_case
라서 이걸 자동으로 매핑하는 코드도 만들어봤다. (사실 Dto 클래스의 필드명을 snake_case
로 해버리면 되는데, 어노테이션 기반으로 자동으로 만들어보고 싶어서 네이밍을 표시하는 어노테이션을 만들었다 😅)
public class User {
@SnakeCase(from = NamingRule.CAMEL)
private Long userId;
@SnakeCase(from = NamingRule.CAMEL)
private String username;
@CustomCase(value = "post_count")
private int postCount;
public Long getUserId() {
return user_id;
}
public String getUsername() {
return username;
}
public int getPostCount() {
return postCount;
}
}
매핑될 JSON에서의 필드 네이밍이 무엇인지 @SnakeCase처럼 명시하고 지금 필드명의 네이밍 규칙이 무엇인지 from
으로 알 수 있게 만들어봤다. (그리고 심심해서 추가적으로 네이밍 규칙이 없는 경우를 대비해 CustomCase도 만들었다)
과제 요구사항은 아니지만, 잘 돌아가나 확인하기 위해서 유닛 테스트도 작성했다.
안녕하세요!
글 잘읽었습니다!
저도 과제중이라 궁금한 점이있어 질문드립니다!
과제 2번 테스트를 하였을때 "0.0.0.0:5678" 포트로 연결이 안되었다고 나오는데
혹시 따로 설정을 해야하는것인가요??
과제를할때 vs코드에서 run.sh나 setup.sh에서 설정을하는걸까요??
스프링 초보여서 질문드립니다..ㅠㅜ