728x90

공부 33

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

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

개발/Go 07:41:27

[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] GORM 성능 최적화 팁 - Preload, Select, Index 전략까지!

GORM은 Go에서 가장 널리 쓰이는 ORM이지만, 아무 설정 없이 쓰다 보면 쿼리가 많아지고 성능이 떨어질 수 있다. 이번 글에서는 GORM에서 성능을 높이기 위한 Preload, Select, Index 전략들을 정리해보자. 📌 목차 - N+1 문제와 Preload - 필요한 컬럼만 조회하기 — Select - Index 전략 - 정리 1. N+1 문제와 Preload 🤔 N+1 문제란? 예를 들어 게시글(Post)과 작성자(User) 관계가 있을 때, 게시글 10개를 조회하면서 각 게시글의 작성자를 따로 조회하면 1 + N 쿼리가 발생한다. type Post struct { ID uint Title string UserID uint User User}// 잘못된 예..

개발/Go 2025.06.04

[Javascript] 함수가 기억을 한다고? 자바스크립트 클로저 쉽게 설명해봄

JS의 클로저에 대해서 알아보자 ✅ 한 줄 정의클로저는 함수가 자신이 선언될 때의 스코프(변수 환경)를 기억하고, 그 외부 함수가 종료된 이후에도 그 변수들에 접근할 수 있는 함수. 📌 기본 예시 function outer() { let count = 0; // outer의 지역 변수 return function inner() { count++; console.log(count); };}const counter = outer(); // outer는 실행되고 종료됨, 하지만 inner는 리턴됨counter(); // 1counter(); // 2counter(); // 3 outer() 실행 시, count 변수와 함께 inner() 함수가 생성됨. inner()는 co..

SQL에서 NOT IN 쓰다 피본 적 있다면 꼭 알아야 할 내용

NOT IN 쿼리를 사용 시 발생할 수 있는 문제가 있다. ✅ NOT IN 사용 시 발생할 수 있는 문제 1. NULL 포함 시 결과 이상NOT IN 대상 컬럼에 NULL이 포함되면 전체 결과가 비어버릴 수 있음 예시:SELECT * FROM users WHERE id NOT IN (1, 2, NULL); 이 경우 아무 결과도 반환되지 않음 (NULL은 비교 불가하기 때문) ✔️ 해결: NOT IN을 쓰기 전에 NULL 값을 필터링해야 함SELECT * FROM users WHERE id NOT IN ( SELECT id FROM blacklisted WHERE id IS NOT NULL); 2. 성능 저하NOT IN (SELECT ...)은 서브쿼리 결과를 모든 행마다 비교 → 인덱스가 있..

개발/ETC 2025.05.30

[Gin] GORM 고급 기능 완전 정복 - Soft Delete, Hook, 트랜잭션까지!

Go 언어에서 ORM으로 GORM을 쓰다 보면 관계 설정 말고도 놓치기 쉬운 고급 기능들이 있다. 이번 글에서는 실무에서 정말 유용하게 쓰이는 Soft Delete, Hooks, 트랜잭션을 정리해보자. 📌 목차 Soft Delete란? GORM Hooks란? 트랜잭션 다루기 마무리 및 다음 예고 1. Soft Delete란?Soft Delete는 데이터를 물리적으로 삭제하지 않고, 삭제된 것처럼 다루는 기능이다. 🧾 사용법import "gorm.io/gorm"type User struct { ID uint Name string DeletedAt gorm.DeletedAt `gorm:"index"`} DeletedAt 필드를 추가하면 GORM이 자동으로 Soft D..

개발/Go 2025.05.28

[Gin] GORM 관계 설정 완전 정복 - 1:N, N:1, N:M 예제로 배우기

Go 언어의 대표적인 ORM인 GORM을 쓰다 보면 꼭 마주치게 되는 기능이 바로 관계 설정(Association)이다. 이번 글에서는 실제 예제와 함께 GORM의 다양한 관계 설정을 정리해보고, 실전에서 어떻게 쓰는지까지 알아보자. 📌 목차 관계 설정이란? 1:N (has many & belongs to) N:M (many to many) Preload로 관계 데이터 로딩하기 팁 & 실수 방지 포인트 마무리 및 다음 예고 1. 관계 설정이란?관계 설정(Association)은 모델 간의 연결 관계를 표현하는 기능이다. 대표적으로 다음과 같은 관계가 있다- 1:N: 하나의 유저가 여러 개의 게시글을 가질 수 있음 - N:1: 게시글은 하나의 유저에 속함 - N:M: 유저는 여러 역할(Ro..

개발/Go 2025.05.26

[Gin] Go + Gin + GORM으로 백엔드 만들기 (기초부터 CRUD까지)

Go로 웹 백엔드를 만들 때 가장 많이 사용되는 조합 중 하나가 바로 Gin + GORM이다. Gin은 가볍고 빠른 웹 프레임워크이고, GORM은 Go 언어에서 가장 널리 쓰이는 ORM(Object Relational Mapping) 라이브러리다. 이번 글에서는 Gin + GORM을 사용해 MySQL 기반의 간단한 백엔드 서버를 만드는 방법을 초보자도 이해할 수 있도록 하나하나 설명해보려 한다. 📌 목차 GORM이란? 프로젝트 설정 및 설치 데이터베이스 연결 모델 정의 마이그레이션 (자동 테이블 생성) CRUD 예제 Gin과 연동하여 REST API 만들기 마무리 및 참고 자료 1. GORM이란?GORM은 Go 언어용 ORM(Object-Relational Mapping) 라이브러리로..

개발/Go 2025.05.24

템플릿 메소드 패턴

템플릿 메소드 패턴에 대해서 알아보자! 템플릿 메소드 패턴(Template Method Pattern)은 행동(Behavioral) 디자인 패턴 중 하나로, 알고리즘의 뼈대를 상위 클래스에서 정의하고, 일부 단계는 하위 클래스에서 구현하도록 만드는 구조. ✅ 핵심 개념 요약상위 클래스: 알고리즘 전체 구조(순서)를 정의 하위 클래스: 구체적인 단계만 재정의 (hook method 또는 abstract method) 의도: 공통 로직 재사용 + 유연한 확장 제공 ✅ 구조 예시 (Java 스타일)abstract class AbstractTask { // 템플릿 메소드 (알고리즘 전체 흐름 정의) public final void execute() { start(); ..

개발/ETC 2025.05.20
728x90