학습
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": "..." }
코드 한 줄씩 동작 설명
import java.net.HttpURLConnection: HTTP 연결을 사용하기 위해 필요한 라이브러리를 가져옵니다.val url = URL(...): 요청할 URL을 지정합니다.val connection = url.openConnection() as HttpURLConnection: URL로부터 연결을 생성합니다.connection.requestMethod = "GET": 요청 방식을 GET으로 설정합니다.val responseCode = connection.responseCode: 서버로부터 응답 코드를 받아옵니다.println("응답 코드: $responseCode"): 응답 코드를 출력합니다.if (responseCode == HttpURLConnection.HTTP_OK): 응답 코드가 200(성공)일 경우에만 다음을 실행합니다.val response = connection.inputStream.bufferedReader().readText(): 서버로부터 받은 데이터를 읽습니다.println("응답 데이터: $response"): 응답 데이터를 출력합니다.connection.disconnect(): 연결을 종료합니다.- 잘못된 코드
- 올바른 코드
- 잘못된 코드
- 올바른 코드
- 네트워크 I/O는 애플리케이션의 필수 요소입니다.
- 동기와 비동기 방식의 차이를 이해해야 합니다.
- 기본 GET 요청 및 비동기 요청 패턴을 익혀야 합니다.
- 연결 종료 및 응답 코드 확인은 필수입니다.
- Kotlin에서 코루틴을 이용한 비동기 프로그래밍
- REST API 설계 및 사용 방법
- Retrofit 라이브러리 활용법
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: 연결 종료를 잊음
// 연결 종료를 하지 않음
val connection = url.openConnection() as HttpURLConnection
// ... 작업 수행
val connection = url.openConnection() as HttpURLConnection
try {
// ... 작업 수행
} finally {
connection.disconnect() // 항상 연결 종료
}
실수 2: 응답 코드 확인 생략
val response = connection.inputStream.bufferedReader().readText() // 응답 코드 확인 안 함
if (responseCode == HttpURLConnection.HTTP_OK) {
val response = connection.inputStream.bufferedReader().readText() // 응답 코드 체크 후 데이터 처리
}
6. 정리
다음에 학습하면 좋은 주제: