Project 22

커플 연결 서비스 구현 (1 / ? - 흐름 및 API 구상)

1. 로그인 후, 두 사람이 각자 인증코드 발급받음2. 한 명이 상대방의 코드를 입력해 연결 요청 보냄3.요청받은 유저는 ㅇㅇㅇ로부터 커플 요청이 왔습니다 메세지 띄우기요청한 유저는 연결 중, 응답 대기중입니다 메세지 띄우기4.1 거절하면 요청자에게 거절됨 메세지 표시4.2 수락하면 두 사람은 커플로 연결됨4.3 요청자가 취소하면 요청자에게 요청을 취소했다는 알림 표시 -> 1로 돌아감1. 로그인 후, 두 사람이 각자 인증코드 발급받음프론트GET /couple/connect/code (인증코드 발급/ 이미 유효한 인증코드가 있다면 불러오기)GET /couple/connect/status/send (보낸 요청에 대한 정보)GET /couple/connect/status/receive (받은 요청에 대한 ..

Project/Duri 2025.05.06

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

Mock 테스트 중 엔티티 id 및 SecurityContextHolder 설정

@BeforeEachvoid setUp() { testUser = User.builder() .id(1L) // 오류 .email("test@example.com") .build(); User 엔티티는 id를 세팅할 수 있는 빌더가 없음. 그렇다고 AllArgsConstructor를 넣는 것은 위험함.따라서, 리플렉션을 이용해서 필드 값을 강제 설정. public class TestReflectionUtil { public static void setId(Object target, Long id) { try { Field field = target.getClass().getDeclaredField("id"); ..

Project/Boilerplate 2025.04.02