🤖 Today I ChatGPTed

오버페칭(Over-fetching)과 언더페칭(Under-fetching)에 대해 알려줘!

케로⸝⸝◜࿀◝ ⸝⸝ 2024. 7. 5. 16:44

오버페칭(Over-fetching)과 언더페칭(Under-fetching)은 API 디자인과 데이터 요청에서 자주 언급되는 문제로, 특히 RESTful API와 같은 전통적인 API 설계에서 많이 발생합니다. 이 문제들은 데이터 요청의 효율성과 성능에 큰 영향을 미칠 수 있습니다.

 

오버페칭(Over-fetching)

오버페칭은 클라이언트가 필요로 하는 데이터보다 더 많은 데이터를 요청하고 수신하는 상황을 의미합니다. 이는 불필요한 데이터 전송으로 인해 네트워크 성능과 리소스를 낭비하게 만듭니다. RESTful API에서는 특정 엔드포인트가 고정된 데이터 구조를 반환하기 때문에, 클라이언트가 실제로 필요하지 않은 데이터도 포함되어 있을 수 있습니다.

 

예시

예를 들어, RESTful API에서 특정 사용자의 프로필 정보를 요청한다고 가정해 봅시다. 클라이언트는 사용자 이름과 이메일만 필요하지만, API는 사용자의 전체 프로필 정보를 반환합니다.

GET /users/1

{
  "id": 1,
  "name": "John Doe",
  "email": "john.doe@example.com",
  "address": "123 Main St",
  "phone": "555-1234",
  "website": "johndoe.com"
}

위의 예시에서 클라이언트는 nameemail만 필요하지만, address, phone, website와 같은 불필요한 데이터도 함께 수신하게 됩니다.

 

언더페칭(Under-fetching)

언더페칭은 클라이언트가 필요한 모든 데이터를 단일 요청으로 가져오지 못하고, 여러 번의 추가 요청을 해야만 하는 상황을 의미합니다. 이는 복잡한 데이터 요청을 처리할 때 비효율적이며, 여러 번의 네트워크 요청으로 인해 성능 저하가 발생할 수 있습니다.

 

예시

사용자의 게시물 목록과 각 게시물의 댓글을 가져와야 하는 경우를 생각해봅시다. RESTful API에서 이를 처리하려면 먼저 사용자의 게시물 목록을 가져오고, 각 게시물의 댓글을 별도로 가져와야 합니다.

  1. 첫 번째 요청: 사용자의 게시물 목록을 가져옴
GET /users/1/posts

[
  { "id": 101, "title": "Post 1" },
  { "id": 102, "title": "Post 2" }
]
  1. 두 번째 요청: 첫 번째 게시물의 댓글을 가져옴
GET /posts/101/comments

[
  { "id": 201, "content": "Comment 1" },
  { "id": 202, "content": "Comment 2" }
]
  1. 세 번째 요청: 두 번째 게시물의 댓글을 가져옴
GET /posts/102/comments

[
  { "id": 203, "content": "Comment 3" },
  { "id": 204, "content": "Comment 4" }
]

위와 같이 여러 번의 요청이 필요하게 되면, 클라이언트는 모든 데이터를 가져오기 위해 불필요한 네트워크 왕복을 해야 하므로 성능이 저하됩니다.

 

GraphQL의 해결책

GraphQL은 오버페칭과 언더페칭 문제를 해결하기 위해 설계되었습니다. 클라이언트는 필요한 데이터만 정확히 요청할 수 있기 때문에 오버페칭을 피할 수 있습니다. 또한, 필요한 모든 데이터를 단일 요청으로 가져올 수 있어 언더페칭을 피할 수 있습니다.

 

예시

GraphQL 쿼리를 사용하여 사용자의 이름, 이메일, 게시물 제목 및 각 게시물의 댓글을 한 번에 요청할 수 있습니다.

{
  user(id: "1") {
    name
    email
    posts {
      title
      comments {
        content
      }
    }
  }
}

이렇게 하면 클라이언트는 단일 요청으로 필요한 모든 데이터를 가져올 수 있으며, 불필요한 데이터는 전송되지 않습니다. GraphQL의 이러한 유연성 덕분에 네트워크 성능이 최적화되고 클라이언트-서버 간의 데이터 전송이 효율적으로 이루어질 수 있습니다.

 

반응형