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

끈질긴 에러 확인: 함수와 err != nil

Go 언어의 가장 큰 특징인 명시적 에러 처리(if err != nil)의 중요성을 배우고, AI가 에러를 무시하지 못하게 통제합니다.

백엔드 서버의 하루는 데이터베이스에서 회원을 찾고, 비밀번호가 맞는지 확인하고, 게시글을 저장하는 '작업'들의 연속입니다. 이렇게 반복되는 작업의 묶음을 우리는 함수(Function)라고 부릅니다. 그런데 이런 작업들은 항상 성공만 할까요? 회원이 없거나, DB 서버가 꺼져있는 등 현실의 백엔드에서는 1초에도 수십 번씩 에러가 터집니다. Go 언어는 이 '에러'를 대하는 태도가 세상 어느 언어보다도 집요하고 깐깐합니다. 이번 시간에는 AI가 짠 Go 코드의 80%를 차지하는 `if err != nil`의 철학과 함수 구조를 알아봅니다.

마법의 상자: 함수(Function)

자판기에 500원(입력값)을 넣으면 콜라(결과값)가 나오는 것처럼, 함수는 재료를 던져주면 요리를 해서 결과물을 반환하는 논리의 묶음입니다. Go 언어에서 함수를 만들 때는 `func`라는 단어를 씁니다.

func Multiply(a int, b int) int {
    return a * b
}

"정수 `a`와 정수 `b`를 받아서(입력), 두 개를 곱한 뒤 다시 정수(`int`)로 돌려주겠다(출력)"라는 뜻입니다.

한 번에 두 개를 돌려주는 Go의 특권

다른 언어들은 보통 한 번에 하나의 결과만 돌려줄 수 있습니다. 하지만 현실의 백엔드는 결과가 성공인지 실패인지, 그 '상태'도 함께 알려주어야 합니다. Go 언어는 자판기가 콜라뿐만 아니라 영수증(상태표)까지 동시에 두 개를 뱉어낼 수 있는 다중 반환(Multiple Return Values) 기능을 완벽하게 지원합니다.

다중 반환과 에러 처리의 기본 형태

go
```go
func GetUser(user_id int) (User, error) {
    if user_id == 0 {
        // 실패: 빈 User 구조체와 함께 에러 메시지 반환
        return User{}, errors.New("유저 ID가 유효하지 않습니다")
    }
    
    // 성공: 실제 DB에서 찾은 User 데이터와 함께 에러는 nil(없음) 반환
    user := db.Find(user_id)
    return user, nil
}
```
  1. 11. 입력값: user_id라는 정수를 받습니다.
  2. 22. 반환 타입: User 정보와 error라는 두 가지 물건을 동시에 돌려주겠다고 괄호 안에 선언합니다.
  3. 33. 성공 시: 정상적인 유저 정보와, 에러가 없다는 뜻인 nil(없음)을 반환합니다.
  4. 44. 실패 시: 유저 정보는 비워두고(빈 깡통), 구체적인 에러 메시지를 꽉 채워서 반환합니다.

AI의 치명적 유혹: 에러 덮어두기

Go 언어 백엔드의 모든 핵심 함수(DB 조회, 결제 처리 등)는 99% 확률로 방금 본 것처럼 두 번째 반환값으로 `error`를 뱉어냅니다. 함수를 호출하는 쪽에서는 이 영수증(`error`)에 문제가 적혀있는지, 아니면 깨끗한지(`nil`) 반드시 즉시 확인해야 합니다. 이것이 그 유명한 `if err != nil` 구문입니다.

에러를 꼼꼼히 확인하는 모범 코드

user, err := GetUser(5)
// 만약 에러 영수증에 뭔가 적혀 있다면(nil이 아니라면)
if err != nil {
    return err // 작업을 즉시 중지하고 사용자에게 에러를 보고함
}
// 여기까지 왔다면 에러가 없다는 뜻이므로 안심하고 user 데이터를 사용함
fmt.Println(user.Name)

에러 처리 시 바이브코딩 철칙

  1. 1AI는 코드를 짧아 보이게 하려고 언더바(_)를 써서 에러를 고의로 무시하는 악행(user, _ := GetUser(5))을 종종 저지릅니다. 이는 폭탄의 뇌관을 뽑지 않고 넘기는 짓입니다.
  2. 2코드 리뷰 시 밑줄(_)이 보이면 즉시 AI에게 '에러를 언더바로 무시하지 말고, if err != nil 구문을 써서 프론트엔드까지 에러 상황이 전달되게 고쳐'라고 호통쳐야 합니다.
  3. 3화면 절반이 if err != nil 로 도배되는 것이 Go 언어의 정상적이고 아름다운 방어 로직입니다. 코드가 길어진다고 귀찮아하지 마세요.

왜 이렇게 귀찮게 만들었을까?

파이썬이나 자바 같은 언어는 에러가 나면 `try-catch`라는 거대한 그물로 에러를 퉁쳐서 잡아냅니다. 편해 보이지만, 코드가 수천 줄이 되면 도대체 어느 줄에서 무슨 에러가 터졌는지 파악하기 위해 며칠 밤을 새워야 합니다.

Go 언어의 창시자들은 "에러는 숨겨야 할 예외 상황이 아니라, 코드가 진행되는 당연한 논리의 일부다"라고 선언했습니다. 에러가 발생할 수 있는 모든 포인트마다 집요하게 `if err != nil`을 검사하게 강제함으로써, 버그가 발생해도 즉시 그 위치와 원인을 1초 만에 알 수 있는 세상에서 가장 튼튼한 서버를 만들 수 있게 된 것입니다.

개념 퀴즈

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

AI가 Go 언어 백엔드 코드를 작성해 주었는데, 데이터베이스에서 게시글을 가져오는 코드에서 반환된 에러를 변수로 받지 않고 언더바(_) 기호로 처리해 둔 것을 발견했습니다. 이 코드의 문제점과 가장 올바른 해결책은 무엇인가요?

3줄 요약

  1. 1함수(Function)는 입력값을 받아 결과를 돌려주는 논리의 단위이며, Go 언어는 결과값과 에러 상태(영수증)를 동시에 2개 이상 반환할 수 있는 강력한 특징이 있습니다.
  2. 2Go 코드의 절반 이상을 차지하는 if err != nil 구문은 함수가 뱉어낸 에러 영수증을 즉시 확인하여 버그를 차단하는 필수 방어막입니다.
  3. 3AI가 코드를 짤 때 언더바(_)를 사용해 에러를 무시하거나 숨기려 든다면, 반드시 명시적인 에러 처리 코드를 추가하도록 지시하여 서버의 안정성을 지켜야 합니다.