API 작성 - 기본

Jaca·2021년 9월 5일
0

가장 기본적인 http API 메서드를 작성해보고 점진적으로 버전을 업그레이드 하는 방식으로 진행 된다.

Get Method

Get Method는 보통 조회할 때 사용되며, 이름 그대로 가져온다는 의미이다.
DB, CRUD의 select에 해당한다.

Get Method를 통해 Member의 목록을 조회해보자.

V1

아주 간단하고 직관적이다.
하지만 일전의 강의를 많이 들었으니 문제점들이 보여야 한다.

가장 직관적으로 엔티티를 화면에 뿌려서는 안된다.

엔티티를 바로 반환하게 되면,

  • 엔티티에 프레젠테이션 계층을 위한 로직이 추가된다.
  • 패스워드 같은 중요한 속성같이 모든 값이 노출된다.
  • 응답 스펙을 맞추기 위해 로직이 추가된다. (@JsonIgnore, 별도의 뷰 로직 등등)
  • 실무에서는 같은 엔티티에 대해 API가 용도에 따라 다양하게 만들어지는데, 한 엔티티에 각각의 API를 위한 프레젠테이션 응답 로직을 담기는 어렵다.
  • 엔티티가 변경되면 API 스펙이 변한다.
  • 추가로 컬렉션을 직접 반환하면 항후 API 스펙을 변경하기 어렵다.(별도의 Result 클래스 생성으로 해결)

그래서 순수 값 전달을 위한 클래스인 DTO를 만들어야 한다.

V2

V1의 문제를 해결하기 위해, API에 맞는 속성들 가지고 있는 DTO를 생성해서, DTO를 통해서 값을 전달해준다.

화면에 뿌려주기 위한 Result 클래스를 따로 짠 이유는, V1의 메서드를 돌려보면

[ // <<<<< '배열' 이다.
    {
        "id": 1,
        "name": "new_hello",
        "address": null,
        "orders": []
    }, {.......}
] // <<<<< '배열' 이다.

보시다싶이 List를 리턴하기 때문에 배열의 형태로 출력이 된다는점.
그러면 위의 문제점 말고도, API 스펙을 변경하고자해도 할 수가 없다는 점

그것을 해결하기 위한 클래스이다.

V2

{
    "count": 3,
    "data": [
        {
            "name": "new_hello"
        },
        {
            "name": "member1"
        },
        {
            "name": "member2"
        }
    ]
}

data와 같이 내부에 배열을 값으로 가지고 있는 것과, 전체를 배열로 가져오는 것은 천지차이이다.

T 제네릭에 대해 작성하고 싶었는데, 아직 자바의정석을 거기까지 못나갔넹.
추후에 봐서 링크를 달도록 합시당.

Post Method

Post Method는 DB의 insert로 이해하면 된당.

위 메서드의 문제점이 무엇일까,

솔직히 뭐 다르지않다.
엔티티를 바로 받는다는 점, Get의 문제점과 같다.
결론은 DTODOTODTODOTDOTODOTODTODOTODOTODOTDOTODOTODTOD
DTO를 사용하자.

실무에서는 회원 엔티티를 위한 API가 다양하게 만들어지는데, 한 엔티티에 각각의 API를 위한 모든 요청 요구사항을 담기는 어렵다.
가장 메인이지 않을까 싶다.

V2

DTO 를 엔티티 대신에 RequestBody와 매핑한다.
엔티티와 프레젠테이션 계층을 위한 로직을 분리할 수 있다.
엔티티와 API 스펙을 명확하게 분리할 수 있다.
엔티티가 변해도 API 스펙이 변하지 않는다.

Put Method

Put Method는 DB의 update로 이해하면 된당.
하지만 update를 할 때, Put만을 사용하지는 않는다.
Post와 Put을 많이 비교하고, 수정에도 Petch Method가 또 있다.

POST와 PUT의 가장 큰 차이는 POST는 request message로 포함된 엔티티를 이용해 새로운 자원을 생성해 내는것이고, PUT은 request message와 함께 넘어온 식별자의 자원을 만드는것이다.
똑같은 요청이 POST로 2번 날아오면 POST는 2개의 자원을 생성한다.
PUT으로 동일한 요청을 2번 날린다면, 이때 PUT은 식별자를 포함해야한다.
다만 꼭 존재하는 식별자를 포함할 필요는 없으므로 존재하지않는 식별자로 요청을 하게되면 이때는 POST와 동일하게 자원을 생성한다. 하지만 두번째 요청에선 이미 첫번째 요청에서 생성된 자원이 있으므로 자원을 생성하지않고 교체하게된다. 이 부분이 POST와 PUT이 달라지게된다.

PATCH는 수정만 담당하며 리소스의 일부분만 수정할 때 사용하고, PUT은 리소스의 모든 속성을 수정하기 위해 사용한다.

PUT은 마치 merge 같달까..

MemberService.update()

    @Transactional
    public void update(Long id, String name) {
        Member member = memberRepository.findOne(id);
        member.setName(name);
    }

이것도 당연히 DTO를 사용해야 한다.

여기서 PUT 방식을 사용했는데, PUT은 전체 업데이트를 할 때 사용하는 것이 맞다. 부분 업데이트를 하려면 PATCH를 사용하거나 POST를 사용하는 것이 REST 스타일에 맞다.

profile
I am me

0개의 댓글