일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- jwt 표준
- AWS
- 이분탐색
- 숫자 블록
- 쿠키
- 완전탐색
- 코드 계약
- 객체지향패러다임
- prg 패턴
- 프로그래머스
- BFS
- gRPC
- 결제서비스
- 알람 시스템
- 레디스 동시성
- 디버깅
- spring event
- 트랜잭샨
- branch 전략
- 백준
- 누적합
- piplining
- 좋은 코드 나쁜 코드
- 셀러리
- 카카오
- 구현
- 깊게 생각해보기
- docker
- 검색어 추천
- 수신자 대상 다르게
- Today
- Total
목록TroubleShooting (10)
코딩관계론
서론기존의 타임딜 서비스를 구현하고 나서, nGrinder를 이용해 부하테스트를 진행했습니다. 900명의 유저가 동시에 접근해서 쿠폰 지급을 요청할 때, TPS가 190, 평균 응답시간은 2.3초가 나왔습니다. 따라서 부하가 많이 나오는 지점을 파악하여 성능을 개선 할 필요가 생겼습니다. 병목지점은 DB의 비관적 락부분과 실제 HDD까지 쓰기 작업이 완료되고 나서야 사용자에게 응답을 보내는 구조가 문제라고 생각했습니다. 따라서 이러한 문제점을 해결하기 위해 위해 In memory database를 도입하게 됐고, 궁극적으로 성능이 어떻게 개선됐는지 말씀드리겠습니다. In-memory-db를 도입했는가?속도적 측면아래 그림을 보면 속도적 측면이 있다. Redis에 접근해서 데이터를 읽을 때는 100ns +..
타임딜 쿠폰 발급 서비스를 구현하는 도중에 발급 가능한 쿠폰의 개수보다 사용자에게 전달한 쿠폰의 개수가 더 많은 일이 발생했다. 아래가 원인이 된 코드인데 자세히 알아보자. 발급 가능한 쿠폰의 개수와 사용자에게 전달된 쿠폰의 개수를 비교한다. 발급이 가능하다면, 새로운 쿠폰 엔티티를 생성하고, 사용자에게 쿠폰을 발급했다고 업데이트를 하게 된다. @Transactional public Coupon generateCouponToUser(TimeDealEvent timeDealEvent, Double discountRate){ if(timeDealEvent.getPublishedCouponNum() 만약 아래의 그림과 같이 사용자 두 명이 동시에 티켓 발급 요청이 들어오면 어떻게 될..
개요HTML form 데이터를 이용해서 게시판 글쓰기나 주문 전송을 하기 위해선 post 메소드를 이용해야 한다. 이런 post 메소드 요청을 수행한 후 브라우저를 새로고침 하면 해당 요청이 계속적으로 실행되어 서버에 중복으로 정보가 저장되는 경우가 발생하게 된다,오류 해결 시도먼저 이 오류가 발생하는 원인은 새로고침에 의해서 발생한다.인터넷 브라우저를 새로고침 하면 일반적으로 브라우저는 현재 페이지를 다시 로드하고, 이전에 사용자가 마지막으로 했던 행동을 다시 수행하게 됩니다. 따라서 이전에 보냈던 POST 요청을 다시 수행하게 됨으로 서버에는 중복된 데이터가 남아있게 된다. 이를 해결하기 위해서 PRG(Post -> Redirect -> Get)이란 패턴이 있다.POST요청 후 응답을 301로 하면서..
소개이번 글에서는 네이버 주식 테마와 관련된 정보를 크롤링하는 작업에서 발생한 초기 작업 시간이 1분 30초로 길었던 문제를 개선하여 30초로 단축하는 방법에 대해 소개하겠습니다. 맨 처음에 문제라고 생각했던 부분은 request 부분이었습니다. requsts가 느려 뒤에 있는 작업도 느려진다고 생각해 time 함수를 통해서 검증을 시도했습니다.문제 검증 처음에는 request의 속도가 느려 뒷 작업이 밀리는 것으로 인지하고 있었습니다. 따라서 time 함수를 이용해 어떤 부분이 실제로 느려지는 확인이 필요해졌고, 아래 코드와 같이 time함수를 사용해 느려지는 부분을 체크했습니다. now = time.time() page_source = self.web.get_page("https://finance.n..
개요 Telegram 라이브러리 사용 과정에서 "telegram.error.NetworkError: Unknown error in HTTP implementation: RuntimeError('Event loop is closed')" 오류가 발생했습니다. 이 글에서는 해당 오류의 발생 원인을 분석하고 해결 방법을 제시합니다. 환경 우분투 Python 버전: 3.8 오류 해결 시도 이 문제를 해결하기 위해 다음과 같은 접근을 시도했습니다. 오류의 발생과정과 관련 코드를 분석해보니 asyncio.run()을 이용하여 메세지 전송을 시도하는 부분에서 오류가 발생했습니다. 단 send_message 함수를 한번 호출하는 것은 괜찮았지만, 두 번 이상 호출하는 경우 해결하려는 오류를 만날 수 있었습니다. def..
소개 이 포스트에서는 이메일의 첨부 파일 이름이 'noname' 으로 표시되는 문제를 다룹니다. 구체적으로, 현대 측 SMTP 서버를 사용하여 이메일을 발신하던 중, 한글 파일을 첨부하면 서버에서 파일 이름을 'noname'으로 변경하여 수신자에게 전달하는 문제가 발생했습니다. 문제 원인 문제의 원인은 한글 파일을 보낼 때 인코딩과 디코딩 과정이 제대로 이루어지지 않아 발생한 것으로 확인되었습니다. 해당 문제를 해결하기 위해서는 올바른 인코딩 방식을 사용하여 파일 이름을 설정해야 합니다. 먼저 문제를 제대로 이해하기 위해 인코딩의 개념과 한글이 왜 ASCII에서 인코딩이 될 수 없는지에 대해서 설명하겠습니다. 인코딩이란 무엇인가? 인코딩은 컴퓨터에서 문자나 기호를 표현하는 방법입니다. 컴퓨터는 전기 신호..
OAuth 2.0의 개념과 목적 OAuth 2.0은 웹이나 모바일 애플리케이션 등에서 서드 파티 애플리케이션(Third-Party Application)이 사용자의 인증 정보를 안전하게 사용할 수 있도록 하는 인증 및 권한 부여 프레임워크입니다. OAuth 2.0의 주요 목적은 사용자가 서드 파티 애플리케이션에게 자신의 인증 정보(아이디, 비밀번호 등)를 제공하지 않고도, 서드 파티 애플리케이션에서 사용자의 개인 정보(예: 이메일, 친구 목록 등)를 안전하게 이용할 수 있도록 하는 것입니다. 예를들면 B 회사가 Google Calendar API에 접근하기 위해 사용자의 Google ID와 비밀번호를 요구하지 않고도, Google에서 로그인을 처리하고, 사용자가 Google Calendar API에 대한..
소개 웹 애플리케이션 보안 취약점 중 하나인 CSRF 오류는 인증된 사용자가 의도하지 않은 요청을 악의적인 공격자가 대신 보내는 경우 발생합니다. 이 기술 블로그에서는 CSRF 오류에 대한 개념과 원리, 발생 상황에 대한 예시 등에 대해 다루고, CSRF 오류를 예방하기 위한 방법들을 제시합니다. CSRF 오류의 원인 CSRF 오류가 발생하는 이유 중 하나는 HTTP의 Stateless 특성입니다. HTTP는 클라이언트와 서버 간의 연결을 유지하지 않는 Stateless한 프로토콜이기 때문에, 요청을 보낼 때마다 새로운 연결이 이루어지게 됩니다. 이러한 특성으로 인해, 서버는 요청이 유효한지 검증하기 위해 각 요청에 대한 검증 토큰을 발급합니다. 하지만, 이 토큰이 없는 상황에서 요청을 보내는 공격자가 ..
프로젝트를 하는 중 python3.7에서 지원하는 pkg를 사용해야만 하는 상황에 직면했다. 우리는 build된 docker 이미지만 있는 상황이었다. 먼저 ros version을 확인하기 위해 docker inspect 명령어를 이용해 조사헸더니 ros:melodic버전이었다. 따라서 docker hub에서 제공하는 공식 ros:melodic을 이용하기로 했다. 특이한 점은 ros:melodic의 기본 파이썬 버전이 아니라 3.7파이썬을 사용하기 위해서 python3.7을 다운로드해준다. FROM osrf/ros:melodic-desktop-full-bionic RUN apt-get update && apt-get install -y python3.7 python3-pip python 명령어가 3.7버..