728x90

전체 글 483

[React] Strict Mode 완전 정복 - 사이드이펙트, 더블 렌더링, Deprecated 감지까지

🔷 들어가며 React를 사용하다 보면 라는 컴포넌트를 본 적이 있을 것이다. 보통 index.js 파일에서 루트 컴포넌트를 감쌀 때 사용한다. 하지만 정확히 어떤 역할을 하는지, 왜 사용하는지에 대해선 모호한 경우가 많다. 이번 글에서는 StrictMode가 실제로 어떤 일을 하는지, React 18에서 어떤 변화가 있었는지, 그리고 우리가 코드에서 어떻게 대응해야 하는지까지 정리해보려한다. ✅ StrictMode란?StrictMode는 React에서 잠재적인 문제를 사전에 감지할 수 있도록 도와주는 개발용 유틸리티 컴포넌트이다. - 개발 모드에서만 동작 - 실제 UI에는 아무 영향도 주지 않음 - 앱 전체 또는 일부분에만 적용 가능import React from 'react';import Rea..

[JPA] Spring Data JPA에서 새로운 Entity인지 판단하는 방법 (2)

기존 포스팅이 있지만 한번 더 작성해보았다. [JPA] Spring Data JPA에서 새로운 Entity 판단하는 방법 [JPA] Spring Data JPA에서 새로운 Entity 판단하는 방법Spring Data JPA에서 새로운 Entity를 저장할 때 public interface SaveTestRepository extends JpaRepository {} save @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(edevhooney.tistory.com save()를 썼는데 insert가 안 돼요! upda..

[Spring] OSIV(Open Session In View) 옵션

✅ OSIV란?Open Session In View (OSIV)는 JPA에서 HTTP 요청이 끝날 때까지 영속성 컨텍스트(EntityManager)를 열어두는 전략이다. 이 설정이 true(기본값)면, Controller나 View(Rendering) 단계에서도 Lazy Loading이 가능하다. Spring Boot에서는 기본적으로 spring.jpa.open-in-view=true 로 켜져 있다. ✅ 왜 등장했을까?JPA는 기본적으로 지연 로딩(Lazy Loading)을 많이 쓴다. 예를 들어,@GetMapping("/users/{id}")public UserDto getUser(@PathVariable Long id) { User user = userRepository.findById(..

[Gin] GORM 필드 유효성 검사 + Validator 연동하기

Go는 정적 타입 언어지만, API 개발을 하다 보면 요청 데이터에 대한 유효성 검사(validation) 가 꼭 필요하다. GORM만 써서는 해결되지 않는 입력값 검증은 validator 라이브러리와 함께 처리하는 것이 일반적이다. 이번 포스팅에서는 실전에서 가장 많이 쓰이는 유효성 검사 라이브러리인 go-playground/validator와 GORM 모델을 함께 사용하는 방법을 다룬다. ✅ 1. Validator 설치하기go get github.com/go-playground/validator/v10 ✅ 2. 기본 사용법import ( "github.com/go-playground/validator/v10")type User struct { Name string `..

개발/Go 2025.06.27

[Gin] GORM Custom Type 활용법 - JSON 필드, Enum, Time 처리까지 한 번에 정리!

Go + GORM으로 백엔드 개발을 하다 보면 다음과 같은 고민, 한 번쯤 해봤을 것이다. - Struct 안에 JSON 배열을 저장하고 싶은데 어떻게 하지? - Enum 타입처럼 제한된 값만 저장하고 싶은데? - time.Time 포맷이 DB랑 안 맞아서 깨져서 나온다? 이럴 때 유용하게 쓰이는 게 GORM의 Custom Type 기능이다. 이 글에서는 JSON 필드, Enum 처리, 커스텀 Time 포맷을 예제로 하나씩 정리해보려 한다. 1. JSON 필드 매핑하기 — Slice나 Map을 JSON으로 저장하기 Go에서는 []string, map[string]string 같은 필드를 DB의 JSON 컬럼에 저장하려면 Scan()과 Value() 메서드를 직접 구현해줘야 한다. ✅ 예제: ..

개발/Go 2025.06.25

[Spring] Spring 프로젝트에서 레이어드 아키텍처 제대로 이해하기

레이어드 아키텍처(Layered Architecture)는 소프트웨어를 관심사에 따라 계층(Layer)으로 나누는 아키텍처 스타일이다. 각 계층은 특정한 역할을 맡고, 상위 계층은 하위 계층에만 의존한다. 이 방식은 유지보수성, 테스트 용이성, 재사용성을 높이는 데 목적이 있다. 🧱 대표적인 4계층 구조 1. Presentation Layer (프레젠테이션/뷰/웹 계층)- 사용자와 상호작용하는 계층 (웹 화면, API, 모바일 UI 등) - 요청을 받아 컨트롤러가 처리 - 사용자 입력을 처리하고 결과를 표시 ✅ 예: Controller, HTML/Thymeleaf, REST API 2. Application Layer (애플리케이션/서비스 계층)- 비즈니스 로직을 조합하여..

[Go] Go에서 싱글턴 패턴 구현하기 - 실전 예제로 쉽게 이해하기

“전역 상태 관리의 한계 극복을 위한 가장 단순하지만 강력한 디자인 패턴 중 하나” ✅ 정의싱글턴 패턴은 클래스의 인스턴스를 오직 하나만 생성하고, 이 인스턴스를 어디서든 접근 가능하게 만드는 디자인 패턴이다. 즉, 어떤 클래스가 있을 때: - 인스턴스가 딱 하나만 존재해야 하며, - 어디서든 동일한 인스턴스를 참조할 수 있어야 한다. 💡 언제 사용하나?상황이유설정(config) 관리앱 전체에서 동일한 설정값 사용DB 연결 관리커넥션 풀 공유 필요로깅 시스템로그 객체를 공통으로 사용해야 함공통 서비스캐시, 인증 등 하나만 있어야 하는 경우 🛠 구조Client -----> Singleton.getInstance() - Singleton 클래스는 내부적으로 유일한 인스턴스를 가지고 있음- ..

개발/Go 2025.06.20

[Gin] GORM에서 CQRS 아키텍처 구현해보기

읽기와 쓰기를 분리하여 유지보수성과 성능을 챙기자!✅ CQRS란?CQRS(Command Query Responsibility Segregation)는 **쓰기(Command)**와 읽기(Query) 책임을 서로 다른 모델 또는 레이어로 분리하는 아키텍처 패턴입니다.기존 CRUD는 하나의 모델이 모든 작업을 처리CQRS는 복잡한 시스템에서 명확하고 유연한 구조 제공 📦 GORM에서 CQRS를 구현하는 이유이점 설명책임 분리읽기/쓰기 로직 분리로 유지보수 용이성능 최적화읽기에서 복잡한 JOIN 최소화 가능테스트 용이Command/Query 각각 테스트 가능확장성Read-Replica, Kafka 등 확장 용이 📐 디렉토리 구조 예시/internal /user - command_repositor..

개발/Go 2025.06.18

[Gin] GORM + Redis 캐싱 전략 - DB 부하 줄이는 실전 캐싱

DB 부하를 Redis로 덜어주는 실전 패턴 ✅ 왜 캐싱이 중요한가?- 자주 조회되는 데이터를 매번 DB에서 가져오면 성능에 큰 부담 - GORM만 사용하면 매 요청마다 쿼리 발생 - Redis를 캐시로 두면 응답 속도 향상 + DB 부하 감소 🧱 기본 구조 Client → Gin → Service ├── Redis 캐시 hit → 바로 응답 └── miss → GORM → DB → 캐시 저장 → 응답 🧪 실습 전제 - Gin + GORM + Redis 사용 - User 모델 조회 예시 - Redis는 go-redis 사용 1. Redis 설정import ( "github.com/redis/go-redis/v9" "..

개발/Go 2025.06.16

[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
728x90