Archive: 2025

0

[PostgreSQL] 인증 및 보안 강화하기

🔐 PostgreSQL 인증 강화 가이드 — 비밀번호만으로는 부족하다PostgreSQL은 기본적으로 username + password 조합으로 인증하지만,그 외에도 여러 보안 강화 방법을 제공하여 MFA(다단계 인증) 수준의 보호를 구축할 수 있습니다.이 글에서는 PostgreSQL의 인증 강화 방안을 단계별로 정리합니다. 1️⃣ 비밀번호 보안 강화 (기본 강화)기본적인 로그인 방식을 유지하면서도 훨씬 안전하게 만드는 방법입니다. ✅ SCRAM-SHA-256 전환md5보다 훨씬 안전한 해시 알고리즘입니다. # postgresql.confpassword_encryption = scram-sha-256 # pg_hba.confhost all all 10.0.0.0/8 scram-sha-256 ✅ 채널 바인딩 (MITM 방어)

0

[Spring] - 트랜잭션 동기화 (TransactionSynchronizationManager)

리소스 동기화 - TransactionSynchronizationManager트랜잭션을 유지하기 위해서는 트랜잭션 시작부터 끝까지 같은 데이터 베이스 Connection 을 유지해야 합니다. 스프링에서는 트랜잭션 동기화를 위해 트랜잭션 동기화 매니저를 제공합니다. 트랜잭션 매니저는 DataSource 를 통해 데이터 베이스 Connection 을 생성하고 트랜잭션을 시작합니다. 트랜잭션 매니저는 트랜잭션이 시작된 Connection 을 트랜잭션 동기화 매니저에 저장합니다. Repository 는 트랜잭션 동기화 매니저에 저장된 Connection 을 사용합니다. 트랜잭션이 종료되면 트랜잭션 매니저는 트랜잭션 동기화 매니저에 저장된 Connection 을 통해 트랜잭션을 종료하고 Connection 을 닫습니다. TransactionSynchronizationManagerTransactionSynchronizationManager 는 ThreadLocal 을 사용해서 각 쓰레드별 데이터 베이스 Connection 을 저장하고 사용할 수 있도록 있습니다. TransactionSynchronizationManager 사용하기TransactionSynchronizationManager 에 저장된 Connection 을 가져오기 위해 DataSourceUtils 를 사용합니다. Connection getConnection(DataSource dataSource) DataSource 를 이용해 Database Connection 을 가져옵니다. Connection 이 없을 경우 생성하고 이미 있을 경우 ThreadLocal 에 저장된 Connection 을 가져옵니다. void releaseConnection(@Nullable Connection con, @Nullable DataSource dataSource) DataSource 에 연결된 Database Connection 을 닫습니다. 만약 해당 Connection 을 사용중인 프로세스가 있을 경우 닫지 않고 반환합니다.

0

Nuxt.js 시작하기 - 설치 및 프로젝트 생성

Nuxt.js란?Nuxt.js는 Vue.js 기반의 프레임워크로, 서버 사이드 렌더링(SSR), 정적 사이트 생성(SSG), 그리고 단일 페이지 애플리케이션(SPA)을 쉽게 구축할 수 있게 해줍니다. Nuxt 3부터는 Vue 3와 Vite를 기반으로 더욱 빠르고 강력해졌습니다. 주요 특징 하이브리드 렌더링: SSR, SSG, SPA 중 선택 가능 자동 라우팅: 파일 기반 라우팅 시스템 TypeScript 지원: 완벽한 TypeScript 지원 자동 Import: 컴포넌트와 컴포저블 자동 임포트 SEO 최적화: 메타 태그 관리와 서버 사이드 렌더링 모듈 시스템: 풍부한 모듈 생태계 빠른 성능: Vite와 Nitro 엔진 기반 Nuxt 2 vs Nuxt 3 특징 Nuxt 2 Nuxt 3 Vue 버전 Vue 2 Vue 3 빌드 도구 Webpack Vite 서버 엔진 Node.js Nitro TypeScript 추가 설정 필요 기본 지원 Composition API 플러그인 필요 기본 지원 현재는 Nuxt 3 사용을 권장합니다. 사전 요구사항Nuxt.js를 사용하기 위해서는 다음이 설치되어 있어야 합니다: Node.js (v18 이상, v20 권장) npm, yarn, 또는 pnpm

0

NestJS vs Spring Boot - 공통점과 차이점 비교

