문제상황 GET API에 대해서 포스트맨이나 크롬에서 확인해 봤을 때에는 응답 시간이 0.1초 이내로 짧았는데, 스웨거에서 테스트했을 때는 10초 이상 걸리는 상황. 해당 API는 db의 5000개 가량의 데이터를 조회하는 GET API 문제 접근 포스트맨이나 크롬에서 테스트했을 때는 문제가 없었기 때문에 스웨거 관련 세팅을 잘못했을 것이다. 그래도 혹시 모르니 아래와 같이 로그를 찍어보았는데, 스웨거로 실행했을 때에도 포스트맨과 동일하게 ‘요청받은 시각’과 ‘응답 시각’ 차이가 0.1초 이내였다. 즉, 조회 결과를 스웨거 화면상에서 보여줄 때 지연이 발생한다는 것이었다. log.info("요청 받은 시각 : " + new SimpleDateFormat("YYYY. MM. DD HH:mm:ss.SSS")..
분류 전체보기
Release란? 소프트웨어를 빌드한 결과물을 쉽게 배포할 수 있도록 도와주는 기능이다. 구체적으로, 프로젝트의 버전을 마킹하고, 버전별 변경 사항, 릴리스 노트, 그리고 해당 소스 코드 및 바이너리 파일을 제공하는 데 사용할 수 있다. 언제 사용? 새로운 기능을 추가하거나 기존 기능을 업데이트한 후, 해당 변경 사항을 반영한 소프트웨어의 배포 버전 관리 시 사용. 배포 전략으로 활용할 수 있으며, 프로젝트를 특정 시점으로 롤백할 때 유용하게 사용할 수 있다. Tag Tag는 Commit에 붙일 수 있는 꼬리표로, Commit에 Release 버전을 명시할 수 있다. 예시 상황으로, 기존의 어떤 기능을 업데이트하고 push했는데 해당 기능에 버그가 있어 원래대로 되돌려야 할 때 업데이트 전 커밋의 태그를..
HTTP 통신을 통해 XML 데이터를 ReqeustBody로 받아서 파싱 후 처리한 후 다시 Response Body로 반환하는 API를 만들었다. 그 과정에서 xml 데이터를 String으로 받아서 Document 객체로 변환하고 Tag 들을 파싱 하여 값을 조회하고 수정하는 방법에 그리고 다시 Document를 String으로 변환하는 방법에 대해서 정리하였다. 기본 내장 라이브러리를 사용하기 때문에 build.gradle에 따로 의존성 추가할 건 없다. // build.gradle plugins { id 'java' id 'org.springframework.boot' version '3.2.3' id 'io.spring.dependency-management' version '1.1.4' } ja..
Redis란? Remote Dictionary Server의 약자. Key-Value 형태의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반 DBMS 데이터베이스, 캐시, 메시지 브로커 등으로 사용되며, 인메모리 데이터 구조를 가진 저장소이다. db-engines.com 에 따르면 23년 11월 기준 key-value 형태의 저장소 중 Redis가 가장 인기 있는 DBMS이다. ※ 인메모리 데이터 저장소 사용 이유 데이터베이스에 데이터를 저장하는 경우, 매번 디스크에 접근해야 하기 때문에 사용자가 많아질수록 부하가 많아져서 성능이 저하된다. 굳이 데이터베이스에 저장하지 않아도 되는 경우, 이러한 부하를 줄이기 위해 인메모리 데이터 저장소를 사용할 수 있다. Redis의 장점 및 특징 데이터를 메모..
문제 상황 Feign Client를 사용하여 Naver Cloud Platform의 SMS 서비스 Open API를 요청하는데 401(Unauthorized) 에러 발생. 해결 과정 Unauthorized 에러이기 때문에 네이버 서버에 인증하는 부분에서 값이 제대로 들어가지 않았다고 생각하여 먼저, 인텔리제이 환경변수에 serviceId, 액세스 키, 시크릿 키 값이 제대로 들어갔는지 확인함. → 제대로 들어가 있었음. HttpHeader를 여러 개 전달해야 했는데, 그 과정에서 여러 개의 헤더가 제대로 들어가지 않았다 생각하여 Header를 만들고 전달하는 방법을 바꾸어 시도 → 동일하게 401에러 발생 스프링 코드의 Feign Client에서 Naver 서버로 Post 요청을 보낼 때, 헤더 값이 제..
서비스 회원가입 시 휴대폰 문자 인증 기능을 구현하기 위해 NCP(Naver Cloud Platform)에서 제공하는 SENS API를 Feign Client로 호출하는 과정을 정리하였다. SENS(Simple & Easy Notification service)는 NCP에서 제공하는 서비스로, sms 뿐만 아니라 push, 알림톡 등 다양한 기능을 사용할 수 있다. 그중, sms를 이용하여 회원가입을 하고자 하는 유저의 전화번호로 인증 번호를 보내고 인증을 수행하였다. 그 과정을 RestTemplate이 아니라 Feign Client로 구현하였다. 공식 문서가 친절하게 잘 정리되어 있어서 API를 사용하기 편리하다. Feign 이란? Netflix에서 개발한 Http Client Binder 이다. 선언..
https://www.acmicpc.net/problem/17616 17616번: 등수 찾기 표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에 세 정수 N, M, X가 공백을 사이에 두고 주어진다. (2 ≤ N ≤ 105, 1 ≤ M ≤ min(N(N-1)/2, 5×105), 1 ≤ X ≤ N) . 다음 M 줄에는 각각 두 정수 A, B가 주어 www.acmicpc.net 두 학생 중 어느 학생의 등수가 더 높은지, 상대적인 정보만을 가지고 특정 학생이 가질 수 있는 등수의 범위를 찾아 최대, 최소를 구하는 문제이다. 구하고자 하는 학생을 기준으로, 등수가 높은 학생과 낮은 학생의 수를 각각 BFS를 활용하여 구한 후, 이를 바탕으로 가능한 가장 높은 등수, 낮은 등수를 구했다. ( 가능한 가장 높은 ..
https://www.acmicpc.net/problem/2539 2539번: 모자이크 수찬이는 선생님을 도와서 교실 벽면을 장식할 모자이크 그림을 그리기로 하였다. 이를 위하여 직사각형 모양의 큰 도화지를 준비하여 교실 벽에 붙이고 1cm 간격으로 가로선과 세로선을 그려서 www.acmicpc.net 문제 입력 조건에서 행과 열의 개수가 100만이라 2차원 배열을 사용하면 메모리초과가 난다. 또한 가장 작은 색종이의 크기를 구하는 문제인데 각 색종이의 크기마다 도화지에 대해 반복문을 돌리면 시간초과가 난다. 따라서 도화지 전체에 대해서가 아니라 잘못 칠해진 페인트에 대해서 반복문을 돌리고, 색종이의 크기에 대해서 이분탐색을 수행하여 색종이의 최소 크기를 구하였다. 잘못 칠해진 페인트의 좌표를 pair로..
HTTP 상태코드 : 클라이언트가 서버로 보낸 요청의 처리 상태를 응답에서 알려주는 기능. 1xx (Informational) 요청이 수신되어 처리중 2xx (Successful) 요청 정상 처리 3xx (Redirection) 요청을 완료하려면 추가 행동이 필요 4xx (Client Error) 클라이언트의 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없음. 5xx (Server Error) 서버의 오류, 서버가 정상 요청을 처리하지 못함. 클라이언트가 인식할 수 없는 상태코드를 서버가 반환하는 경우 - 클라이언트는 상위 상태코드로 해석해서 처리(2xx대, 3xx대 등) - 299와 같은 인식할 수 없는 상태코드가 반환되면 2xx(Successful)로 받아 요청을 정상 처리했다고 해석. - 따..
Ssh로 ec2에 접속하여 build를 할 때 아무리 기다려도 빌드가 끝나지 않는 경우가 있다. git clone으로 프로젝트를 가져와 빌드했는데 빌드가 끝나지 않길래 환경설정을 잘못해 줘서 충돌이 난 건가 의심했는데 알고 보니의 메모리가 부족해서 일어난 문제였다. Aws ec2 프리티어인 t2.micro의 경우 램이 1gb이다. 1기가 가지고 스프링을 빌드하기엔 역부족이었나 보다.메모리가 더 큰 인스턴스를 사용하면 깔끔하게 해결할 수 있지만 과금 폭탄이 무섭기 때문에 차선책을 이용하여 해결했다. 바로 가상메모리를 사용하는 방법이다. Ec2의 디스크 용량을 램처럼 사용할 수 있다. 리눅스에서는 SWAP 메모리를 지정하여 HDD의 일부를 RAM처럼 사용할 수 있게 해 준다. 램을 증설한 효과를 얻는 것..