2025/04 13

Strategy Pattern (전략 패턴)

전략 패턴은 알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스에 넣은 후 그들의 객체들을 상호교환할 수 있도록 하는 행동 디자인 패턴입니다.한 코드에서 다르게 동작해야 하는 부분들이 존재할 때, 그 부분들을 따로 빼는 것 Ex)기존 Navigator 클래스는public class Navigator { public Route roadRoute() { // ... 도로 루트 로직 return route; }}와 같은 형태로 이루어져 있었는데, 어플리케이션이 확장되면서 대중교통, 걷기 루트가 추가됨.public class Navigator { public Route roadRoute() { // ... 도로 루트 로직 return route; } ..

Template Method Pattern (템플릿 메소드 패턴)

템플릿 메서드는 부모 클래스에서 알고리즘의 골격을 정의하지만, 해당 알고리즘의 구조를 변경하지 않고 자식 클래스들이 알고리즘의 특정 단계들을 오버라이드​(재정의)​할 수 있도록 하는 행동 디자인 패턴입니다.여러 코드에서 중복되는 부분이 존재할 때, 그 중 중복되지 않는 부분만 재정의 할 수 있도록 따로 빼는 것 Ex)DocDataMiner, CSVDataMiner, PDFDataMiner의 mine 메소드에서,rawData = extract(Doc/CSV/PDF)Data(file) data = parse(Doc/CSV/PDF)Data(rawdata)부분을 제외하면 모두 같음. 변하는 부분과, 변하지 않는 부분을 분리하여 모듈화 할 수 있으면 더 깔끔한 구조가 될 것. 템플릿 메서드 패턴은, "템플릿" ..

MySQL 비교 시 대소문자 구분

문제: 아이디 로그인 시 대소문자 구분 안하고 있음 원인: MySQL: 기본적으로 소문자 구분 안 함 (case-insensitive)인데, 테이블/컬럼의 collation이 utf8_general_ci라면 구분 안 하고, utf8_bin이면 구분함 SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'your_database_name'; 로 collation 확인 테이블 뿐만 아니라 각 컬럼의 collation도 바꿔줘야 함 ALTER TABLE your_table_name MODIFY email VARCHAR(255) COLLATE utf8mb4_bin;

Project/Boilerplate 2025.04.21

OAuth2.0 로그인 시 Access Token 재발급 문제

현재 내 OAuth2.0 로그인 로직은, 백엔드에서 모든 로직을 처리 후, 프론트로 Refresh Token 전달 후, 재발급을 통해 Access Token을 발급하는 방식을 사용하고 있음. 문제:OAuth2.0 로그인 후, 백엔드에서 Refresh Token 발급은 제대로 됐지만, 재발급 시 Redis에서 Refresh Token이 존재하지 않아 재발급이 실패. 원인:재발급 요청에 REFRESH_TOKEN이 2개가 들어감 cookie: REFRESH_TOKEN=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiUkVGUkVTSCIsImlkIjoxLCJpc3MiOiJib2lsZXJwbGF0ZSIsImlhdCI6MTc0NDg4NDUxNSwiZXhwIjox..

Project/Boilerplate 2025.04.21

AWS EC2에서 OAuth2.0 로그인 및 쿠키 저장 문제

문제:OAuth2.0 로그인을 시도하면,401 Unauthorized를 응답함.Request URL:http://:8080/login/oauth2/code/google?state=&scope=email+profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+openid+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&authuser=0&prompt=noneRequest Method:GETStatus Code:401 UnauthorizedRemote Address::8080Referrer Policy:strict-origin-when-cross-origin SecurityConfig.jav..

Project/Boilerplate 2025.04.21

AWS EC2 Next.js 배포

Dockerfile (Next.js 프로젝트 최상위 폴더)# 1단계: 빌드FROM node:22-alpine AS builderWORKDIR /appCOPY . .RUN npm installRUN npm run build# 2단계: 런타임FROM node:22-alpineWORKDIR /appCOPY --from=builder /app .RUN npm install --omit=devEXPOSE 3000CMD ["npm", "run", "start"] 1. Next.js 빌드 이미지파일로 생성 (Local IDE)docker build -t next-app . 2. 생성한 이미지파일 tar로 압축하기 (Local IDE)docker save next-app > next-app.tar 3. 압축한 이미지 ..

Project/Boilerplate 2025.04.15

AWS EC2+RDS SpringBoot+MySQL 배포

1. ./gradlew build 로 스프링부트 빌드해서 jar 파일 생성2. scp -i .pem ubuntu@:/home/ubuntu-> ec2 :/home/ubuntu에 jar 파일 저장3. ssh -i .pem ubuntu@ 로 ec2 접속4. .env 파일 생성 (환경 변수 설정)5. 환경변수 설정 및 기존 프로세스 종료 자동화 스크립트deploy.sh#!/bin/bash# 1. 환경 변수 로딩export $(grep -v '^#' .env | xargs)# 2. 기존 프로세스 종료 (포트 8080 기준)PID=$(lsof -ti:8080)if [ -n "$PID" ]; then echo "🔄 기존 Spring Boot 프로세스 종료 중 (PID: $PID)..." kill -9 $PID..

Project/Boilerplate 2025.04.15

이미지 저장용 EC2 + S3 버킷 연동

@Configurationpublic class S3Config { @Bean public S3Client s3Client() { return S3Client.builder() .region(Region.AP_NORTHEAST_2) // 서울 리전 .credentialsProvider(DefaultCredentialsProvider.create()) .build(); }}✅ DefaultCredentialsProvider란?DefaultCredentialsProvider는 AWS SDK가 제공하는 기본 전략입니다.아래 순서대로 자격 증명을 탐색합니다:순위위치설명1️⃣시스템 속성 (-Daws.accessKeyId)JVM..

Project/Boilerplate 2025.04.14

Prometheus + Grafana 연동

🎯 최종 목표: 이렇게 된다!Spring Boot에서 서버 상태 정보를 숫자로 뽑아내고→ Prometheus가 그걸 수집하고→ Grafana가 보기 좋게 그래프로 보여줍니다.✅ Step 1: Spring Boot Actuator가 "서버 상태 데이터"를 뽑는다예: 이런 데이터들이 자동으로 생성됨 항목설명jvm.memory.usedJVM 메모리 사용량http.server.requestsHTTP 요청 수, 응답 시간system.cpu.usageCPU 사용률process.uptime서버 실행 시간logback.events로그 발생 수👉 이 데이터는 /actuator/prometheus라는 URL에 숫자 + 설명 형식으로 노출됩니다:# HELP jvm_memory_used_bytes The amount of..

Project/Boilerplate 2025.04.12

로컬 개발에서 배포, 개발 환경 분리하기

Step 1: 프로젝트에서 하드코딩된 URL/포트 찾기@Value("${app.frontend.url}")private String FRONTEND_URL;필요한 곳에 위와 같은 형태로 변수 생성 (이후 더 좋은 방법 리팩토링 필요) Step 2: application.properties 분리하기application-dev.propertiesapplication-prod.properties두가지로 분리하여,application.properties에서는spring.application.name=boilerplatespring.profiles.active=dev#spring.profiles.active=prod주석으로 바꿔가면서 설정 적용 가능. 추가적으로, 더미데이터 삽입, 로컬 저장 서비스 등 로컬 개발..

Project/Boilerplate 2025.04.10