개요NestJS와 Spring Boot는 각각 Node.js와 Java 생태계에서 가장 인기 있는 백엔드 프레임워크입니다. 두 프레임워크는 놀랍도록 유사한 아키텍처와 철학을 가지고 있습니다. 기본 정보NestJS 언어: TypeScript (JavaScript) 런타임: Node.js 출시: 2017년 철학: Angular에서 영감을 받은 프로그레시브 Node.js 프레임워크 기반: Express.js (또는 Fastify) Spring Boot 언어: Java (Kotlin, Groovy 지원) 런타임: JVM 출시: 2014년 철학: Spring Framework 기반의 빠른 애플리케이션 개발 기반: Spring Framework 주요 공통점1. 의존성 주입 (Dependency Injection)두 프레임워크 모두 의존성 주입을 핵심으로 사용합니다.

0

NestJS vs Spring Boot - 공통점과 차이점 비교

개요NestJS와 Spring Boot는 각각 Node.js와 Java 생태계에서 가장 인기 있는 백엔드 프레임워크입니다. 두 프레임워크는 놀라울 정도로 유사한 아키텍처와 개념을 가지고 있습니다. 핵심 철학공통점 엔터프라이즈급 애플리케이션 개발에 최적화 모듈화된 아키텍처로 확장 가능한 구조 의존성 주입(Dependency Injection) 패턴 사용 데코레이터/어노테이션 기반 개발 강력한 타입 시스템 (TypeScript vs Java) 테스트 친화적 구조 차이점 항목 NestJS Spring Boot 언어 TypeScript/JavaScript Java/Kotlin 런타임 Node.js (단일 스레드) JVM (멀티 스레드) 성숙도 2017년 출시 (비교적 신생) 2014년 출시 (매우 성숙) 생태계 npm 생태계 Maven/Gradle 생태계 학습 곡선 중간 높음 아키텍처 비교모듈 구조NestJS

0

NestJS 미들웨어, 가드, 인터셉터 활용하기

NestJS 요청 처리 파이프라인NestJS는 요청을 처리하는 여러 단계를 제공합니다: Middleware - 라우팅 전 요청/응답 처리 Guard - 인증/인가 확인 Interceptor (Before) - 요청 전처리 Pipe - 데이터 변환 및 검증 Controller - 요청 처리 Interceptor (After) - 응답 후처리 Exception Filter - 예외 처리 미들웨어 (Middleware)Express의 미들웨어와 동일하게 동작하며, 라우트 핸들러 전에 실행됩니다. 함수형 미들웨어// logger.middleware.tsimport { Request, Response, NextFunction } from 'express';export function logger(req: Request, res: Response, next: NextFunction) { console.log(`Request: ${req.method} ${req.url}`); next();} 클래스형 미들웨어// logger.middleware.tsimport { Injectable, NestMiddleware } from '@nestjs/common';import { Request, Response, NextFunction } from 'express';@Injectable()export class LoggerMiddleware implements NestMiddleware { use(req: Request, res: Response, next: NextFunction) { console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`); next(); }} 미들웨어 적용

0

NestJS 데이터베이스 연결 설정하기

NestJS 데이터베이스 연동NestJS는 다양한 데이터베이스와 ORM을 지원합니다. 가장 일반적으로 TypeORM, Prisma, Mongoose를 사용합니다. TypeORM 설정TypeORM은 TypeScript와 JavaScript를 위한 ORM으로, NestJS와 완벽하게 통합됩니다. 패키지 설치# TypeORM과 MySQLnpm install @nestjs/typeorm typeorm mysql2# PostgreSQLnpm install @nestjs/typeorm typeorm pg# SQLitenpm install @nestjs/typeorm typeorm sqlite3# MariaDBnpm install @nestjs/typeorm typeorm mariadb# MSSQLnpm install @nestjs/typeorm typeorm mssql 기본 설정app.module.tsimport { Module } from '@nestjs/common';import { TypeOrmModule } from '@nestjs/typeorm';@Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: 'password', database: 'test', entities: [__dirname + '/**/*.entity{.ts,.js}'], synchronize: true, // 개발 환경에서만 사용 }), ],})export class AppModule {} 환경 변수 사용

0

NestJS 서비스와 의존성 주입(DI) 이해하기

