H E L L O    W O R L D !
...

총 방문자 수

...

[]

총 포스팅

전체 글

·부트캠프/Dev
개요개발 중인 서비스에서 가게명 검색으로 한계가 있어, 통합 검색을 구현하게 돼서 이 과정에서 발생한 트러블 슈팅 및 개선 과정을 소개하고자 합니다.통합 검색 구현1차 구현처음 구현은 DB의 LIKE로 검색을 구현해 봤습니다. 결과는 100만 건 데이터 기준으로 5초가 소요되는 것을 확인할 수 있었습니다.2차 구현2차 구현은 1차 구현의 속도 문제를 해결하기 위해 검색 컬럼에 인덱스를 적용하였습니다. 결과는 다음과 같았습니다.1차와 같이 5초가 소요됐는데 LIKE의 "%text%"검색의 경우 인덱스를 적용하지 않는 것을 알았고, "text%" 검색의 경우 정상적으로 인덱스를 활용해서 빠르게 검색이 됐습니다. 하지만 "text%"로 검색을 할 경우 검색에 매우 제한적이기에 적용할 수 없었습니다.3차어떻게 ..
·부트캠프
캠프 이전의 삶저는 원래 게임 디자이너로 일하다가 우연한 계기로 게임 클라이언트 프로그래머로 전향하게 되었습니다. 프로그래밍에 대한 관심이 생긴 뒤, 저는 콩스튜디오라는 회사에서 게임 클라이언트 프로그래머로 계약직으로 근무할 기회를 얻었습니다. 비록 2개월이라는 짧은 기간이었지만, 당시 회사에서 정말 좋은 상사분을 만나 귀중한 경험을 쌓을 수 있었습니다. 계약이 종료된 후에도 상사분께서 제 능력을 인정해주셨고, 다른 게임 회사에 저를 개인적으로 추천해주시는 등 큰 도움을 주셨습니다.하지만 당시 저는 제 경력과 미래에 대해 고민하기 시작했습니다. 면접을 보러 다니며 자주 듣던 질문 중 하나는 “가장 좋아하는 게임이 무엇인가요?”였습니다. 이 질문에 바로 대답하지 못하는 제 자신을 보며 무언가 어긋나 있다는..
·트러블 슈팅
문제대기열 구현을 마친 후 jmeter로 동시에 1000명의 유저가 대기열에 등록했을 때 각 유저의 발권번호가 중복으로 겹치는 동시성 이슈가 발생하였다.현재 대기열에 등록하는 로직은 다음과 같다.(테이블의 경우 발권번호 테이블, 웨이팅 테이블이 존재)발권번호 테이블 컬럼storeId(가게 아이디)waitingNumber(발권번호) -> 은행의 대기번호와 같은 개념웨이팅 테이블userId(웨이팅 등록 유저의 아이디)storeId(등록할 가게의 아이디)orderNum(순서)유저가 대기열에 등록 요청을 보낸다.발권번호 테이블에서 해당 가게의 발권번호가 존재하는지 검사발권번호가 있다면 대기열 번호를 저장해두고 1을 증가시킨다.발권번호가 없다면 새로 생성한다.대기열 테이블에 가게 아이디와, 유저 아이디, 저장했던..
·부트캠프/Dev
프로젝트우리는 회의 끝에 캐치테이블과 같이 예약, 웨이팅을 할 수 있는 서비스를 만들기로 했다. 각 자 분석을 한 후 어떤 기능들을 구현할지 정했다.먼저 나는, 웨이팅과 검색 기능을 담당하기로 했다. 원래는 알림도 있었지만, 비즈톡과 같은 API는 일단 사용을 안하고 있어서 잠시 접어두었다.웨이팅의 경우에는 생각보다 순탄하게 구현할 수 있었다. 검색 부분이 조금 애를 먹었지만 해결하고 나니까 재밌게 구현한 것 같다. 아직 남은 기간동안 보완/개선할 점들이 있겠지만, 현재는 만족스럽게 두 기능 구현이 돼있는 것 같다.25일까지 다시 열심히 달려서 취업에 꼭 성공해야겠다!
·DB
레디스 센티넬이란레디스 센티넬과 레디스 클러스터는 모두 레디스의 안정성과 확장성을 높이기 위한 방법입니다. 하지만 두 방식은 역할과 기능이 다릅니다. 여기서 다룰 주제인 레디스 센티넬은 레디스 서버의 고가용성을 보장하는 시스템입니다. 즉, 서버가 죽더라도 서비스가 계속되도록 도와주는 시스템입니다.특징모니터링센티넬은 마스터와 슬레이브 레디스 인스턴스를 지속적으로 감시하면서 서버가 정상적으로 동작하고 있는지 확인합니다. 이를 통해 서버가 다운되거나 문제가 생겼을 때 신속하게 대응할 수 있습니다.마스터 서버: 데이터를 읽고 쓰는 역할을 하는 주 서버슬레이브 서버: 마스터 서버의 데이터를 복제하는 서버로, 마스터 서버에 문제가 생겼을 때 대신 동작센티넬은 주기적으로 PING 명령어를 보내 서버의 상태를 점검하고..
·부트캠프/Dev
이번 담당 기능에 슬랙 알림 기능 구현을 맡게 되었다.슬랙 알림은 주요 메서드가 실행될 때 로그 같은 형식으로 알림을 보내는 용도이다.바로 구현을 해보자// slack api gradleimplementation 'com.slack.api:slack-api-client:1.27.2' 먼저 gradle에 추가해 준다.제일 처음으로 생각한 방법은 이벤트를 사용하는 방식이었다.1. 사용자가 요청을 해서 메서드를 실행시킨다.2. 메서드에서 슬랙 알림을 보내는 이벤트를 발행한다.3. 이벤트 처리에서 슬랙에 알림을 보낸다.그럼 이벤트는 어떤 걸로 처리를 해야 할까? 여러 가지 이벤트 핸들링 방법이 있다. 예를 들어, RabbitMQ, 레디스 PubSub, 카프카 등등 하지만 우리의 프로젝트는 규모가 작은 프로젝트이..
·부트캠프/Dev
어느덧 최종 프로젝트 전에 할 수 있는 마지막 팀 프로젝트가 시작됐다. 주제는 트렐로같은 사이트를 만드는 것이었다.프로젝트 진행 속도를 높이기 위해 미리 템플릿을 만들어 두었다. 미리 만들어 둔 기능은 공통 반환 타입, 회원가입, 로그인, 토큰 인증 인가, 리프레쉬 토큰이다. 공통 반환 타입의 경우 왜 이렇게 구현했는지 문서로 작성해서 팀원들과 공유하고 팀원들도 좋아해주는 분위기였다. 또,  이번 프로젝트에서는 깃 이슈를 활용해서 협업을 진행하면 어떨까 해서 이 부분에 대한 설명도 함께 문서로 작성하고 팀원들과 잘 얘기하여 적용하는 방향으로 진행하게 됐다. 저번 프로젝트에서는 properties 파일들을 ignore로 올렸었는데 이번 프로젝트에서는 .env 파일을 사용하기로 했다. 이번 프로젝트에서 맡은..
구현쿠키 생성과, 조회수 기능을 구현했다.쿠키쿠키의 생성에는 제목, 쿠키의 설명, 카테고리, 연결될 시리즈 그리고 비디오, 썸네일, 첨부파일을 받도록 하였다. 쿠키를 생성할 때 다양한 레포지토리, 서비스 클래스들을 주입받아야 했는데 이 부분은 쿠키 생성을 하는 퍼사드 클래스를 만들었다.@Component@RequiredArgsConstructor@Transactionalpublic class CookieCreateFacade { private final CookieRepository cookieRepository; private final ChannelRepository channelRepository; private final CategoryRepository categoryReposi..
구현현재 프로젝트는 Spring Security를 사용하고 jwt 토큰으로 인증/인가를 구현했다. 기존의 방식은 액세스 토큰을 헤더에 넣고, 리프레쉬 토큰을 쿠키에 넣은 후 mysql에 refresh 토큰 정보를 넣어서 사용했다. mysql에 넣을 시 안사용하는 토큰들을 주기적으로 정리해줘야 하는 불편함이 있어서 이 참에 Redis로 변경하기로 했다.인증이 성공했을 때 위와 같이 로그인 정보를 프론트에 보내주고, 레디스에는 리프레쉬 토큰을 저장해 주고 TTL을 리프레쉬 토큰 유효시간 동안 걸어주었다. public ResponseDto reissue(String refreshToken) { if(refreshToken == null) { return ResponseDt..
왜 변경하게 되었나기존에 업로드 방식은 hls로 변환하는 작업도 @Async이고, 그 후에 s3로 업로드하는 작업도 @Async로 되어있어서 체이닝하는 방식으로 사용했다. 처음에는 이 방식이 좀 더 괜찮아보였는데 생각해보니까 영상을 업로드할 때 한 번만 비동기 처리를 해주고 나머지는 안에서 동기적으로 처리를 해주는게 좀 더 깔끔하고, 에러 핸들링도 쉬울 것 같았다. (기존에는 CompletableFuture로 thenCompose와 exceptionally로 뭔가 복잡하게 했었다.)변경일단 hls컨버트를 담당하는 클래스는 Convert라는 인터페이스를 상속받도록 변경하였다.public interface Converter { RETURN convert(INPUT input);}@Slf4j(topic ..
·부트캠프/Dev
세팅gradle implementation 'org.springframework.boot:spring-boot-starter-amqp' testImplementation 'org.springframework.amqp:spring-rabbit-test'위 두 라이브러리를 추가해주자.propertiesspring.rabbitmq.host=localhostspring.rabbitmq.port=5672spring.rabbitmq.username=guestspring.rabbitmq.password=guest프로퍼티즈도 위와 같이 설정해주자ConfigConfig 설정을 따로 해주자.@Configurationpublic class RabbitMqConfig { @Value("${rabbitmq.qu..
·부트캠프/Dev
사전지식AMQPAMQP(Advanced Message Queuing Protocol)는 메세지 지향 미들웨어에서 사용되는 오픈 표준 프로토콜로, 애플리케이션 간 메세지를 안정적이고 효율적으로 전송하기 위한 규칙이다. 주로 메세지 브로커와 클라이언트 간의 통신을 표준화하여, 메세지를 송수신하는 과정에서 다양한 시스템 간 호환성을 보장하는 것이 목적이다.특징플랫폼 독립성: AMQP는 표준화된 프로토콜로 서로 다른 언어나 플랫폼으로 개발된 애플리케이션이 AMQP를 통해 메세지를 교환할 수 있다. 즉, 다양한 언어로 개발된 시스템 간에도 호환된다!확실한 메세지 전달 보장: 메세지가 손실 없이 목적지에 도달할 수 있도록 확실한 메세지 전달을 지원한다. 메세지가 성공적으로 전달되지 않으면 재전송할 수 있으며, Ac..
nameless1004
Nameless