Study

· Study
문제 상황로컬(Mac M1)에서 Docker로 만든 이미지는 정상 실행됐음.하지만 docker save로 저장 후 다른 서버에 옮겨서 docker load를 하자 다음과 같은 오류 발생:해결과정1. tar 파일 깨짐 의심에러메시지를 구글링 해봤을 때, 가장 많이 나오는 원인은 ASCII 모드 전송으로 파일이 깨지는 경우이고, 추천 해결 방법은 아래와 같음.https://stackoverflow.com/questions/40622162/docker-load-and-save-archive-tar-invalid-tar-header 하지만 나는 -o, -i 옵션 사용했고, binary 모드 전송도 확인했기 때문에 해당 문제 아니었음 2. 런타임 환경변수 주입 실패Dockerfile의 FROM 절에 들어가는 기본..
· Study
카카오 로그인 과정3단계로 이루어져 있다.https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#request-code카카오 인증 서버에서 제공해주는 토큰을 사용하는 것은 토큰 만료 기간 설정에 제약이 있어 자체 jwt 구현 및 운용 추천 Step1, Step2는 클라이언트에서 처리할 수 있음백엔드에서는 클라이언트에서 넘겨주는 토큰을 가지고 인증 및 로그인 처리를 구현하면 되는데, Step1,2를 거치지 않으면 Step3도 구현할 수 없기 때문에 테스트할 수 있는 방법에 대해 정리했다.Step1 & 2Kakao Developers 사이트에서 애플리케이션을 만들고 발급받은 restapiKey 와 지정한 redirectUrl 값을 잘 가져와서,아래 ..
· Study/JAVA
STOMPSimple Text Orientated Messaging Protocol의 약자Web Socket 위에서 동작하며 서버를 거쳐 클라이언트 간의 비동기 양방향 통신을 지원하는 프로토콜이다.서버와 클라이언트가 통신할 주체인 메시지의 유형, 형식, 내용들을 정의한다.이름에서 알 수 있듯이 Text 기반의 메시지 형식을 사용한다.pub/sub 형태의 통신이다.PUB(Publish) : 특정 토픽을 구독 중인 모든 클라이언트에게 메시지 발행SUB(Subscribe) : 특정 토픽을 클라이언트가 구독STOMP를 사용한다는 말이 메시지 브로커를 사용한다는 말과 동치는 아니지만, 대부분의 경우, STOMP를 통한 통신은 메시지 브로커와 함께 사용된다. STOMP 사용 이점메시지의 형식을 정의할 수 있기 때문..
· Study/Spring
문제상황 GET API에 대해서 포스트맨이나 크롬에서 확인해 봤을 때에는 응답 시간이 0.1초 이내로 짧았는데, 스웨거에서 테스트했을 때는 10초 이상 걸리는 상황. 해당 API는 db의 5000개 가량의 데이터를 조회하는 GET API 문제 접근 포스트맨이나 크롬에서 테스트했을 때는 문제가 없었기 때문에 스웨거 관련 세팅을 잘못했을 것이다. 그래도 혹시 모르니 아래와 같이 로그를 찍어보았는데, 스웨거로 실행했을 때에도 포스트맨과 동일하게 ‘요청받은 시각’과 ‘응답 시각’ 차이가 0.1초 이내였다. 즉, 조회 결과를 스웨거 화면상에서 보여줄 때 지연이 발생한다는 것이었다. log.info("요청 받은 시각 : " + new SimpleDateFormat("YYYY. MM. DD HH:mm:ss.SSS")..
· Study/Spring
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..
· Study/Spring
Redis란? Remote Dictionary Server의 약자. Key-Value 형태의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반 DBMS 데이터베이스, 캐시, 메시지 브로커 등으로 사용되며, 인메모리 데이터 구조를 가진 저장소이다. db-engines.com 에 따르면 23년 11월 기준 key-value 형태의 저장소 중 Redis가 가장 인기 있는 DBMS이다. ※ 인메모리 데이터 저장소 사용 이유 데이터베이스에 데이터를 저장하는 경우, 매번 디스크에 접근해야 하기 때문에 사용자가 많아질수록 부하가 많아져서 성능이 저하된다. 굳이 데이터베이스에 저장하지 않아도 되는 경우, 이러한 부하를 줄이기 위해 인메모리 데이터 저장소를 사용할 수 있다. Redis의 장점 및 특징 데이터를 메모..
· Study/Spring
문제 상황 Feign Client를 사용하여 Naver Cloud Platform의 SMS 서비스 Open API를 요청하는데 401(Unauthorized) 에러 발생. 해결 과정 Unauthorized 에러이기 때문에 네이버 서버에 인증하는 부분에서 값이 제대로 들어가지 않았다고 생각하여 먼저, 인텔리제이 환경변수에 serviceId, 액세스 키, 시크릿 키 값이 제대로 들어갔는지 확인함. → 제대로 들어가 있었음. HttpHeader를 여러 개 전달해야 했는데, 그 과정에서 여러 개의 헤더가 제대로 들어가지 않았다 생각하여 Header를 만들고 전달하는 방법을 바꾸어 시도 → 동일하게 401에러 발생 스프링 코드의 Feign Client에서 Naver 서버로 Post 요청을 보낼 때, 헤더 값이 제..
· Study/Spring
서비스 회원가입 시 휴대폰 문자 인증 기능을 구현하기 위해 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 이다. 선언..
· Study/JAVA
https://www.acmicpc.net/problem/1764 1764번: 듣보잡 첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. www.acmicpc.net 두 그룹을 입력받아 중복되는 사람의 수와 명단을 출력하는 문제이다. HashSet을 이용하여 중복을 제거하고 contains 여부를 판단한 후 오름차순으로 출력하였다. set에는 Collections.sort()를 적용할 수 없어서 ArrayList로 변환한 후 오름차순으로 정렬하였다. 사실 두 그룹의 중복여부만 판별하면 되기 때문에 각 그룹의 중복은 제거할 필요없지만 HashSet을 써보고 싶..
· Study/JAVA
HashMap에서 입력받은 Key가 존재하는지 확인하고, HashMap 전체를 탐색하는 방법 https://www.acmicpc.net/problem/9375 9375번: 패션왕 신해빈 첫 번째 테스트 케이스는 headgear에 해당하는 의상이 hat, turban이며 eyewear에 해당하는 의상이 sunglasses이므로 (hat), (turban), (sunglasses), (hat,sunglasses), (turban,sunglasses)로 총 5가지 이다. www.acmicpc.net 의상의 이름은 사실 필요없는 값이다. 종류별 몇 개가 있는지만 기록하고, 각 종류별 부분집합을 구하는 문제인데 모든 종류의 옷을 입지 않아도 되기 때문에 각 종류별로 0 즉, 입지 않는 경우의 수를 포함하여 곱해주..