본문 바로가기
Golang

[Golang] Go 언어에서 Interface(인터페이스)를 사용하여 다양한 데이터 유형을 처리하기

by gungle 2024. 7. 30.

Go 언어에서 서버 사이드 프로그래밍을 하면서 예측할 수 없는 응답값을 처리할 때 사용할 수 있는 방법론 중 하나는 인터페이스를 사용하는 것이다. 특히, Go의 인터페이스는 다양한 데이터 유형을 효과적으로 처리할 수 있도록 지원한다. 이번 포스팅에서는 인터페이스의 사용법과 예제를 통해 Go에서 데이터를 처리하는 방법을 자세히 살펴본다.

 

인터페이스의 장단점

인터페이스 사용의 장점은 다음과 같다:

  1. 타입 안전성: 인터페이스를 사용하면 컴파일 시간에 타입 체크를 할 수 있어 런타임 에러의 가능성이 줄어든다.
  2. 유연성: 인터페이스를 통해 다양한 타입을 같은 방식으로 처리할 수 있어 코드의 재사용성이 높아지고 유지보수가 쉬워진다.
  3. 결합도 감소: 인터페이스를 사용하면 구현체에 대한 의존성을 줄이고 독립적인 프로그래밍이 가능해진다. 이는 테스트와 모듈화에 유리하다.

인터페이스 사용의 단점은 다음과 같다:

  1. 설계 복잡성 증가: 올바른 인터페이스를 설계하고 관리하는 것은 시간이 걸리며 복잡할 수 있다.
  2. 런타임 오버헤드: 인터페이스를 통한 메서드 호출은 직접 호출보다 약간 느릴 수 있다, 특히 메서드 호출이 매우 빈번하게 일어나는 경우 더욱 그렇다.
  3. 추상화의 한계: 때로는 너무 추상화된 인터페이스가 실제 사용 시에는 그다지 유용하지 않을 수 있다.

 

Go 서버 예제: 다양한 데이터 유형 처리하기

아래는 Go로 작성된 간단한 서버 예제이다. 이 서버는 다양한 유형의 데이터를 받아 처리할 수 있는 handleResponse 함수를 포함하고 있다. 우리는 HTTP 요청을 받아서 그에 따른 데이터를 분석하고, 적절한 처리를 수행한다.

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
)

// handleResponse는 다양한 유형의 데이터를 처리한다.
func handleResponse(data interface{}) {
	switch v := data.(type) {
	case string:
		fmt.Println("String:", v)
	case int:
		fmt.Println("Integer:", v)
	case []byte:
		fmt.Println("Byte array:", string(v))
	default:
		fmt.Println("Unknown type")
	}
}

// HTTP 요청을 처리하는 함수이다.
func handler(w http.ResponseWriter, r *http.Request) {
	var data interface{}

	// JSON 데이터 예제; 실제 사용 시 요청 본문에서 데이터를 읽어올 수 있다.
	jsonData := `{"type":"string","value":"hello"}`
	json.Unmarshal([]byte(jsonData), &data)

	// 데이터 처리 함수를 호출한다.
	handleResponse(data)

	fmt.Fprintf(w, "Data processed.")
}

func main() {
	http.HandleFunc("/", handler)
	fmt.Println("Server is running on http://localhost:8080/")
	http.ListenAndServe(":8080", nil)
}
  1. 메인 패키지 선언: 모든 Go 프로그램은 main 패키지에서 시작된다.
  2. 핸들러 함수 handler: 이 함수는 HTTP 요청을 받고, JSON 데이터를 파싱한 후, handleResponse 함수로 데이터를 전달한다.
  3. 데이터 처리 함수 handleResponse: 이 함수는 interface{} 타입의 매개변수를 받아, 실제 유형에 따라 적절한 작업을 수행한다.
  4. 서버 실행: http.ListenAndServe는 지정된 포트에서 서버를 실행하고, 모든 HTTP 요청을 handler 함수로 라우팅한다.

서버 요청 예시

curl -X PUT http://localhost:8080/ -d "data=example"
Data processed.

 

결론

이 예제를 통해 Go의 인터페이스를 활용하여 다양한 유형의 데이터를 유연하게 처리할 수 있는 방법을 보여주었다. 이러한 접근 방식은 서버 사이드 프로그래밍에서 매우 유용하며, 실제 서비스에서도 이와 같은 패턴을 적용하여 더 나은 유연성과 확장성을 구현할 수 있다.