HTML, Git 알고있던 내용들과 Fetch 등 새로배우는 내용들을 다시 배우며 익혔습니다. 깃과 깃허브 : git은 코드 변경점을 기록하는 도구로, 버전 관리 도구라고도 한다. 에러 발생 시. 과거의 코드 기록으로 쉽게 되돌아가기 기능이 있고, git을 이용하여 g
첫 프로젝트 주제는? 우리 팀, 우리만의 이야기를 담을 수 있는 "팀 소개 웹페이지"를 만드는 것이다.웹페이지에 담을 내용1) 팀에 대한 소개 2) 팀에 대한 소개에 들어갈 내용 : 우리 팀의 약속, 목표 등3) 팀원에 관한 소개 (팀원 자신의 페이지를 직접 만들어
내일배움캠프 3일차!이제는 9to9이 조금은 익숙해지는 것 같다!스스로 공부하고 코딩하는 시간이 즐거워지는?현재 팀프로젝트를 준비하기위해서 개인 웹페이지의 기본틀과 css를 하고있다.이렇게 웹페이지를 만들면서 모르는 것은 홈페이지에 찾아보기도하고, 팀원들과 소통해나아가
어제 목요일 (2월 20일) 자격증 시험으로 인해서 공결이였지만 중간중간 합류하여 팀 프로젝트를 협업하였습니다. 목요일에는 팀 웹페이지와 개인 웹페이지를 병합하면서 json을 사용하여 데이터를 만들고 연결하는 등 여러가지를 하였습니다.저는 HTML을 잘 만들어보지 않았
1) 한 일프로젝트 명: 팀 소개 웹페이지 만들기필수 작업: HTML 작업 및 CSS 작업 등추가 작업: JSON 및 자바스크립드 제작2) 느낀점석창훈 - 캠프에 오고 개발자가 되기위한 첫 걸음이자 첫 작은 프로젝트 였는데 지식이 부족하여 많이 걱정이 되었지만 일단 시
팀원 소개 웹페이지
오늘부터 본격적으로 java 문법을 공부하였습니다.기초적인 부분부터 문법적인 부분을 세세히 공부하였습니다.아는 부분도 있고 모르는 부분도 있기에 다 꼼꼼히 보았습니다.java의 특징플랫폼 독립성 - 운영체제가 달라져도 바이트 코드로 인해서 모두 실행이 가능해지는 독립성
필수 과제 가이드를 보고 구현해 나아가는 과제인데요,오늘은 일단 Level 1부터 구현해보자! 라는 저의 목표를 가졌습니다.Level 1은 App이라는 클래스 안에 모든 기능을 구현했습니다.Scanner 객체를 활용하여 사용자의 입력을 받으면 입력한 값을 활용하여계산기
Level2에서는 클래스활용을 이용하여 계산기를 만드는 과정을 하였습니다. 전체적인 흐름 :양의 정수 (0을 포함)를 두 개를 입력받는다.사칙연산 기호를 매개변수로 입력받아 Calculator클래스에서 기능을 수행한다결과 값을 Calculator에서 반환받아 출력한다결
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.제한사항N의 범위 : 100,000,000 이하의 자연수입출력 예 문제의 예시와
오늘은 calculator과제 마감하는 날이지만 저는 엊그제 제출하였어서오늘 오전은 프로그래머스 스쿨에서 코딩테스트 여러 개 구현하고, 알고리즘 정렬 3개 정리하였습니다.정리한 내용알고리즘 정렬 3개https://velog.io/@todok0317/알고리즘-공
3월 7일 두 번째 과제KioskProject를 구현하기 입니다.키오스크를 구현하면서 키오스크 기능을 파악하여 클래스들을 설계합니다.여러 키오스크의 클래스를 만들면서 주요 기능을 메소드로 분리합니다.콘솔 기반으로 구현하며 데이터 흐름을 설계합니다.Main : 시작 지점
직전 포스터에 이어서 Kiosk과제에 대한 TIL을 작성하려고 합니다.Level 1~3은 https://velog.io/@todok0317/내일배움캠프-14일차-Kiosk과제-필수구현-Level-13 여기에서 보시면 됩니다. Menu 클래스 생성하기 설명 :
이 전에 만든 Menu클래스에서 Map을 활용하여 메뉴<햄버거<치즈버거(치즈버거, 8.9,치즈가 많이 들어간 버거), 햄버거(햄버거, 4.9, 기본햄버거)>, 드링크<콜라, 사이다>...> 리스트 안에 리스트를 만들어서 코드를 구현하였습니다.하지만 과제
HTTP (HyperText Transfer Protocol) http란 클라이언트 to 서버(요청)뿐만 아니라, 서버 to 클라이언트(응답)에도 사용되며 서버 to 서버 간의 데이터 통신에도 사용된다. HTTP 동작 순서 클라이언트에서 서버로 요청(Requset)
자바에서 Annotation은 코드 사이에 주석처럼 쓰이며, 특별한 의미, 기능을 수행하도록 하는 기술이다. 추가적인 정보를 제공해주는 메타데이터Slf4j는 Logback 라이브러리를 이용해 로그를 남기기 위한 공통 인터페이스이다.application은 Slf4t를 이
\-> 우리가 흔히 말하는 UI를 만들며 SSR에 사용된다.템플릿 엔진이 나온 이유는 자바코드로 HTML을 만들어내는 것이 아닌 HTML 문서에 동적으로 변경해야하는 부분만 자바 코드를 넣기때문에.대표적인 템플릿 엔진 \- Thymeleaf : 스프링과 통합이 잘 되
Spring MVC 구조DispatcherServlet : Spring의 프론트 컨트롤러View : 인터페이스로 구성되어 있다, 확장성을 가지고 있다.실행순서Client로 부터 HTTP 요청(Request)을 받는다.Handler 조회Handler Mapping을 통해
보일러 플레이트 코드를 줄여주는 라이브러리로 자동으로 보일러 플레이트 코드를 생성하여 코드의 가독성과 유지보수성을 높여준다Lombok은 어노테이션 기반으로 동작하며 주로 컴파일 시점에 소스 코드를 변환하여 필요한 메서드를 자동으로 생성한다.보일러 플레이트 코드(Boil
Client에서 Server로 Data를 전달하는 방법은 Query Parameter, HTTP Form Data, HTTP Request Body 크게 세가지가 있다.URL의 쿼리 파라미터를 사용하여 데이터 전달하는 방법http:/localhost:8080/
웹을 만들때는 다양한 요청(Request)과 응답(Response)이 있다. 이 요청과 응답에는 규칙이 있는데 이것을 일일이 처리하는게 아닌 비즈니스 로직에 집중할 수 있도록 도와주는 것이 서블릿이다.서블릿은 이러한 웹 요청과 응답의 흐름을 간단한 메소드 호출만으로 체
엔티티는 주로 데이터베이스의 테이블을 나타내는 클래스를 의미.데이터베이스(DB)에 쓰일 필드와 여러 엔티티간 연관관계를 정의한다.@Entity: 클래스 위에 선언하여 이 클래스가 엔티티임을 알려준다. 이렇게 되면 JPA에서 정의된 필드들을 바탕으로 데이터베이스에 테이블
Layered Architecture 애플리케이션을 세 가지 주요 계층으로 나누어 구조화하는 방법으로 각 계층은 특정한 책임을 갖고 있으며, 계층 간에는 명확한 역할 분담이 이루어져 코드의 재사용성, 유지보수성, 확장성을 높이는데 도움을 준다. - Layered Ar
데이터베이스(Database, DB)란? 데이터베이스를 한 마디로 정의하면 '데이터의 집합'이라고 할 수 있다. 여러 사람이 공유하고 사용할 목적으로 한 곳에서 관리되는 데이터의 조직화된 집합으로, 데이터를 소프트웨어에서 효율적으로 관리하기 위한 저장소이다. 데이터베
이번에는 Spring boots를 활용하여 일정 관리 앱 만들어보았습니다. Controller, Service, Repository로 분류를 하여 역할을 나누었습니다.Controller일정의 생성(Create), 조회(Read), 수정(Update), 삭제(Delete
하나의 클래스는 하나의 책임만 가져야 한다.클래스는 한 가지 기능에 집중해야 하며, 그 외의 기능을 담당하지 않아야한다.예시User 클래스는 사용자 정보 관리, 로그인 및 데이터베이스 저장 책임을 동시에 가지고 있다.단일 책임 원칙 적용실제로는 상황에 따라 책임의 크기
스프링 빈을 등록한다는 의미는스프링 부트에서는 객체를 생성하는 것이 아닌 스프링컨테이너에 등록하여 관리한다. 이렇게 등록 된 객체(스프링 빈)는 애플리케이션 실행 중에 필요할 때 자동으로 주입(DI)되어 사용할 수 있다.@Component, @Service, @Repo
Bean Validation은 Java에서 객체(Bean)의 데이터가 올바른 값인지 검증하는 표준 방식(JSR-303, JSR-380)입니다.스프링에서는 이를 활용하여 입력 데이터(예: DTO) 검증을 간편하게 수행할 수 있도록 지원합니다.사용자가 API에 잘못된 데이
spring에서는 @ControllerAdvice와 @ExceptionHandler를 활용하면 애플리케이션 전반에서 발생하는 예외를 한 곳에서 처리할 수 있다. 이것을 예외처리 핸들러라고 한다.모든 컨트롤러에서 발생하는 예외를 전역적으로 처리할 수 있도록 도와주는
BCryptPasswordEncoder는 Spring Security 프레임워크에서 제공하는 클래스로 비밀번호를 암호화(해시)하는 데 사용한다.BCrypt는 단순히 입력을 1회 해시시키는 것이 아니라 솔트(salt)를 부여하여 여러 번 해싱하므로 더 안전하게 암호를 관
JPA에서 외래 키(Foreign Key)를 지정할 때 사용하는 어노테이션Entity 연관관계 또는 Element Collection을 연결하기 위한 Column을 지정함JoinColumn이 사용되는 용도는 주로, Entity의 연관관계에서 외래 키를 매핑하기 위해 사
진행 날짜 : 2025.03.31 ~ 04.02이 프로젝트는 사용자별 일정 관리를 위한 RESTful API입니다. 사용자는 회원가입 후 로그인하여 자신의 일정을 생성하고, 수정하고, 삭제할 수 있으며, 댓글을 달 수 있습니다.회원 관리회원가입, 로그인, 로그아웃 기능
배경원인 협업 시 github를 단순히 원격 저장소의 역할로만 활용하는 게 아닌 코드리뷰를 할 수 있는 소통의 창구로 활용할 수 있다.배경원인해결 협업을 할 때는 팀원과 상시로 소통을 하는 부분이 매우 중요하다고 깨달았다.배경전개 동일한 검사를 서로 다른 방법으로
이 프로젝트는 소셜 네트워크의 뉴스피드 기능을 중심으로 구현된 웹 서비스입니다. 사용자는 게시물을 작성하고, 친구를 추가하고, 댓글이나 좋아요로 상호작용할 수 있습니다. 로그인 필터 기반의 인증 처리, 친구 기능의 양방향 관계 설정 등 실제 SNS의 핵심 기능을 직접
Spring MVC 프로젝트를 하다 보면 로그인한 사용자 정보를 컨트롤러에서 자주 받아와야 할 때가 많습니다.HttpSession에서 직접 값을 꺼내 쓰는 방식도 있지만, 매번 반복해서 쓰기보다는 깔끔하게 커스텀 어노테이션을 만들어 자동으로 처리되게 할 수 있습니다.이
깃 허브 링크 : https://github.com/Kimminu7/SNS_Project/tree/main프로젝트 정리본 : https://velog.io/@todok0317/Spring-Boot-SNS-프로젝트시연 영상 링크 : https:
HTTP 메세지 바디에서 데이터를 직접 읽어와야 하거나, 전달해야 할 때 사용되는 HTTP 메세지컨버터의 동작 원리를 나타낸다.HTTP 메세지 컨버터는 HTTP API처럼 HTTP 메세지 바디에서 데이터를 직접 읽어와야 하거나, 전달해야 할 때 동작한다. 뷰 템플릿으로
RequestMappingHandlerAdapter는 ArgumentResolver를 호출하여 Controller가 필요한 다양한 파라미터의 값을 생성한다.HttpServletRequest, Model, HttpEntity, @ModelAttribute, @Reques
JPA를 사용할 때, 연관된 엔티티를 지연로딩(LAZY) 으로 설정하면 발생하는 대표적인 성능 문제이다.예를 들어)Todo엔티티가 User엔티티와 @ManyToOne(fetch = FetchType.LAZY)로 연관되어 있을 때이 코드를 실행하면 다음과 같은 쿼리가 발
Spring은 공통적으로 여러 작업을 처리함으로써 중복 된 코드를 제거할 수 있도록 많은 기능들을 지원하고 있다. 이번에는 그 중에서 필터 vs 인터셉터의 차이, AOP 차이를 확인한다.필터는 요청과 응답을 거른 뒤 정제하는 역할을 한다.필터는 Dispatcher Se
원래의 메서드가 실행되기 전에 어떤 작업을 하고, 메서드가 실행된 후 결과를 받아 후처리를 할 수 있다.메서드를 감싸서 실행을 제어할 수 있기 때문에 가장 강력한 어드바이스(advice)라고 부른다.joinPoint.proceed() 호출 전: 메서드 실행 전에 할 일
서버가 사용자 정보를 서버의 메모리 또는 저장소에 저장하고, 클라이언트에게는 Session ID를 발급하여 쿠키에 담아 전달함.클라이언트는 매 요청마다 Session ID를 보내고, 서버는 이걸 조회해서 인증 여부를 판단함.서버가 로그인 시 사용자 정보를 기반으로 JW
Lv4 과제는 나에게 있어 단순한 기능 구현 과제가 아니라 문제도 이해하기 어려웠다.현재 과제의 모든 코드를 다 이해하고나서 새로운 기능을 추가하는 것인데 기존 코드가 어떻게 돌아가는지부터 확인하는 것이 너무 어려웠다.어떤 흐름으로 인증이 되는가?어떤 객체가 어디서 생
댓글 작성 기능 구현 중, 특정 Todo에 댓글을 달기 위해 Todo ID로 조회하면서 연관된 User 정보도 함께 가져오고자 했습니다.이를 위해 findByIdWithUser(Long todoId) 메서드에 @EntityGraph를 사용했지만, 다음과 같은 오류가 발
AOP는 관점 지향 프로그래밍이라고 불린다. 관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 과점을 기준으로 각각 모듈화하겠다는 것이다.여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다.AOP에서 각 관점
Order에서 createOrder를 생성하면서 서비스 로직에서request에는 원하는 메뉴Id와 수량을 적는 OrderMenu를 json형식으로 받아온다.그 이후에 거기서 Order 객체를 생성하여 Repository를 통해서 저장하니 로직은 돌아갔는데여기서 생기는
이 프로젝트는 배달 애플리케이션 개발을 목표로 진행되었습니다. 사용자는 회원가입, 로그인, 회원탈퇴 기능을 이용할 수 있으며, 회원가입 시 USER와 OWNER로 역할을 구분할 수 있습니다.OWNER는 최대 3개의 가게를 등록할 수 있으며, 가게 카테고리 설정과 메뉴
깃 허브 링크 : https://github.com/0122-0/dawasyu-outsourcingProject프로젝트 정리본 : https://velog.io/@todok0317/Spring-Boot-Dawasyu-프로젝트시연 영상 링크 : http
JDBC로 처리하는 코드의 설정(Connection) 부분을 줄이고 실제 SQL문에 연결함으로서 빠른 개발이 가능하게 한다. (SQL Mapper 특징)MyBatis 코드는 map 인터페이스(또는 클래스)와 SQL 쿼리와 ResultSet 매핑을 위한 xml 및 ann
Amazon Web Service서버, 네트워크 등 인프라 전체를 빌려주는 서비스클라우드 컴퓨팅 서비스 플랫폼인터넷을 통해 서버, 저장소, 데이터베이스, 네트워크, 인공지능 등 IT 인프라 자원을 빌려 쓸 수 있는 서비스AWS의 주요서비스는 컴퓨팅(EC2 등), 데이터
: QueryDSL은 하이버네이트 쿼리 언어 (HQL: Hibernate Query Language)의 쿼리를 타입에 안전하게 생성 및 관리해주는 프레임워크이다.QueryDSL은 정적 타입을 이용하여 SQL과 같은 쿼리를 생성할 수 있게해준다.자바 백엔드 기술은 Spr
: Spring Security는 Spring 기반 애플리케이션의 인증(Authentication)과 권한 부여(Authorization)를 담당하는 강력한 보안 프레임워크이다. 웹 애플리케이션, RESTful API 및 기타 애플리케이션 유형에 대한 포괄적인 보안 솔
기존 TodoService\`\`\`@Query("SELECT t FROM Todo t JOIN FETCH t.user WHERE t.id = :id")Optional findByIdWithUser(@Param("id") Long id);Todo todo = jpaQu
캐싱은 애플리케이션 성능을 향상시키는 중요한 기술로, 자주 사용하는 데이터를 메모리에 저장해 반복적인 데이터베이스 접근을 줄여주는 기법이다. 특히 검색 기능처럼 비용이 많이 들고 자주 호출되는 작업에 효과적이다.캐싱은 자주 접근하는 데이터를 빠르게 조회할 수 있도록 별
Redis(Remote Dictionary Server)는 인메모리 데이터 구조 저장소로, 다양한 데이터 구조를 지원하는 NoSQL 데이터베이스이다.인메모리 저장 : 모든 데이터를 메모리에 저장하여 매우 빠른 읽기/쓰기 속도를 제공합니다.영속성 지원 : 디스크에 데이터
동시성 제어는 여러 사용자나 프로세스가 동시에 같은 데이터에 접근하고 수정할 때 발생할 수 있는 문제를 관리하는 기술이다.여러 사용자가 동시에 같은 데이터를 수정할 때 발생하는 문제이다.예를 들어) 영화관에서 10명이 동시에 같은 좌석을 예매하려고 시도, 쇼핑몰에서 재
CI는 Countinuous Integration 즉, 지속적인 통합이라는 의미이다.지속적인 통합이란, 어플리케이션의 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트 되어 공유 레포지토리에 통합하는 것을 의미한다.: 지속적으로 서비스해야하는 어플리케이션이나 현재 개
Jenkins는 CI/CD를 위한 오프 소스 도구로, 소프트웨어 개발 생명주기를 자동화한다.Jenkins를 사용하면 코드 변경 사항이 발생할 때마다 자동으로 빌드, 테스트, 배포 과정을 수행할 수 있기 때문에 개발자는 코드 변경에 따른 빌드 및 테스트 과정을 수동으로
GitHub Actions는 GitHub에서 제공하는 CI/CD(Continuous Integration/Continuous Deployment) 플랫폼입니다. 코드 저장소에서 직접 소프트웨어 개발 워크플로우를 자동화할 수 있게 해주는 서비스로, 2019년 출시 이후
이번 프로젝트에서는 Spring Boot 기반 식당 예약 플랫폼을 개발하며 Jenkins를 이용한 CI/CD 자동화에 도전했습니다. 현재는 CI(지속적 통합)까지 성공한 상태이며, CD(지속적 배포)는 구현 중입니다. 이 포스트에서는 현재까지의 구현 내용과 CD 단계에
이번 프로젝트에서는 검색 기능과 인기 검색어 API를 개발하며, 대량의 데이터에 대한 빠른 검색 응답이 중요한 과제로 떠올랐습니다.초기에는 단순하게 LIKE 쿼리를 사용한 검색 기능을 제공했지만, 데이터가 많아질수록 검색 성능 저하가 심각해졌고, 이를 해결하기 위해 캐
프로젝트 개요(2. Redis 캐싱을 통한 검색 성능 최적화(3. Jenkins CI/CD 구축 도전기(4. DB 인덱싱 성능 최적화(5. Redis 분산락을 통한 동시성 제어(6. 종합 결과 및 학습(FourChak은 Spring Boot 기반의 식당 예약 플랫폼으로
https://github.com/YejinY00n/FourChak.git이메일 형식 아이디 + 영문 대소문자/숫자 조합 8자 이상 비밀번호로 회원가입JWT를 활용한 인증 방식 구현가입 시 USER(일반 사용자) / OWNER(가게 소유자) 역할 선택회원 정보
이 사진은 구글에서 있는 것을 가져온 것.현재 배워야하는 것들과 배워야 할 것들을 잘 분리해서 공부하기.Node.JsMongoDB터미널 사용법
Docker는 애플리케이션을 컨테이너라는 가상 환경에 담아서 실행하는 기술입니다.일반적인 개발: 집에서 요리할 때마다 재료 사고, 도구 준비하고, 청소하기Docker 사용: 미리 모든 재료와 도구가 들어있는 도시락 상자 → 어디서든 바로 요리 가능!"내 컴퓨터에서 작동
Spring Boot로 REST API를 개발하면 ResponseDto부분에서 필요한 부분을 리스트 형식으로 가져오는지어떻게 가져올지 고민을 하는데 이번에는 중첩 DTO를 사용해보았다.명확한 의미적 그룹핑뛰어난 재사용성타입 안전성 보장4.쉬운 확장성JSON 크기 증가프
FitPass의 핵심 기능 중 하나인 피트니스 목표 관리 시스템을 개발했습니다. 사용자가 체중 관련 목표를 설정하고 일일 기록을 통해 진행상황을 추적할 수 있도록 하였습니다.목표 관리 : 생성/조회/수정/취소/삭제체중 기록 : 일별 체중 추적일일 기록 : 운동 인증샷
FitPass의 스케줄러는 자동화 된 비즈니스 로직 처리를 담당하는 핵심 기능이다. 주로 만료된 목표들의 상태를 자동으로 업데이트하여 시스템의 데이터 일관성을 유지함.패키지 구조의존성 관계메인 스케줄러 클래스Cron 표현식 : 0초 0분 0시(자정) 일(매일) 월(매월
사용자 편의성: 별도 회원가입 없이 Google, Kakao 등으로 간편 로그인보안성: 비밀번호를 직접 관리하지 않아도 됨신뢰성: 대형 플랫폼의 검증된 인증 시스템 활용Stateless: 서버에 세션 저장 불필요확장성: 마이크로서비스 환경에서 토큰 공유 가능성능: 매번
예약 시스템을 구현 중 예약을 하면 트레이너가 승인을 해주는 부분을 잘못해서 시간이 지나면 알아서 승인해주는 방식으로 구현. 트레이너가 수락하는 것으로 api 수정.또, 예약 시간이 지나도 CONFIRMED 상태로 계속 남아있음. COMPLETED 상태로 자동 변경되는
FitPass 예약 시스템에서 Redis 분산 락과 트랜잭션의 잘못된 생명주기 관리로 인한 동시성 제어 실패한명이 예약을 성공하면 동시성 제어로 처리가 되어야하는데 트랜잭션 끝나는 시간과 락 해제 시간 사이에 또다른 예약이 들어올 수 있음. 다행히 DB 유니크 제약조건
예약 완료, 이용권 만료, 목표 기간 종료 등 관리자가 직접 처리해야만 하는 수동 상태 관리에 한계점 도달상태 관리가 안되니 이용권이 만료되어도 사용할 수 있고, 예약이 완료되어도 아직 예약중이라는 상태로 유지, 사용자에게 혼란스러움을 야기시킴데이터 일관성과 운영 비용
비즈니스 크리티컬: 체육관 PT 예약은 1:1 매칭으로 중복 예약이 절대 발생하면 안 됨레이스 컨디션 발생: 동일한 트레이너의 같은 시간대에 여러 사용자가 동시 예약 시도데이터 무결성 위험: 중복 예약 발생 시 고객 불만 및 운영상 문제 야기확장성 고려: 서비스 성장
FitPass는 피트니스 센터 예약 플랫폼으로, 사용자가 포인트를 통해 PT 세션을 예약할 수 있는 서비스이다. 기존에는 관리자가 수동으로 포인트를 충전해주는 방식이었지만, 사용자 경험 개선과 운영 효율성을 위해 자동화된 결제 시스템 도입을 결정했다.개발자 친화적 AP
헬스장 PT 예약 시스템을 개발하면서 동시성제어 부분에 성능테스트를 확실히 해야겠다고 생각이 들었다. "여러 회원이 동시에 같은 시간대에 한 트레이너에게 예약하면 어떻게 처리가 되지?" 라는 시나리오로 성능테스트를 진행했다. K6를 활용하여 그라파나와 연결해 시각화하는
FitPass 프로젝트의 예약 시스템에서 동시성 문제와 성능 이슈를 해결하기 위해 분산 락(Redisson)과 K6 성능 테스트를 도입하여 안정적이고 확장 가능한 예약 시스템을 구축했습니다.중복 예약 발생: 여러 사용자가 동시에 같은 시간대 예약 시 데이터 무결성 깨짐
현재 코드에서 둘 다 사용하는 이유:여러 서버(인스턴스)에서 동시에 같은 시간대 예약을 시도할 때 사전에 차단락을 획득하지 못한 요청은 즉시 실패 처리 가능불필요한 DB 트랜잭션을 방지모든 요청이 DB까지 진행 → 트랜잭션 시작 → 제약조건 위반 시 롤백DB 부하 증가
Fitpass는 체육관 PT 예약 시스템으로, 다수의 사용자가 동시에 같은 트레이너의 같은 시간대를 예약하려고 할 때 발생할 수 있는 동시성 문제를 해결해야 했습니다.시나리오 : 인기 트레이너의 오후 2시 예약사용자 1 : 14:00 예약 요청 -> 성공사용자 2 :