문제상황 GET API에 대해서 포스트맨이나 크롬에서 확인해 봤을 때에는 응답 시간이 0.1초 이내로 짧았는데, 스웨거에서 테스트했을 때는 10초 이상 걸리는 상황. 해당 API는 db의 5000개 가량의 데이터를 조회하는 GET API 문제 접근 포스트맨이나 크롬에서 테스트했을 때는 문제가 없었기 때문에 스웨거 관련 세팅을 잘못했을 것이다. 그래도 혹시 모르니 아래와 같이 로그를 찍어보았는데, 스웨거로 실행했을 때에도 포스트맨과 동일하게 ‘요청받은 시각’과 ‘응답 시각’ 차이가 0.1초 이내였다. 즉, 조회 결과를 스웨거 화면상에서 보여줄 때 지연이 발생한다는 것이었다. log.info("요청 받은 시각 : " + new SimpleDateFormat("YYYY. MM. DD HH:mm:ss.SSS")..
Study
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/1764 1764번: 듣보잡 첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다. www.acmicpc.net 두 그룹을 입력받아 중복되는 사람의 수와 명단을 출력하는 문제이다. HashSet을 이용하여 중복을 제거하고 contains 여부를 판단한 후 오름차순으로 출력하였다. set에는 Collections.sort()를 적용할 수 없어서 ArrayList로 변환한 후 오름차순으로 정렬하였다. 사실 두 그룹의 중복여부만 판별하면 되기 때문에 각 그룹의 중복은 제거할 필요없지만 HashSet을 써보고 싶..
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 즉, 입지 않는 경우의 수를 포함하여 곱해주..
연관관계 매핑을 JPA 계의 포인터라고도 한다. 낙오의 갈림길이라는 의미이다. 연관관계의 개념을 정확히 알지 못한 채 프로젝트를 진행하다 보니 헷갈리는 부분이 너무 많아서 기본 개념을 확립해야겠다는 생각이 들었다. 연관관계 매핑 객체는 참조(주소)를 사용해서 관계를 맺고, 테이블은 외래 키를 사용해서 관계를 맺는다. 이 둘은 완전히 다른 특징을 가진다. 객체 관계 매핑에서 가장 어려운 부분이 바로 객체 연관관계와 테이블 연관관계를 매핑하는 일이며 이를 연관관계 매핑이라 한다. 객체 연관관계와 테이블 연관관계의 가장 큰 차이 참조를 통한 연관관계는 항상 단방향이다. 객체의 양방향 관계는 사실 서로 다른 단방향 관계 2개이다. 반면, 테이블은 외래 키 하나로 양방향으로 JOIN할 수 있다. 테이블의 양방향 ..
인텔리제이에서 mysql을 사용하는 방법을 정리해보았다. mysql 설치부터 연결까지 초기 세팅 과정이다. 만약 mysql을 사용하는데 아래와 같은 에러가 발생한다면 깜빡한 것이 있는지 확인해보자. ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (10061) 1. mysql을 설치해준다. 아래 링크에서 둘 중 아래 파일을 클릭하여 인스톨러를 다운받는다. 만약 컴퓨터에 visual studio가 깔려있지않은 경우 설치해줘야 한다. 하지만 최신버전인 2022는 또 안된다. 2019 버전을 설치해주자 https://dev.mysql.com/downloads/installer/ MySQL :: Download MySQL Install..
IoC와 DI는 스프링에만 국한된 단어가 아니다. IoC는 프로그래밍 원칙 중 하나이고 DI는 디자인 패턴 중 하나이다. 제어의 역전(Inversion of Control) : 내가 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것. 말 그대로 제어권이 뒤바뀐다는 의미한다. 객체 측면에서는 객체에 대한 제어권을 애플리케이션이 가지는 게 아니라 프레임워크가 가지는 것을 의미한다. IoC가 왜 필요한가? 기존에는 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고 연결하고 실행까지 다 했다. 한 마디로 구현 객체가 프로그램의 제어 흐름을 스스로 다 조종했다. 혼자서도 모든 걸 알아서 잘하는 스마트한 객체를 설계했다는 뜻이다. 이는 개발자의 입장에서는 자연스러운 흐름이며 프로..