IMCAT.DEV
로그인 가입
Kotlin 중급 네트워크

Kotlin 네트워크 I/O 기초

Kotlin 네트워크 I/O 기초 — 중급

네트워크 I/O 기초

1. 도입 (왜 배워야 하는가)

네트워크 I/O(Input/Output)는 소프트웨어가 외부 시스템과 데이터를 주고받는 방식입니다. 현대의 애플리케이션은 데이터베이스와 서버, 클라우드 서비스와 통신해야 하며, 이 과정에서 네트워크 I/O가 필수적입니다. 이를 이해하지 못하면, 데이터 통신에서 발생할 수 있는 오류나 성능 저하를 피할 수 없게 됩니다. 특히, 사용자 경험을 고려할 때, 네트워크 통신이 원활하게 이뤄지지 않으면 애플리케이션의 신뢰성을 떨어뜨릴 수 있습니다. 예를 들어 쇼핑몰 애플리케이션에서 장바구니에 물건을 추가할 때, 서버와의 통신이 원활하지 않으면 사용자는 불편을 겪게 되죠.

2. 핵심 개념 설명

2.1. 네트워크 I/O

네트워크 I/O는 데이터를 송수신하는 과정을 뜻합니다. 마치 전화로 대화하는 것처럼, 한 쪽에서 말을 하면 다른 쪽에서 듣고 또 답변하는 방식으로 데이터를 주고받습니다.

2.2. 비동기와 동기

  • 동기(Synchronous): 요청을 보내고 응답을 받을 때까지 기다리는 방식입니다. 마치 친구에게 메시지를 보내고 답장이 올 때까지 기다리는 것과 같습니다.
  • 비동기(Asynchronous): 요청을 보내고 응답을 기다리지 않고 다른 작업을 수행하는 방식입니다. 친구에게 메시지를 보내고, 답장이 올 때까지 다른 일을 하면서 기다리는 것과 비슷합니다.
  • 용어설명
    동기요청 후 응답을 기다리는 방식
    비동기요청 후 다른 작업을 수행하며 응답을 기다림

    3. 기본 코드 예제

    아래는 Kotlin을 사용하여 간단한 GET 요청을 보내는 코드입니다.

    import java.net.HttpURLConnection
    import java.net.URL
    
    fun main() {
        val url = URL("https://jsonplaceholder.typicode.com/posts/1")
        val connection = url.openConnection() as HttpURLConnection
    
        try {
            connection.requestMethod = "GET" // 요청 방식 설정
            val responseCode = connection.responseCode // 응답 코드 가져오기
            println("응답 코드: $responseCode") // 응답 코드 출력
    
            if (responseCode == HttpURLConnection.HTTP_OK) { // 성공적인 응답인지 확인
                val response = connection.inputStream.bufferedReader().readText() // 응답 데이터 읽기
                println("응답 데이터: $response") // 응답 데이터 출력
            }
        } finally {
            connection.disconnect() // 연결 종료
        }
    }

    실행 결과

    응답 코드: 200
    응답 데이터: { "userId": 1, "id": 1, "title": "...", "body": "..." }

    코드 한 줄씩 동작 설명

    1. import java.net.HttpURLConnection: HTTP 연결을 사용하기 위해 필요한 라이브러리를 가져옵니다.
    2. val url = URL(...): 요청할 URL을 지정합니다.
    3. val connection = url.openConnection() as HttpURLConnection: URL로부터 연결을 생성합니다.
    4. connection.requestMethod = "GET": 요청 방식을 GET으로 설정합니다.
    5. val responseCode = connection.responseCode: 서버로부터 응답 코드를 받아옵니다.
    6. println("응답 코드: $responseCode"): 응답 코드를 출력합니다.
    7. if (responseCode == HttpURLConnection.HTTP_OK): 응답 코드가 200(성공)일 경우에만 다음을 실행합니다.
    8. val response = connection.inputStream.bufferedReader().readText(): 서버로부터 받은 데이터를 읽습니다.
    9. println("응답 데이터: $response"): 응답 데이터를 출력합니다.
    10. connection.disconnect(): 연결을 종료합니다.
    11. 4. 실전 활용 예제

      4.1. 쇼핑몰에서 장바구니 구현

      사용자가 장바구니에 상품을 추가할 때 서버와 통신을 해야 합니다. 비동기 방식으로 요청을 보내면 사용자는 기다리지 않고 다른 작업을 할 수 있습니다.

      // 비동기 요청 (코루틴 사용 예)
      import kotlinx.coroutines.*
      import java.net.HttpURLConnection
      import java.net.URL
      
      fun main() = runBlocking {
          launch {
              val url = URL("https://example.com/cart/add")
              val connection = url.openConnection() as HttpURLConnection
              connection.requestMethod = "POST"
              connection.outputStream.bufferedWriter().use { writer ->
                  writer.write("itemId=123") // 추가할 상품 ID 전송
              }
              val response = connection.inputStream.bufferedReader().readText()
              println("서버 응답: $response")
          }
      }

      4.2. 채팅 애플리케이션 구현

      채팅 애플리케이션에서는 비동기 통신이 필수적입니다. 사용자가 메시지를 보내면서도 다른 메시지를 받을 수 있도록 해야 하기 때문입니다.

      5. 흔한 실수와 주의사항

      실수 1: 연결 종료를 잊음

    12. 잘못된 코드
    13. // 연결 종료를 하지 않음
      val connection = url.openConnection() as HttpURLConnection
      // ... 작업 수행
    14. 올바른 코드
    15. val connection = url.openConnection() as HttpURLConnection
      try {
          // ... 작업 수행
      } finally {
          connection.disconnect() // 항상 연결 종료
      }

      실수 2: 응답 코드 확인 생략

    16. 잘못된 코드
    17. val response = connection.inputStream.bufferedReader().readText() // 응답 코드 확인 안 함
    18. 올바른 코드
    19. if (responseCode == HttpURLConnection.HTTP_OK) {
          val response = connection.inputStream.bufferedReader().readText() // 응답 코드 체크 후 데이터 처리
      }

      6. 정리

    20. 네트워크 I/O는 애플리케이션의 필수 요소입니다.
    21. 동기와 비동기 방식의 차이를 이해해야 합니다.
    22. 기본 GET 요청 및 비동기 요청 패턴을 익혀야 합니다.
    23. 연결 종료 및 응답 코드 확인은 필수입니다.
    24. 다음에 학습하면 좋은 주제:

    25. Kotlin에서 코루틴을 이용한 비동기 프로그래밍
    26. REST API 설계 및 사용 방법
    27. Retrofit 라이브러리 활용법