목록2025/05 (10)
개발지식 먹는 하마 님의 블로그

크롤링한 문제 DB에 저장하기✔️선행 데이터 등록 필요이번 프로젝트에서는 문제의 카테고리 (frontend, backend 등)를 Enum이 아닌 엔티티로 관리한다.Enum은 동적으로 데이터를 확장할 수 없기 때문에 엔티티로 관리하기로 결정하였다.이런 설계의 특성상 Quiz 엔티티를 생성할 때, Enum인 QuizCategoryType 대신 이를 DB에서 관리하는 QuizCategory 엔티티가 필요로 하기 때문에 반드시 먼저 QuizCategory 데이터가 생성되어있어야 한다. Quiz 등록 APIJson 파일을 입력받기 위해 MultipartFile을 사용하였다.MultipartFile : 클라이언트로부터 전송된 파일을 서버에서 받기 위한 객체 public void uploadQuizJson(M..

웹 크롤링 (Web Crawling) 이란정보의 바다 인터넷에 퍼진 수많은 정보들, 웹 문서를 웹 크롤러가 규칙에 따라 탐색 및 수집하는 것이다.크롤러는 인터넷의 여러 웹 사이트에 접속하여,해당 페이지의 내용과 링크의 복사본을 생성 및 다운로드해 요약본을 만든다.+ 검색 시, 유용한 정보만을 노출하도록 검색 색인을 추가한다.현재 구현하고자 하는 프로젝트는 사용자가 풀 수 있는 문제에 대한 데이터가 필요했다.이 문제를 문제은행의 데이터를 크롤링해 오고자 하였다.Java 기반 크롤링 라이브러리 JSoup크롤링을 할 수 있는 라이브러리에는 여러 가지가 있으나 현재 Java 기반의 프로젝트를 진행 중이니 Java 기반의 크롤링 라이브러리를 사용하면 좋을 것 같았다.Java 기반 웹 크롤링 관련 라이브러리에는 J..
최종 결과🛠️ 구현 기능좌석 선택 Redisson 기반 분산락을 통한 동시성 제어최대 수용 가능 접속자 수 이상일 때, 웹소켓 기반 대기열 구현토스 결제 시스템 연동 📹 시연 영상https://youtu.be/ZlyxP4_88Yk 📚 KPT 회고Keep PR 빠르게 확인하고 피드백하기이슈 사항 활발하게 공유하기Problem상대방이 오역하지 않도록 디테일하게 설명하기(사소한 부분이라 큰 문제는 없었지만, 내가 했던 설명을 다르게 받아들인 부분을 나중에서야 확인한 일이 있었다.)Try서로가 개발한 내용의 방식에 대해 공유하기이번 프로젝트는 특히나 주제에 비해 시간이 부족하여 겨우 프로젝트를 완성한 후,바로 최종프로젝트에 돌입했기 때문에 서로가 구현한 부분에 대한 디테일한 방식을 공유할 기회가 없었다.웹..

티켓 예매에서 가장 중요한 부분은 좌석의 상태를 관리하는 것이라고 생각했고이 부분을 꼼꼼하게 관리하기 위한 부분에 집중했다.그렇다 보니 구조가 조금씩 리팩토링 되었다.이번 글에서는 그 과정에 대해 정리하고자 한다.💡트러블 슈팅 - Redis 데이터 형태 구조 변경 🟩1차 구현Redis의 TTL 기능을 통해 좌석의 예매 상태를 관리하고자 하였다.회차별 좌석 상태를 나타내는 SeatScheduleInfo의 Id를 Key로,좌석의 상태를 Value로 설정하여 데이터를 Redis에 저장한다.Available(예매 가능) 상태였던 좌석이 Selected(선점됨)로 변경된 후, 5분 이내에 Hold(결제 진행 중)가 되지 않으면 데이터 삭제 후, 다시 Available 상태로 설정되도록TTL을 5분으로 설정하였..

이번 협업에서는 Github의 CI 기능을 적용하였다.❓ 문제 상황별도의 DB를 사용하지 않는 하위 3개의 항목에 대해서는 Github Action 빌드가 성공한다.그러나 그 이후의 빌드부터는 실패하게 된다. 🤷 문제 원인우리가 로컬 환경에서 테스트할 때는 필요한 DB가 설치되어있고 환경변수도 설정되어있기 때문에문제가 없지만, Github 환경은 다르다.Github에는 기본적으로 DB 설치 및 환경변수가 설정되어있지 않기 때문에 위와 같은 오류가 발생하게 된다. ✅ 해결 방법[ 가장 간단한 해결방법 ]Test 코드를 삭제한다.해당 오류는 테스트 코드를 실행하면서 발생하는 것이기 때문에 Test 코드를 삭제하면 빌드 성공 여부만 검사하게 된다.그러나, 이 방법은 추천하지 않는다.실제 현업에서 빌드 성공 ..

고민에 따른 수정사항우선 튜터님께서 회차별 좌석의 정보(상태, 가격, 등급 등)를 나타내는 엔티티의 이름이 모호하다는 피드백을 받아서회차별 좌석 정보라는 뜻으로 seat_schedule_info로 변경했다.1) 가격 등급 표기 방법가격은 좌석과 회차별 좌석 정보가 함께 가지고 있고 초기에 자동으로 회차별 정보가 생성될 때, 좌석 엔티티에 설정되어있는 등급과 가격으로 초기 설정되도록 하였다.2) 좌석 상태 표기좌석 상태의 유효시간을 일부 다르게 설정해줘야 했기 때문에SELECTED, HOLD 등 다양한 상태를 다루기로 하였다.Redis의 TTL을 사용하여 각 상태에 따른 만료 시간을 다르게 설정해주었다.트러블 슈팅) 복잡하게 꼬인 생각좌석 선택과 좌석 상태 조회에 대한 동시성 제어를 동시에 고려하다보니Re..

