본문 바로가기

전체 글30

[Spring WebSocket] Redis를 이용한 채팅 고도화 0. In-Memory 기반 Message Broker 문제점 Spring에서 제공하는 STOMP를 활용해 내장된 Simple Message Broker를 통해 채팅 서버 구현이 가능하지만, Spring 서버의 내부 메모리에서 동작하게 되면 아래와 같은 문제가 발생할 수 있다. 서버거 다운되거나 재시작하면 Message Broker에 있는 데이터들이 유실될 수 있다. 다수의 서버일 경우 서버 간 채팅방을 공유할 수 없어 다른 서버 간에 있는 사용자와의 채팅이 불가능하다. 이러한 문제를 해결하기 위해 외부 Message Broker를 사용할 수 있다. 대표적으로 Apache Kafka, Redis, RabbitMQ 등이 있다. 1. Redis Redis는 STOMP 프로토콜을 지원하지 않지만, Redis가.. 2023. 9. 1.
[Spring Boot] 전화번호 인증 with NCP SMS API & Redis 0. Naver SMS API 선택 이유 SMS 서비스에 ‘Cool SMS’를 많이 사용하지만, Nava SMS API의 경우 매월 50건의 무료메세지 발송 및 Naver Cloud Platform 첫 가입 시 10만 크레딧을 제공한다고 하여 선택하게 됐다. (할인 크레딧 신청) 해당 크레딧은 네이버 클라우드 플랫폼에서 제공하는 다른 솔루션에도 사용할 수 있으니 유용하게 쓸 수 있다. (단, 실제로 결제가 가능한 카드를 연동해야 한다.) 1. NCP 세팅 1.1. SMS 프로젝트 생성 콘솔 > Services > ‘Simple & Easy Notification Service’ 선택 프로젝트 생성하기 1.2. 발신번호 등록 SMS 메시지를 발송하기 위해서는 발신번호를 등록해야한다. Project > 발신.. 2023. 8. 3.
[Spring Boot] AWS S3 이미지 업로드 1. AWS S3 세팅 1.1. 버킷 생성 1. AWS Console > S3 > 버킷 > 버킷 만들기 2. 버킷 이름 입력 3. ‘모든 퍼블릭 액세스 차단’ 선택 해제 후 모든 퍼블릭 액세스 차단에 대한 안내 문구 박스 체크 4. 버킷 만들기 선택 1.2. 버킷 정책 등록 1. Amazon S3 > 버킷 > 버킷 이름 선택 2. 권한 > 버킷 정책 > 편집 아래 내용 입력 후 저장 { "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1405592139000", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::버킷이름/*", "arn:aws:s3:::버킷이름.. 2023. 8. 3.
가비아(gabia) DNS 등록하기 1. 가비아 홈페이지 접속 후 ‘My가비아’로 이동 2. 이용 중인 서비스에서 ‘도메인’ 선택 3. ‘DNS로 관리툴’ 선택 4. 등록하려는 도메인 ‘설정’ 선택 5. DNS 설정에서 ‘레코드 수정’ 선택 6. ‘레코드 추가’ 선택 및 호스트와 IP 주소 입력 후 ‘확인’ > ‘저장’ 선택 7. 일정 시간(최대 하루)이 지난 후 도메인 접속 https://www.gabia.com 웹을 넘어 클라우드로. 가비아 그룹웨어부터 멀티클라우드까지 하나의 클라우드 허브 www.gabia.com 2023. 7. 25.
[GitHub] GitHub Issue & Pull Request Template 사용하기 GitHub에서 Issue와 Pull Request를 이용해 프로젝트를 진행하던 중 각 양식을 반복적으로 복사&붙여넣기 해야하는 일이 번거롭게 느껴졌다. 그래서 template을 이용해 양식을 사용해 본문 작성을 자동화했다. 프로젝트 루트 디렉토리에 .github 폴더 생성 프로젝트의 루트 디렉토리에 '.github' 폴더를 생성한다. .github 폴더 아래 각 템플릿 파일 생성 .github 폴더 아래에 'issue_template.md'와 'pull_request_template.md'를 생성해주고, 각 파일에 본문을 채워준다. 파일 생성 후 add → commit → push를 하면 아래와 같이 새로운 Issue & Pull Request 생성 시 본문이 채워진다. Issue Template에 대.. 2023. 7. 11.
[Spring WebSocket] Spring WebSocket STOMP 적용 1. STOMP STOMP(Simple Text Oriented Messaging Protocol)는 메시징 전송을 효율적으로 하기 위한 프로토콜로, PUB/SUB 기반으로 동작한다. WebSocket만 사용해서 구현하면 해당 메시지가 어떤 요청인지, 어떤 포맷인지, 메시지 통신 과정을 어떻게 처리해야 하는지 정해져 있지 않아 일일이 구현해야 한다. STOMP를 서브 프로토콜로 사용하면 클라이언트와 서버가 서로 통신하는 데 있어 메시지의 형식, 유형, 내용 등을 정의해준다. 따라서 메시지를 송신, 수신에 대한 처리를 명확하게 정의할 수 있으며, WebSocketHandler를 직접 구현할 필요없이, @MessageMapping과 같은 어노테이션을 사용해서 메시지 발행 시 엔드포인트를 별도로 분리해서 관리.. 2023. 6. 19.
[Spring REST Docs] Spring REST Docs 적용기 0. 들어가며 SSAFY에서 첫 번째 프로젝트를 진행할 당시 API 명세서를 노션에 작성하였다. 프로젝트 관리를 노션으로 했기 때문에 접근이 편하고, 가독성이 좋다는 장점이 있었지만, 개발을 진행하며 API가 수정되었는데 API 명세서에 반영되지 않아 프론트엔드 팀원에게 소환되는 일이 종종 발생했었다. 이러한 문제를 해결하기 위해 API 명세서 작성을 자동화해야겠다고 생각했고, 두 번째 프로젝트에서 바로 적용했다. 비교적 도입이 쉬운 Swagger가 아닌 Spring REST Docs를 채택한 이유는 세 가지다. 이전에 써봤다. Spring 스터디를 진행하며 Spring REST Docs를 완벽하게 이해하고 사용한 것은 아니지만, 어찌저찌 써본 경험이 이번 프로젝트에서는 더 잘 쓸 수 있을 것이라는 용기.. 2023. 5. 31.
[Java] String Pool 0. String 객체 Java에서 문자열을 표현하는 String은 불변객체다. String name = "jeongyun"; name += "eo"; System.out.println(name); // jeongyuneo 위 코드에서 name에 문자열을 더한다고 해서 문자열의 값이 바뀌는 것이 아니라, 새로운 객체를 만들어 그 참조값을 참조하게 된다. 만약 같은 값을 갖는 문자열을 여러 번 선언한다면, Heap 영역에 매번 새로운 객체를 생성하게 될 것이다. 이는 메모리 낭비로 이어진다. 따라서 Java는 문자열 객체를 캐싱(caching)한다. 💡 캐싱(caching) - 데이터를 미리 복사해 임시 저장해놓는 것 - 데이터 접근 시간을 줄일 수 있음 1. String Pool Java의 Heap 영역.. 2023. 4. 18.
[Code Tree] 싸움땅(Java) 문제 https://www.codetree.ai/training-field/frequent-problems/battle-ground/description?page=3&pageSize=20 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요. www.codetree.ai 풀이 [자료 구조] - int[][] DELTAS: 사방 이동 좌표 - PriorityQueue[][] guns: 격차에 위치한 총들의 공격력 - 내림차순 정렬 - int[][] players: - 0번 인덱스: x 좌표 - 1번 인덱스: y 좌표 - 2번 인덱스: 방향 - 3번 인덱스: 초기 능력치 - 4번 인덱스: .. 2023. 4. 6.