서비스(Service)란?서비스는 비즈니스 로직을 담당하는 계층입니다. @Injectable() 데코레이터로 정의되며, 컨트롤러에서 분리하여 재사용 가능하고 테스트하기 쉬운 코드를 작성할 수 있습니다. 서비스의 역할 비즈니스 로직 처리 데이터베이스 접근 외부 API 호출 데이터 변환 및 가공 재사용 가능한 기능 제공 기본 서비스 생성CLI로 서비스 생성# 기본 서비스 생성nest g service users# 특정 폴더에 생성nest g service modules/users# 테스트 파일 없이 생성nest g service users --no-spec 기본 서비스 구조import { Injectable } from '@nestjs/common';@Injectable()export class UsersService { private users = []; findAll() { return this.users; } findOne(id: number) { return this.users.find(user => user.id === id); } create(user: any) { this.users.push(user); return user; } update(id: number, user: any) { const index = this.users.findIndex(u => u.id === id); if (index !== -1) { this.users[index] = { ...this.users[index], ...user }; return this.users[index]; } return null; } remove(id: number) { const index = this.users.findIndex(u => u.id === id); if (index !== -1) { return this.users.splice(index, 1)[0]; } return null; }} 의존성 주입(Dependency Injection)

0

NestJS 컨트롤러와 라우팅 학습

컨트롤러(Controller)란?컨트롤러는 클라이언트의 요청(Request)을 처리하고 응답(Response)을 반환하는 역할을 합니다. @Controller() 데코레이터로 정의됩니다. 기본 컨트롤러 생성CLI로 컨트롤러 생성# 기본 컨트롤러 생성nest g controller users# 특정 폴더에 생성nest g controller modules/users# 테스트 파일 없이 생성nest g controller users --no-spec 기본 구조import { Controller, Get } from '@nestjs/common';@Controller('users')export class UsersController { @Get() findAll() { return 'This action returns all users'; }} 라우팅(Routing)기본 라우트import { Controller, Get, Post, Put, Delete } from '@nestjs/common';@Controller('users')export class UsersController { // GET /users @Get() findAll() { return 'Returns all users'; } // POST /users @Post() create() { return 'Creates a new user'; } // PUT /users @Put() update() { return 'Updates a user'; } // DELETE /users @Delete() remove() { return 'Removes a user'; }}

0

NestJS 모듈(Module) 구조 이해하기

