목록Programing (190)
T_era
1. 개요1.1 운영 환경EC2: vCPU 2개, 메모리 4GBRDS: vCPU 1개, 메모리 2GB테스트 환경: Docker 컨테이너를 통한 운영 환경 시뮬레이션1.2 성능 목표처리량: 40~60 RPS응답시간: p95 CPU 점유율: 최대 30%에러율: 1.3 부하 테스트 시나리오테스트 도구: k6총 테스트 시간: 약 30분가상 사용자: 10명 시작, 10명씩 2분마다 증가, 최대 100명중단 조건: 에러율 5% 초과 또는 응답시간 수용 불가2. 1차 부하 테스트 결과2.1 테스트 설정# Tomcat 스레드 풀server: tomcat: threads: max: 20 min-spare: 10# HikariCP 커넥션 풀hikari: minimum-idle: 5 maximu..
1. Dockerfile 작성하기프로젝트의 가장 최상위 위치(.gitignore 파일이 있는 곳)에 Dockerfile이라는 이름의 파일을 만들기 확장자 X # 1. 베이스 이미지 선택 (JDK 17, MAC 기반)FROM eclipse-temurin:17-jdk# 2. JAR 파일이 생성될 경로를 변수로 지정ARG JAR_FILE_PATH=build/libs/*.jar# 3. build/libs/ 에 있는 JAR 파일을 app.jar 라는 이름으로 복사COPY ${JAR_FILE_PATH} app.jar# 4. 컨테이너가 시작될 때 이 명령어를 실행ENTRYPOINT ["java", "-jar", "/app.jar"]#FROM: 어떤 환경을 기반으로 이미지를 만들지 선택.##COPY: 내 컴퓨터에 있는..
개요10,000건의 이벤트 데이터를 처리하는 과정에서 발생한 성능 문제를 해결한 방법. 초기에는 컨트롤러에서 3-4초, 서비스에서 900ms 정도 소요되던 작업을 최종적으로 80% 정도의 성능을 개선했다.초기 성능 문제 상황성능 측정 결과 (개선 전)1단계 - Event 저장 완료: 22ms2단계 - ProductApiClient 호출 완료: 236ms (조회된 상품 수: 10000)3단계 - EventItem 객체 생성 완료: 4ms4단계 - EventItem insert 완료: 1052ms5단계 - Event에 EventItem 리스트 설정 완료: 0ms6단계 - WSEventProduct 객체 생성 완료: 1ms7단계 - 이벤트 발행 완료: 799ms=== createEvent 총 실행시간: 211..
핵심 내용:웹소켓 프로토콜의 동작 원리 이해STOMP의 역할과 필요성 인지양방향 통신 vs 지속적 연결양방향 통신 (Full-Duplex)정의동시에 양쪽 방향으로 데이터 전송 가능서버 ↔ 클라이언트가 동시에 일어날 수 있음Java WebSocket 예시// 서버 측 WebSocket 핸들러@Componentpublic class ChatWebSocketHandler extends TextWebSocketHandler { private final Map sessions = new ConcurrentHashMap(); @Override public void afterConnectionEstablished(WebSocketSession session) { sessions.put(s..
1. WebSocketConfig의 핵심 메서드1) registerStompEndpoints이 메서드는 클라이언트가 최초로 WebSocket 연결을 맺을 엔드포인트를 정의.@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws") .setAllowedOriginPatterns("*") .withSockJS();}주요 속성 및 옵션addEndpoint(String path)클라이언트가 연결할 엔드포인트 경로를 지정합.예: /ws → 클라이언트는 ws://서버주소/ws로 연결setAllowedOrigins(String... origin..
1. RestTemplate 직접 생성 방식RestTemplate restTemplate = new RestTemplate();순수한 RestTemplate 인스턴스만 생성됨.Spring Boot의 자동설정(메시지 컨버터, 커넥션 타임아웃, 커넥션 풀 등)이 적용되지 않음.JSON 변환 등 메시지 컨버터를 직접 추가해야 함.커스텀 ClientHttpRequestFactory를 직접 지정해야 하며, 설정이 번거로움.장점:PATCH 등 일부 HTTP 메서드 지원을 위해 커스텀 팩토리 지정이 가능.단점:설정이 불편하고, 실수로 인한 오류 가능성 높음.Spring Boot의 편리한 자동설정 혜택을 못 받음.PATCH 메서드 지원Java 기본 HttpURLConnection은 PATCH를 지원하지 않음.PATCH..
1. 데이터 전송 방식의 종류브로드캐스트(Broadcast)네트워크에 연결된 모든 디바이스(클라이언트)에게 데이터를 전송하는 방식유니캐스트(Unicast)한 명의 특정 클라이언트에게만 데이터를 전송멀티캐스트(Multicast)여러 명의 특정 그룹(여러 클라이언트)에게만 데이터를 전송2. 옛날 방식: PollingPolling클라이언트가 주기적으로 서버에 데이터를 요청하는 방식Short-Polling일정 주기마다 서버에 요청구현이 쉽지만, 불필요한 네트워크 트래픽 발생Long-Polling클라이언트가 요청 후, 서버에서 데이터가 준비될 때까지 대기데이터가 준비되면 응답, 아니면 타임아웃Short-Polling보다 오버헤드가 적음3. Server-Sent Events (SSE)특징서버 → 클라이언트 단방향 ..
🎯 개요Spring Boot에서 AWS S3를 활용해 사용자 프로필 이미지를 관리하는 API를 구현해보기1️⃣ 환경 설정AWS S3 버킷 생성버킷명: your-project-bucket리전: ap-northeast-2 환경변수 설정DB_USERNAME=your_db_username // RDS DB masterDB_PASSWORD=your_db_password // RDS DB master passwordAWS_ACCESS_KEY=your_aws_access_keyAWS_SECRET_KEY=your_aws_secret_keyAWS_REGION=ap-northeast-2AWS_S3_BUCKET=your-project-bucketbuild.gradle 의존성implementation 'software.am..
1. 목표Spring Boot 애플리케이션을 AWS EC2에 배포/health 엔드포인트가 인증 없이 정상적으로 동작하도록 구현실시간 배포/운영 환경에서 발생한 문제와 해결 과정 기록2. 배포 및 실행 과정2-1. JAR 빌드 및 업로드./gradlew clean build -x testscp -i "/Users/ljy/Library/KeyPairs/tera199810-KeyPair.pem" build/libs/expert-0.0.2-SNAPSHOT.jar ec2-user@15.165.127.92:~/2-2. EC2 접속 및 기존 프로세스 종료ssh -i "/Users/ljy/Library/KeyPairs/tera199810-KeyPair.pem" ec2-user@15.165.127.92# 실행 중인 프..
개발하다 보면 “헬퍼 클래스”, “유틸 클래스”들을 자주 보게 된다.둘 다 공통 기능을 모아놓은 클래스라는 점은 비슷한데,실제로는 어떤 차이가 있을까?그리고 언제 Helper, 언제 Util을 써야 할까?1. 헬퍼(Helper)란?헬퍼(Helper)는“특정 상황에서, 어떤 객체의 동작을 도와주는 역할”상태(필드)를 가질 수 있고,보통 객체로 생성해서 사용하는 경우가 많음예시: 이메일 전송을 도와주는 Helperpublic class EmailHelper { private final EmailSender sender; public EmailHelper(EmailSender sender) { this.sender = sender; } public void sendWelcom..