전체 글 93

9/30 팀프로젝트 클라이언트 개발

우리 팀 프로젝트에서 만들 게임은 방치형 주제로 만들계획이었는데,아이디어 수집 중 "블랙홀 키우기"라는 뱀서라이크 게임을 만들자는 결과가 나와 방치형이랑 거리가 있는 게임이 결정되었다.레퍼런스 링크 : https://aarimous.itch.io/a-game-about-feeding-a-black-hole 그래도 팀원들이 이 게임이 간단하고 추가할 것이 있어서 만들기 괜찮을것 같다고 해서 만들기로 했다.(그러나 튜터님의 많은 피드백이 있었지만) 아무튼, 게임에 가장 핵심인 요소는 화면을 터치하면 블랙홀 주변에 잔해들을 파괴하고 한 판이 끝나고 업그레이드 화면으로 노드 트리로 구성된 스탯을 업데이트 하여 강화를 하는 게임이다여기서 내가 맡은 역할은 한판 결과 처리한 수와 획득받은 보상의 수치를 0부터 해당..

9/29 AWS EC2 및 IAM Role 실습

오늘 배운 내용1. EC2 인스턴스 생성AWS EC2 인스턴스를 생성하면서 다음 설정을 진행했다.이름 태그: 인스턴스를 쉽게 구분하기 위한 이름 지정AMI 선택: EC2에서 사용할 운영체제 및 기본 환경 선택인스턴스 유형: CPU, 메모리 등의 컴퓨팅 자원 선택키 페어: EC2에 SSH로 접속할 때 사용하는 인증 키 설정 (한번 밖에 발급이 안되니 관리를 잘하자)네트워크 설정: VPC, 서브넷, 보안 그룹 등의 네트워크 환경 설정2. IAM Role 설정EC2가 AWS의 다른 서비스에 접근할 수 있도록 IAM Role을 설정했다.IAM Role을 사용하면 EC2 내부에 AWS 액세스 키를 직접 저장하지 않고도 필요한 AWS 서비스에 권한을 부여할 수 있다.3. EC2 보안 및 권한 설정생성한 EC2의 보..

9/28 AWS, AIM 그리고 Spring Boot Actuator

AWS란Amazon Web Service로 아마존사가 제작한 클라우드 서비스다. 현재 서버 개발도구 1위이며 국내에서도 사용한다.전 세계에서 분산된 데이터를 가지고 있으며 사용하고 싶은 위치를 사용할 수 있다. AWS의 기본적인 서비스EC2 (Elastic Compute Cloud) : AWS에 제공하는 클라우드 컴퓨팅 서비스 내가 원하는대로 서버를 세팅할 수 있다.환경변수를 아마존 데이터 센터로 옮길 수 있는 원격 컴퓨터.EC2의 인스턴스유형family (용도), generation(세대 "높을수록 좋음"), additional capability(g가 있으면 Arm, 없으면 x86 또는 x64)size(사양) nano 보통 small이상을 사용한다.상태타입설명EC2 비용Public IP데이터Pendi..

9/22 과제를 마치며