프로젝트 선정대용량 트래픽 동시성 제어의 대표적인 예시를 떠올렸을 때, 수강신청과 콘서트 티켓팅이 떠올랐다.익명 투표를 통해 콘서트 티켓팅을 구현하기로 선정하였다.역할 분담공통 인프라 및 인증 담당 (1명)공연 관리 및 공연 정보 담당 (1명)좌석 선택 및 동시성 제어 담당 (1명)예약 및 대기열/티켓팅 흐름 담당 (1명)결제 및 테스트 결제 API 담당 (1명)다음과 같이 역할을 분배하였고 나는 3번 좌석 선택 및 동시성 제어 담당을 맡았다.다만, 일주일 내에 수행하기에는 너무 난이도와 비중이 높은 것 같아서 2번을 맡은 팀원 분이 추후에 합류하여 함께 도와주시고후반부에 다 함께 성능 개선을 위한 방법을 논의하기로 하였다.도메인 주도 설계 DDD 시도아직 관련 자료들을 훑어보는 중이라 이렇게 하는 게 ..

Transactional의 다양한 활용법을 알 수 있었다. -> (별도의 글에 정리 중이다.)페이징 조회 시, 카운트 쿼리로 인한 중복된 부분을 줄일 수 있는 방법에 대해 고민해볼 수 있었다.https://devhippo.tistory.com/112 [Spring] QueryDSL 기초 + 페이징 적용QueryDSL데이터 조회 시, 간단한 조회는 JPA를 통한 메서드명 설정만으로 조회를 할 수 있지만, 복잡한 조회를 위해서는 JPQL로 쿼리문을 문자열로 작성해야 한다.이는 가독성이 떨어지고 오타와 같devhippo.tistory.com대용량 데이터 처리 시도 및 결과100만개의 데이터에서 입력한 닉네임과 일치하는 유저를 조회하는 경우 877ms, 0.877sec가 소요되었다.대용량 데이터에 대한 조회 성..

Spring 기반 애플리케이션의 인증(Authentication)과 권한 부여(Authorization)를 담당하는 강력한 보안 프레임워크이다principal - credential 패턴 principal (주체) - 인증을 받으려는 사용자나 시스템의 '식별자'credential (자격 증명) - 사용자가 인증/인가를 위해 제공하는 것Filter 기반Bean으로 설정 가능Spring Security 구조 및 기능 Authentication Manager는 인증을 담당하고 Authentication Provider가 실제 로직을 수행한다.Security Context인증된 사용자의 정보를 저장한다.SecurityContextHolder를 통해 애플리케이션 어디서나 인증된 사용자 정보에 접근할 수 있다!Au..

QueryDSL데이터 조회 시, 간단한 조회는 JPA를 통한 메서드명 설정만으로 조회를 할 수 있지만, 복잡한 조회를 위해서는 JPQL로 쿼리문을 문자열로 작성해야 한다.이는 가독성이 떨어지고 오타와 같은 휴먼 에러가 발생하기 쉽다.QueryDSL은 JPQL을 Java 코드로 안전하게 작성할 수 있도록 도와주는 프레임워크로 JPQL의 단점을 보완한다.가독성이 좋다.문법 오류 없이 안전하게 작성할 수 있다.IDE 자동완성이 지원된다.QueryDSL 설정 방법1. 의존성 추가✅ 의존성dependencies { implementation 'com.querydsl:querydsl-jpa' annotationProcessor 'com.querydsl:querydsl-apt' annotationPr..