728x90

Golang 5

[Gin] GORM 디버깅 & 에러 핸들링 완전정복

에러 무시하다가 큰일난다 - 실전에서 통하는 GORM 디버깅 & 예외 처리 전략 ✅ 목차GORM 에러 핸들링의 기본 구조 RowsAffected로 실패 원인 파악하기 특정 에러 구분하기 (errors.Is, errors.As) 로그 레벨 조절로 SQL 추적하기 실전 예제: 유저 존재 확인 후 조건부 저장 디버깅 꿀팁 & 실수 피하기 1. GORM 에러 핸들링 기본 구조 GORM의 대부분 메서드는 .Error 필드에 에러를 담는다. user := User{}err := db.First(&user, 1).Errorif err != nil { // 에러 처리} 하지만 이렇게만 쓰면 에러 원인을 정확히 알기 어렵다. 2. RowsAffected로 레코드 유무 판단하기쿼리는 성..

개발/Go 2025.06.13

[Gin] GORM으로 단위 테스트 잘하는 법 - 테스트 환경 구성부터 Mock까지

실무 백엔드에서는 기능 구현만큼 중요한 게 테스트다. 특히 DB를 다루는 GORM에서는 테스트 코드 작성이 까다로울 수 있지만, 구조만 잘 잡으면 생산성도, 안정성도 높아진다. ✅ 목차 - GORM 테스트, 왜 어려울까? - 테스트 환경 구성 전략 - SQLite in-memory DB - 트랜잭션 롤백 - 인터페이스 분리로 Mocking 가능하게 만들기 - gorm.io/datatypes, faker로 더 현실적인 테스트 - 실전 테스트 예제 정리 1. GORM 테스트, 왜 어려울까? GORM은 DB 연결을 전제로 하기 때문에, 테스트 시 다음 이슈가 생긴다: - 실제 DB를 연결하면 테스트 데이터 관리가 어렵다. - 트랜잭션 롤백 없이 돌리면 더티 데이터가 남는다. - GORM 객체가..

개발/Go 2025.06.11

[Gin] GORM에서 안전한 쿼리 작성법 - SQL 인젝션 방지와 Named Parameter 전략

SQL 인젝션은 여전히 실무에서 가장 빈번하게 발생하는 보안 위협 중 하나다. Go 백엔드에서 ORM으로 GORM을 쓴다고 해도, 안전하지 않은 쿼리 작성은 여전히 인젝션 공격의 여지를 남긴다. 이번 글에서는 다음 내용을 상세히 다룬다. ✅ 목차 - SQL 인젝션이란? - GORM에서 발생할 수 있는 인젝션 사례 - 안전한 쿼리 작성법 - 바인딩 방식 - Named Parameter 전략 - Struct 기반 조건 - Raw SQL 시 주의할 점 - 실전 방어 전략 요약 1. SQL 인젝션이란?SQL 인젝션(SQL Injection)이란, 쿼리문에 사용자 입력값이 그대로 삽입되면서 악의적인 SQL이 실행되는 공격이다. 예를 들어 아래처럼 문자열을 직접 연결하면:db.Exec("DELETE ..

개발/Go 2025.06.09

[Gin] GORM 마이그레이션 전략 - 자동 vs 수동 관리, 안전하게 스키마 관리하기

Go로 백엔드를 개발할 때 GORM의 마이그레이션 기능은 정말 편리하다. 하지만 무턱대고 자동 마이그레이션만 쓰다 보면 데이터 유실, 인덱스 충돌, 운영 장애까지 발생할 수 있다. 이번 글에서는 GORM에서 자동 마이그레이션과 수동 마이그레이션을 언제 어떻게 써야 하는지, 실전 전략을 정리해보자. 📌 목차 - GORM AutoMigrate 기본 사용법 - 자동 마이그레이션의 한계와 리스크 - 수동 마이그레이션 관리 전략 - 실전 추천 전략 (개발/운영 구분) - 마무리 요약 1. GORM AutoMigrate 기본 사용법GORM은 AutoMigrate()로 테이블을 생성하고 컬럼을 자동으로 추가해준다.db.AutoMigrate(&User{}, &Post{}) - 존재하지 않는 테이블이면 생..

개발/Go 2025.06.06

[Gin] Gin 시작해보자!

타입스크립트를 go로 만든다는데, 그 기념으로 go로 백엔드를 구성해보자. Go 언어를 오랜만에 공부하는데,기존 Fiber 대신 Gin을 시작해보자. 1. Gin 설치go mod init my-gin-appgo get -u github.com/gin-gonic/gin 2. 최소 실행 코드(main.go)package mainimport ( "github.com/gin-gonic/gin" "net/http")func main() { r := gin.Default() // 간단한 GET 라우터 r.GET("/ping", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "pong"}) }) // 실행 r.Run(":8080") /..

개발/Go 2025.05.14
728x90