[프로그래머스 과제관] API 서버 개발

저니·2023년 3월 29일
1

프로그래머스 과제관을 둘러보다가 실무 역량 과제라길래 한 번 구현해보았다.

기본 요구사항

  • /: { "message": "server check"}로 응답
  • /sum: user.json 파일을 읽어 { "sum" : <값> } 형태로 반환.
  • 응답코드는 전부 200

사용한 언어 및 라이브러리

  • Java를 사용했고, json 파싱을 위해 사용한org.json 를 제외하면 나머진 전부 기본 라이브러리로 구현했다.

구현

응답이 전부 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;
}

JSON 매핑

자바의 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도 만들었다)

테스트

과제 요구사항은 아니지만, 잘 돌아가나 확인하기 위해서 유닛 테스트도 작성했다.

  • 네이밍 규칙에 맞게 잘 변환되는지
  • Json 문자열이 Dto 클래스에 잘 매핑되는지.
    - 굳이 필요는 없지만 중첩 클래스인 경우에도 잘 동작하도록 추가적으로 만들어봤다.

코드

https://github.com/100paperkite/programmers-backend-task

1개의 댓글

comment-user-thumbnail
2023년 5월 8일

안녕하세요!
글 잘읽었습니다!

저도 과제중이라 궁금한 점이있어 질문드립니다!

과제 2번 테스트를 하였을때 "0.0.0.0:5678" 포트로 연결이 안되었다고 나오는데
혹시 따로 설정을 해야하는것인가요??

과제를할때 vs코드에서 run.sh나 setup.sh에서 설정을하는걸까요??
스프링 초보여서 질문드립니다..ㅠㅜ

답글 달기