NestJS 모듈이란?모듈은 NestJS 애플리케이션의 기본 구성 단위입니다. @Module() 데코레이터로 장식된 클래스로, 관련된 기능들을 하나로 묶어 조직화합니다. 모듈의 역할 애플리케이션을 논리적인 단위로 분리 코드의 재사용성과 유지보수성 향상 의존성 관리를 명확하게 정의 애플리케이션의 구조를 체계적으로 구성 기본 모듈 구조@Module() 데코레이터 속성@Module({ imports: [], // 이 모듈에서 사용할 다른 모듈들 controllers: [], // 이 모듈에 속한 컨트롤러들 providers: [], // 이 모듈에서 사용할 프로바이더(서비스)들 exports: [] // 다른 모듈에서 사용할 수 있도록 내보낼 프로바이더들})export class MyModule {} 루트 모듈 (Root Module)모든 NestJS 애플리케이션은 최소한 하나의 루트 모듈을 가져야 합니다. app.module.ts

0

NestJS 시작하기 - 설치 및 프로젝트 생성

NestJS 시작하기NestJS는 효율적이고 확장 가능한 Node.js 서버 사이드 애플리케이션을 구축하기 위한 프레임워크입니다. TypeScript를 기본으로 사용하며, Express 또는 Fastify를 기반으로 동작합니다. 특징 TypeScript 완벽 지원 의존성 주입(Dependency Injection) 패턴 모듈 기반 아키텍처 데코레이터를 활용한 간결한 코드 테스트 친화적인 구조 사전 요구사항NestJS를 사용하기 위해서는 다음이 설치되어 있어야 합니다: Node.js (v16 이상) npm 또는 yarn, pnpm # Node.js 버전 확인node -v# npm 버전 확인npm -v NestJS CLI 설치NestJS CLI는 프로젝트 생성 및 관리를 쉽게 해주는 도구입니다.

0

[JAVA] - Cold Start

목차 [JAVA] - 가비지 컬렉션 튜닝 [JAVA] - Garbage Collection(가비지 컬렉션) [JAVA] - JVM (자바 가상 머신) 🧊 Cold Start란?Cold Start는 JVM이 애플리케이션이 처음 실행될 때 초기화 과정 때문에 발생하는 지연(latency) 을 의미합니다. 마치 추운 겨울날 자동차 시동을 걸 때 엔진이 따뜻해질 때까지 시간이 걸리는 것과 비슷합니다. 일반적인 서버 환경에서는 애플리케이션이 한 번 시작되면 계속 실행되기 때문에 이 문제가 크게 부각되지 않았습니다. 하지만 MSA 는 인스턴스가 빈번히 생성 및 소멸되고 여러 서버가 긴밀히 통신하는 환경입니다. 이로 인해 특정 시스템이 재부팅되면 연결된 다른 시스템의 응답 속도까지 지연되는 문제가 발생했으며, 무중단 배포·잦은 배포·오토스케일링 등으로 인해 기존 아키텍처보다 성능 지연 현상이 더 빈번하게 나타나게 되었고, 전체적인 서비스 성능 이슈의 문제가 됐습니다. 🚦 Cold Start가 발생하는 이유Java 애플리케이션은 네이티브 코드가 아닌 JVM 위에서 바이트코드 실행 방식으로 동작하기 때문에, 첫 실행 시 다음과 같은 과정에서 오버헤드가 발생합니다. 1. JVM 초기화 과정의 복잡성Java 애플리케이션이 시작될 때 여러 단계의 초기화 과정을 거쳐야 합니다:

0

[JAVA] - Cold Start

목차 [JAVA] - 가비지 컬렉션 튜닝 [JAVA] - Garbage Collection(가비지 컬렉션) [JAVA] - JVM (자바 가상 머신) 🧊 Cold Start란?Cold Start는 JVM이 애플리케이션이 처음 실행될 때 초기화 과정 때문에 발생하는 지연(latency) 을 의미합니다. 마치 추운 겨울날 자동차 시동을 걸 때 엔진이 따뜻해질 때까지 시간이 걸리는 것과 비슷합니다. 일반적인 서버 환경에서는 애플리케이션이 한 번 시작되면 계속 실행되기 때문에 이 문제가 크게 부각되지 않았습니다. 하지만 MSA 는 인스턴스가 빈번히 생성 및 소멸되고 여러 서버가 긴밀히 통신하는 환경입니다. 이로 인해 특정 시스템이 재부팅되면 연결된 다른 시스템의 응답 속도까지 지연되는 문제가 발생했으며, 무중단 배포·잦은 배포·오토스케일링 등으로 인해 기존 아키텍처보다 성능 지연 현상이 더 빈번하게 나타나게 되었고, 전체적인 서비스 성능 이슈의 문제가 됐습니다. 🚦 Cold Start가 발생하는 이유Java 애플리케이션은 네이티브 코드가 아닌 JVM 위에서 바이트코드 실행 방식으로 동작하기 때문에, 첫 실행 시 다음과 같은 과정에서 오버헤드가 발생합니다. 1. JVM 초기화 과정의 복잡성Java 애플리케이션이 시작될 때 여러 단계의 초기화 과정을 거쳐야 합니다:

0

[Spring Boot] - 스프링 프로퍼티 암호화

스프링부트 민감정보 암호화 하기운영 중인 프로그램에서 DB 암호나 API 키와 같은 민감 정보를 설정 파일에 평문으로 저장할 경우, 프로그램이 유출되면 그대로 외부에 노출되는 심각한 보안 문제가 발생할 수 있습니다. 이를 방지하기 위해 프로퍼티 암호화를 적용하면, 설정값이 유출되더라도 평문이 아닌 암호화된 형태로만 노출되므로 보안성을 크게 강화할 수 있습니다. 자바 환경에서는 이러한 암·복호화를 손쉽게 지원하는 Jasypt 모듈을 활용할 수 있어, 운영 환경에서 안전하게 민감 정보를 관리할 수 있습니다. 이번 포스팅에서는 Spring boot 에 Jaspyt 적용해 프로퍼티를 암복호화 하는 내용을 작성했습니다 암복호화를 위한 라이브러리 추가// Jasypt for property encryptionimplementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5' 값 암호화 하기java -cp "build/libs/app.jar" com.ulisesbocchio.jasyptspringboot.cli.JasyptEncryptorCLI \ input="my-db-pass" \ password="${JASYPT_ENCRYPTOR_PASSWORD}" \ algorithm="PBEWITHHMACSHA512ANDAES_256" \ ivGeneratorClassName="org.jasypt.iv.RandomIvGenerator" Configuration 추가

0

[Java] - 가비지 컬렉션 히스토리

목차 [JAVA] - 가비지 컬렉션 튜닝 [JAVA] - Garbage Collection(가비지 컬렉션) [JAVA] - JVM (자바 가상 머신) 초기 GC들 (JDK 1.0~1.4)Serial GC 가장 오래된 GC 단일 스레드로 동작 작은 애플리케이션이나 클라이언트 환경에 적합 Stop-the-World 시간이 길어서 현재는 제한적으로 사용 Parallel GC (Throughput Collector) JDK 1.4에서 도입 멀티코어 환경에서 여러 스레드를 사용해 처리량을 개선 JDK 6~8에서 기본 GC 여전히 긴 정지 시간이 단점 저지연 목표 GC들 (JDK 1.4~)Concurrent Mark Sweep (CMS) GC