목록분류 전체보기 (144)
개발지식 먹는 하마 님의 블로그

이번 협업에서는 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..

🚐 배달앱 아웃소싱 프로젝트🟪 요구사항 기능조건달성 여부공통테스트 커버리지30%이상❌필수인증/인가- Bcrypt 암호화- 권한 분류✔️필수가게 CRUD- 사장님은 최대 3개의 가게만 운영 가능✔️필수메뉴 CRUD- 삭제된 메뉴는 가게 메뉴 조회 시, 나타나지 않는다. 주문 내역 조회 시에는 나타난다.✔️필수주문 CRUD- 가게 영업 시간에만 주문 가능- 최소 주문 금액을 만족해야 가능✔️필수리뷰 CRUD- 배달 완료된 주문만 작성 가능✔️도전 (택)장바구니- 한 가게의 메뉴만 담을 수 있다- 24시간 뒤 만료✔️도전 (택)대시보드 ❌도전 (택)소셜 로그인 ✔️도전 (택)알림주문 상태 알림✔️ 도전 (택) 광고 우선 표시 기능 ✔️ 🟪 맡은 역할장바구니소셜 로그인주문 상태 알림 🟪 Github ..
스케줄러로 장바구니 삭제하기(Redis를 사용하지 않는) event Schedule 방법에는 스프링에 제공하는 것과 MySQL이 제공하는 것 2가지가 있다고 한다.나는 스프링에서 제공하는 방식을 사용하였다. @Component@RequiredArgsConstructorpublic class CartCleanupScheduler { private final CartRepository cartRepository; @Scheduled(fixedRate = 1000 * 60 * 30) //30분마다 @Transactional public void deleteExpiredCarts() { //만료시간이 현재보다 이전인 경우를 조회해온다. List expiredCar..
장바구니 구현에서 핵심 기능인 부분은 메뉴 추가였다.메뉴 추가 시 고려해야할 부분이 많았다.장바구니 메뉴 추가 알고리즘유저의 장바구니가 이미 존재하는가?존재하지 않는다면 새로운 장바구니를 생성한다. // userId에 해당하는 장바구니 존재 여부를 확인하고 없다면 장바구니를 생성한다. Cart cart = cartRepository.findByUserId(userId) .orElseGet(() -> { Cart newCart = Cart.createCart(user, store); return cartRepository.save(newCart); //새로 생성해 데이터 베이스에 저장한 ..

❔ 장바구니를 어떻게 구현할 것인가에 대한 고민메뉴와 주문은 N:M 관계이다.장바구니 기능을 추가하기 위해서는 중간 테이블을 두어 1:N, 1:M 관계로 만들 필요가 있었다.✅ 장바구니 중간 테이블 구현 방법 선정DB - 제일 무난하지만 DB 접근 횟수가 증가한다.세션 - 트래픽이 많아질 경우 서버의 부담이 커진다.Redis - 팀원 모두가 개발 환경을 맞춰야 한다.Docker - Redis의 대체제이지만 여전히 별도의 학습이 필요하다.위와 같은 이유로 후보들 중 1번 DB를 사용하기로 선정하였다.✅ 장바구니 조건한 가게의 메뉴만 담을 수 있으며, 가게가 변경될 시 장바구니는 초기화된다.외래키 User를 Unique로 설정해 한 가게의 메뉴만 담을 수 있도록 하고자 하였다.Cart 삭제 시, CartIt..