MMeshOps
AI와 함께하는 Go 백엔드와 실전 아키텍처
5예상 8입문

껍데기와 알맹이: 인터페이스와 패키지

코드를 유연하게 조립할 수 있게 해주는 인터페이스의 원리와, 남이 만든 코드를 가져다 쓰는 패키지, 모듈 시스템을 알아봅니다.

여러분이 식당의 사장님(백엔드 서버)이라고 상상해 봅시다. 오늘 배달 기사가 오토바이를 타고 올지, 자전거를 타고 올지, 킥보드를 타고 올지 사장님이 알 필요가 있을까요? 사장님은 그저 '배달을 할 줄 아는 누군가'에게 포장된 음식만 넘겨주면 됩니다. 이것이 바로 프로그래밍 세계를 지탱하는 거대한 원리인 인터페이스(Interface)입니다. 이번 시간에는 코드를 껍데기와 알맹이로 분리하여 거대한 레고 블록처럼 조립하는 방법과, 전 세계 개발자들이 만들어둔 천재적인 부품(패키지)을 가져다 내 서버에 끼워 넣는 방법을 배웁니다.

알맹이는 상관없어: 인터페이스 (Interface)

우리가 이메일을 발송하는 백엔드 기능을 만든다고 해봅시다. 처음에는 구글 Gmail 시스템을 붙여서 썼지만, 한 달 뒤에 아마존(AWS) 이메일 시스템으로 갈아타려고 합니다. 코드를 잘못 짜면, 회원가입 코드, 비밀번호 찾기 코드 등 이메일을 보내는 수백 군데의 코드를 다 찾아다니며 '구글'을 '아마존'으로 일일이 바꿔주어야 하는 대참사가 일어납니다.

이를 막아주는 방패가 인터페이스입니다.

인터페이스를 통한 껍데기와 알맹이 분리

백엔드 비즈니스 로직

의존함 (알맹이 상관 안 함)

이메일 발송기 (인터페이스 껍데기)

이메일 발송기 (인터페이스 껍데기)

구현됨 (실제 알맹이 1)

구글 Gmail 발송 시스템

이메일 발송기 (인터페이스 껍데기)

구현됨 (실제 알맹이 2)

아마존 AWS 발송 시스템

인터페이스는 "나는 네가 속으로 구글을 쓰든 아마존을 쓰든 관심 없어. 그냥 Send() 라는 기능(껍데기)만 가지고 있으면 묻지도 따지지도 않고 배달 기사로 인정해 줄게!"라고 선언하는 계약서입니다.

인터페이스 계약서의 형태

// 배달 기사 계약서: 이 껍데기(Send)만 있으면 누구나 이메일 발송기로 인정!
type EmailSender interface {
    Send(address string, content string) error
}

바이브코딩 AI에게 코드를 맡길 때, "이메일 발송이나 결제 기능처럼 나중에 업체가 바뀔 수 있는 기능은 반드시 인터페이스(Interface)를 뽑아서 결합도를 낮춰줘!"라고 지시하면 아키텍처 수준이 10배는 올라갑니다.

거인의 어깨 위에서 코딩하기: 패키지와 모듈

백엔드를 개발할 때 모든 것을 밑바닥부터 혼자 짤 수는 없습니다. 비밀번호를 암호화하거나 데이터베이스에 접속하는 어려운 수학적 로직들은 이미 전 세계의 똑똑한 해커와 구글 엔지니어들이 완벽하게 짜서 무료로 인터넷에 올려두었습니다. 이것을 패키지(Package)라고 부릅니다.

파이썬에서 `pip install`을 치고, 자바스크립트에서 `npm install`을 치듯, Go 언어에서는 외부의 천재적인 부품을 가져오기 위해 모듈(Module) 시스템을 사용합니다.

외부 패키지 가져오기와 go.mod

bash
```bash
# 터미널 명령어 예시
go mod init my-server
go get github.com/gin-gonic/gin # 아주 유명한 백엔드 프레임워크 다운로드
```
  1. 11. 프로젝트 폴더에서 터미널을 열고 go mod init my-server 를 쳐서 빈 장바구니(go.mod 파일)를 만듭니다.
  2. 22. 인터넷에서 본 멋진 패키지를 장바구니에 담으려면 go get github.com/사용자/멋진패키지 라고 칩니다.
  3. 33. 그러면 장바구니 파일(go.mod)에 패키지 이름과 버전이 찰칵 기록되며, 내 코드 안에서 자유롭게 쓸 수 있게 됩니다.

외부 패키지 사용의 두 얼굴

권장

  • 보안, 암호화, 데이터베이스 접속, 결제 연동 등은 절대로 직접 짜지 말고 가장 별(Star)을 많이 받은 유명한 외부 패키지를 믿고 가져다 쓰세요.
  • AI가 내가 모르는 외부 패키지 코드를 추천해 주면, 반드시 해당 패키지의 공식 문서를 가볍게라도 한 번 눈으로 확인하는 습관을 들이세요.

주의

  • 너무 많은 외부 패키지를 무분별하게 다운로드하지 마세요. 누군가 악의적인 코드를 심어둔 패키지를 잘못 받으면 서버가 통째로 해킹될 수 있습니다.
  • 단순한 문자열 뒤집기, 배열 정렬하기 등은 굳이 외부 패키지를 쓰지 말고 Go 언어 기본 내장 라이브러리로 해결하세요.

개념 퀴즈

퀴즈 답을 맞춰야 학습 완료가 됩니다.

회원가입 완료 시 SMS(문자)를 발송하는 기능을 만들려고 합니다. 지금은 A 업체를 쓰지만, 내년에 B 업체로 변경될 수 있습니다. 백엔드 핵심 코드를 전혀 고치지 않고 부품만 갈아 끼우듯 B 업체로 유연하게 교체하기 위해, 두 업체의 발송 기능이 공통으로 지켜야 할 '껍데기(계약서)'를 코드로 정의해 두는 문법은 무엇인가요?

3줄 요약

  1. 1인터페이스는 구현체(알맹이)의 내부 구조에 신경 쓰지 않고, 어떤 기능(껍데기)을 제공하는지만 명시하여 부품 교체를 아주 쉽게 만들어 줍니다.
  2. 2결제, 알림, 이메일처럼 외부 시스템과 연동되거나 추후 변경될 가능성이 높은 모듈은 처음부터 인터페이스를 뽑아내어 설계하는 것이 안전합니다.
  3. 3수많은 천재 개발자들이 짜둔 기능을 내 서버에 가져다 쓰기 위해 go mod 와 go get 명령어를 사용하여 외부 패키지를 관리합니다.