오늘은 Lua Script활용과 멀티서버를 구현했다. 완성한 결과 Redis Lua Script로 채팅 횟수 제한문제기존에는 Redis에서 채팅 횟수를 조회하고 INCR하는 작업을 별도로 수행했다.동시에 요청이 들어오면 두 요청이 같은 횟수를 읽어 5회를 초과해서 허용할 수 있는 문제가 있었다.해결Lua Script를 사용하여 다음 작업을 하나의 원자적인 작업으로 처리했다.local value = redis.call('GET', KEYS[1])local count = tonumber(value or '0')if count >= 5 then return 0endlocal updated = redis.call('INCR', KEYS[1])if updated == 1 then redis.call('..

9/21 채팅 메시지 저장 오류 / 접속자 목록 조회 / Redis를 이용한 최근 채팅 캐시 구현

Lv13. WebSocket 채팅 메시지 저장 오류 분석 1. 문제 상황WebSocket을 이용한 채팅 기능을 구현하고 테스트하는 과정에서 다음과 같은 오류가 발생했다.Cannot invoke "ChatMessageResponse.getSender()"because "saved" is null 디버깅 로그에서는 다음과 같이 확인되었다.saved [worldId, nickname, content] : 42, Alice, null 즉, createResponse()에서 사용하는 content 값이 null이 되었고, 그 결과 ChatService.saveMessage()의 반환값인 saved도 null이 되어 NPE가 발생했다.2. 원인 분석처음에는 DB 저장 과정이나 ChatResponse의 문제라고 생각..

9/18 Web Craft 과제

9/16 (수) 부터 지금까지 12단계 까지 다다랐다. 과제를 달성하면서 간단한 문제도 있었으나 막힌 부분이 있었는데,여기서 가장 인상이 남은 문제는 7단계의 WebSocket 연결과 사용자 식별이다.핵심 클래스의 원본 코드와 수정한 부분은맨 윗줄의 수정한 부분이 playerRepository.existsByNickname(nickname); 이 request의 쿼리를 받아서 저장된 nickname을 가져오는 줄 알았는데, 실행을 해보니 에러코드가 나왔다.그래서 playerRepository.existsByNickname(nickname)은 DB에 있는 nickname이 있는지만 검사하는 코드이다. 받은 nickname이 없거나 null이면 에러코드가 나와야 한다.다음으로 attribute에 속성과 데이..

9/17 Web Socket

Web Socket이란?실시간으로 프로토콜 연결을 유지해주는 통신 기능이다.HTTP에서 WebSocket으로 전환하는 과정을 프로토콜 업데이트라고 한다. Handshake : WebSocket 연결을 여는 절차Polling : 클라이언트가 HTTP요청을 보내 새 데이터가 있는지 확인하는 방식인데, 구현하기 쉬우나 매번 요청이 필요한다.SSE : HTTP연결을 유지하는 방식으로 서버 ➡️ 클라이언트로 단방향 통신으로 알림, 실시간 로그, 진행 상태 전달 등에 많이 쓰인다.경로와 핸들러@Configuration@EnableWebSocket // WebSocket 처리 활성@RequiredArgsConstructorpublic class WebSocketConfig implements WebSocketConf..

9/16 조회성능과 Redis

정리에 앞서 내가 어제 강의를 듣고 그냥 자료에 나온대로만 정리한 것 같아서이번 장에서 실습 결과나 핵심이 될만한 코드위주로 설명할 것이다.지연 로딩과 N+1 문제여러 건 조회 1번에 각 항목마다 연관 데이터를 가져오는 조회 N번 더해지는 현상 [POST] /users입력결과입력결과{"nickname" : "Toriel"}{ "id": 1, "nickname": "Toriel"}{"nickname" : "Undyne"}{ "id": 4, "nickname": "Undyne"}{"nickname" : "Sans"}{ "id": 2, "nickname": "Sans"}{"nickname" : "Alphys"}{ "id": 5, "nickname": "Alphys"}..

9/15 Spring 인증 및 인가

인증 (Authentication)누구인지 확인하는 절차로그인을 통해 신원확인인증실패하면401 Unauthroized인가 (Authorization)특정 행위를 할 수 있는지 확인하는 절차권한을 통해 접근확인인증실패하면403 Forbidden그렇다면, Accounting은 무엇인가?사용자가 갖고 있는 자산 등을 말한다. 계좌, 포인트 등을 말한 것이다.세션세션이란 서버가 로그인 정보를 보관하는 저장소다. 서버가 저장하는 현상을 Stateful이라고 한다.1. 스프링에서 JESSIONID 라는 Session Key를 사용하여 세션을 세팅하고 쿠키에 담아 응답[Server ➡️ Client 쿠키이름] Set-Cookie : JESSIONID=abc123 'abc123'은 랜덤값2. 클라이언트는 자동으로 세..

9/14 챕터 1 정리 Spring 활용

Bean 생명주기와 스코프빈의 일생은 [ 생성 ➡️ 주입 ➡️ 초기화 ➡️ 사용 ➡️ 소멸 직전] 순으로 컨테이너 구간마다 관리하는데 주로 초기화, 소멸직전을 많이 접근할 것이다.생성아직 초기화되지 않는 상태주입생성 및 스코프 완료초기화@PostConstruct 실행 (의존성 준비)소멸@PreDestroy 실행 초기화랑 소멸을 자주 사용하기에 언급했던 두 어노테이션을 사용해보자@PostContruct@Service@RequiredArgsConstructorpublic class BadWordFilter { // 1. board.post.* 설정을 담은 빈 (1-6) private final PostProperties properties; private Set words; @PostC..