일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 주식
- go
- asyncio
- pip
- Hyper-V
- 자식프로세스
- Windows
- apt-get
- dockercontainer
- 가상화 중첩화
- python3.9
- repo
- FastAPI
- 파이썬
- Replication
- go.mod
- mariadb
- psutil
- QT_QPA_PLATFORM_PLUGIN_PATH
- 스트리밍
- BATCH
- Thread
- 자원측정
- golang
- docker
- Finance
- APT
- 레파지토리
- 영상스트리밍
- Python
- Today
- Total
검색하기귀찮아서만든블로그
[GO] Package 개념 이해 본문
지난 포스팅에서 golang을 사용하여 RDP 프록시 프로그램을 만들어 보았다.
golang은 프로젝트에 main.go 파일의 main 함수가 실행 진입점(entry point) 으로 동작한다. 외부 라이브러리나 프레임워크를 사용하기 위해서 패키지 개념을 사용하는데 golang 도 타 언어와 동일하게 패키지 개념을 사용한다. 코드 상단에 import 가 패키지를 포함시키는 구문이다.
본 포스팅에서는 기존에 작성했던 RDP 프록시 코드를 기준으로 간단하게 기능을 패키지로 만들고 main에서 패키지를 호출하는 방법으로 코드를 수정해 볼 생각이다.
코드는 main 함수에서 TCP 23389 포트를 리스닝하고 클라이언트가 접속하면 go routine (비동기)으로 핸들러를 호출하여 양방향 TX/RX 를 프록시하는 기능을 제공한다.
패키지로 구성할 부분은 Main 문에 있는 소켓 리스닝 구문을 별도의 패키지로 구성해서 main 문에서 참조하여 사용하도록 수정할 생각이다.
proxy 폴더를 생성하고 하위에 proxy.go 코드를 생성하였다. 기존에 main 문에 있던 소켓 listen 및 accept 대기 구문을 RunProxy 함수로 생성하였다. 코드가 작성되면 go mod init proxy 명령을 사용하여 go.mod 파일을 생성한다. (go.mod 파일이 이미 있다면 go mod tidy 명령어 사용)
프로젝트 main 함수에서는 proxy 하위에 있는 RunProxy를 사용하기 위해 TCP_PROXY_PROJ.com/proxy를 import 한다. (URL은 임의로 결정), go.mod 파일에서 해당 패키지를 종속성으로 추가한다.
임의로 추가된 URL을 replace 를 통하여 상대 경로로 치환해 주면 패키지 참조는 완료가 된다.
(환경 변수 GOROOT/pkg 경로에 패키지를 추가하면 임의 URL을 사용해서 참조할 필요 없이 직접적인 참조가 가능)
proxy 패키지 내부의 RunProxy 함수에 프록시 동작을 수행하는 핸들러 함수 포인터를 전달하여 proxy 서버를 동작시킨다.(HandleProxy 함수는 기존 함수와 동일하여 생략)
go.mod 파일 내부에서는 아래 키워드를 사용할 수 있다.
module : 모듈 경로 지정 ex) module ./package
require : 필수 종속성 정보 ex) import github.com/my/test v0.0.0
replace : 패키지 경로나 버전을 대체할 때 사용 ex) replace github.com/my/test v0.0.0 => ./my/test
exclude : 패키지의 특정 버전을 사용하지 않도록 할 때 사용 ex) exclude github.com/my/test/dependency
이 번 포스팅은 golang에서 패키지를 어떻게 구성하는지, 또 외부 패키지를 어떻게 import 해서 사용하는지 간단한 예제를 통해서 이해하고자 했다. golang은 타 언어 패키지 관리자를 사용해서 수동으로 패키지를 관리하지 않고 go.mod 에 종속성 정보를 작성하면 관리한다.
'개발 > 라이브러리' 카테고리의 다른 글
[GO] DB 질의 REST API 만들기 (3) | 2023.12.03 |
---|---|
[GO] SQL 질의 (0) | 2023.12.03 |