본문 바로가기

Project

[MySQL] 한글 데이터 ? 물음표 깨짐 해결 방법 개요 MySQL 테이블 데이터를 SELECT 했더니 한글 데이터가 ? 물음표로 출력되는 문제가 발생했습니다. 한글 깨짐 현상을 어떻게 해결할 수 있는지 알아보겠습니다. 문제 원인 우선 저는 AWS RDS에 MySQL 서버를 설치해 사용 중입니다. RDS와 동일한 VPC에 위치한 EC2의 Springboot 애플리케이션 API로 데이터를 요청했을 때는 한글이 잘 출력되었습니다.  반면 로컬 컴퓨터에서 Docker로 MySQL 컨테이너를 띄워 RDS에 접속한 상황에서는 한글 데이터가 깨졌습니다. 이를 통해 MySQL 컨테이너의 인코딩 설정이 문제가 있을 것이라 판단했습니다. SHOW variables LIKE 'character%';  위 명령어를 작성해 확인 결과 character_set_results와 .. 더보기
Springboot로 Web Socket 상에서 STOMP 메시지 브로커 적용하기 개요 지난 포스팅에서는 특정 URL로 전달되는 웹소켓 요청을 처리하는 웹소켓 핸들러를 구현했습니다. 웹소켓 핸들러 내부에 컨커런트 해시맵 자료구조를 두고, 웹소켓 연결이 체결된 클라이언트의 세션을 관리했습니다. 하지만 이 방식은 다음의 단점이 존재했습니다. URL(채팅방) 마다 웹소켓 요청을 처리할 웹소켓 핸들러를 구현해 매핑해야 한다.메시지 인식에 문제가 없도록 클라이언트와 서버 간 전달할 데이터 형식을 정해야 한다.메시지를 전달하기 위한 웹소켓 세션 관리 로직(메시지 채널링)을 개발자가 직접 작성해야 한다.  이번 포스팅에서는 스프링이 제공하는 내장 심플 메시지 브로커를 사용해 1,2,3번 모두 해결해 보겠습니다. 그전에 Simple Message Broker는 STOMP 메시징 프로토콜을 사용하므로.. 더보기
[AWS] S3 이미지 업로드 후 URL 접근 시 Access Denied 해결 문제 AWS S3 버킷에 이미지를 업로드한 후 url로 접근 시 Access Denied 문제가 발생했습니다. 프론트엔드에서 url로 이미지 리소스에 접근해야하기 때문에 문제를 해결해야만 했습니다. 해결 방법S3 버킷 화면에서 권한 탭을 누릅니다. 퍼블릭 액세스 차단 편집 버튼을 누른 뒤, 위 화면에서 체크를 비활성화하고 변경사항 저장을 누릅니다. 다시 권한 탭으로 돌아가 버킷 정책 편집 버튼을 누릅니다. 아래 json 코드를 복사 붙여넣기 한 뒤 Resource 키의 밸류로 버킷의 arn을 작성합니다. { "Version":"2012-10-17", "Statement":[{ "Sid":"PublicReadGetObject", "Effect":"Allow", "Principal": ".. 더보기
Springboot로 Web Socket 서버 구축하기 개요 일반적인 채팅 애플리케이션은 상대방이 나에게 메시지를 전송하면, 내 화면에 즉시 메시지가 표시됩니다. HTTP 통신은 클라이언트와 서버 간 요청과 응답이 완료되면 연결을 끊어버리기 때문에, 상대방이 메시지를 전송했는지 안 했는지 알기 위해서는 새로고침을 해야만 합니다.  하지만 나에게 신규 메시지가 전송될 때마다 새로고침 하는 것은 우리가 원하는 방법이 아닐 겁니다. 이 문제를 해결하기 위해 사용할 수 있는 프로토콜은 바로 Web Socket인데요, 왜 그런지 살펴보도록 하겠습니다. Web Socket 특징 2가지 HTTP 통신과 비교했을 때 WebSocket 통신에서 두드러지는 특징이 2가지가 있습니다. 첫째, 클라이언트와 서버가 TCP 3-way 핸드셰이크로 연결을 체결한 후, 해당 연결을 끊지.. 더보기
Web3j 라이브러리를 활용한 이더리움 통신 Spring boot 프로젝트 개요 최근 블록체인 기술에 흥미가 생겼다. 빠르게 블록체인 생태계를 경험해보고 싶어 DApp을 개발해보려 한다. 흔히 DApp은 Truffle, Hardhat 프레임워크 상에서 Solidity 언어로 Smart Contract를 작성하고 배포한 뒤, 자바스크립트 라이브러리 web3.js를 통해 스마트 컨트랙트를 호출하여 동작한다.  하지만 이번 프로젝트는 블록체인 생태계에 대한 빠른 이해를 위해 진행하는 것이다. 따라서 Java 백엔드 개발을 해왔던 나에게 있어 개발 편의성 및 효율성을 따져, Web3j 라는 자바 진영 이더리움 라이브러리를 사용해보았다. 다음 프로젝트에서 Smart Contract를 작성해 Klaytn 블록체인의 Baobab 테스트넷에 배포하고, web3.js 자바스크립트 라이브러리로 .. 더보기
[프로젝트] 순수 자바로 웹 애플리케이션 서버(WAS) 구현하기 1. 개요 프로젝트 진행 동기 저는 여느 때와 다름없이 스프링을 학습하고 있었습니다. 그런데 문득 의문이 들었습니다. 어째서 아무 설정을 건드리지 않고도 프로젝트가 기본적으로 TCP/IP 계층의 8080 port를 사용하고 있는 것인지 Application 계층의 HTTP 메시지를 스펙을 따라 직접 파싱 하지 않고도 개발을 편리하게 할 수 있는지 위 궁금증을 해결하기 위해 구글링을 하던 중 Servlet 이라는 기술을 알게 되었습니다. 서블릿은 HTTP 요청 메시지를 읽어 들여 스펙에 맞게 파싱 하고, 응답을 내려줄 때도 스펙에 맞게 알아서 HTTP 응답 메시지를 작성해 준다는 것이었습니다. 그래서 서블릿 없이 순수한 자바로 WAS를 구현해보려 합니다. 프로젝트 달성 목표 개발한 웹 어플리케이션 서버(W.. 더보기
[이슈 해결] Exception in thread "main" java.net.BindException: Address already in use: bind 1. 발생 이슈 자바 프로그램을 개발하다 실행하려 했더니 갑자기 java.net.BindException이 발생했다. 2. 문제 원인 예외 발생의 원인은 바로 이미 java 프로세스가 실행 중이었는데 추가로 실행하려 했기 때문이었다. 작업관리자에서 OpenJDK Platform binary 프로세스를 종료 후 다시 실행하니 제대로 동작했다. 더보기
[Error] AWS CodeDeploy 이전 배포 파일 사라지는 현상 & 로그 위치 개요 현재 AWS 프리티어 계정의 한 대의 EC2에서 Client와 WAS 를 함께 배포하고 있다. 하지만 어째서인지 클라이언트를 배포하면 WAS 파일이 삭제되고 WAS를 배포하면 클라이언트가 삭제되는 현상이 발생했다. 결론적으로 그 원인은 바로 CodeDeploy의 동작 방식에 있었다. AWS CodeDeploy 공식 문서 EC2/온프레미스 배포 문제 해결 - AWS CodeDeploy Amazon Linux, RHEL 및 Ubuntu Server 인스턴스에서 정리 파일은 /opt/codedeploy-agent/deployment-root/deployment-instructions/에 있습니다. Windows Server 인스턴스에서의 위치는 C:\ProgramData\Amazon\CodeDeploy\.. 더보기