
트러블 슈팅
https://rudtjs2.tistory.com/50
https://velog.io/@soonch6/최적화Indexing
https://velog.io/@todok0317/Redis-캐시-도입기-검색-속도-개선을-위한-성능-최적화-트러블슈팅
https://velog.io/@todok0317/Jenkins-기반-CICD-구축-시도-및-트러블슈팅
https://velog.io/@yoon17710/MySQL-기반-분산락-구현-트러블슈팅-요약
최종본 : https://velog.io/@todok0317/FourChak-프로젝트-통합-트러블슈팅2
시연 영상 링크

FourChak은 4조가 만든 좌석에 착하고 앉는 예약 프로그램으로 FourChak입니다.
FourChak은 사용자가 원하는 식당을 검색하고 실시간으로 예약 할 수 있도록 도와주는 식당 예약 플랫폼입니다. 실시간 예약 시스템을 통해 빠르고 편리한 외식 예약을 할 수 있게 구현하였습니다.
Spring Security와 JWT(Json Web Token)를 활용한 인증 시스템 구현
Stateless한 구조로 세션 서버 부담 없이 사용자 인증 처리
사용자 로그인 시 JWT 발급, 이후 모든 요청에 헤더를 통해 인증 처리
// 검색 결과 캐싱 (5분 TTL)
@Cacheable(value = "storeSearch", key = "#keyword + '_' + #pageable.pageNumber + '_' + #pageable.pageSize")
public Page<StoreResponseDto> searchStoreWithCache(String keyword, Pageable pageable)
// 인기 검색어 캐싱 (30분 TTL)
@Cacheable(value = "popularKeywords")
public List<PopularKeywordResponseDto> getPopularKeywords()











CREATE TABLE `store` (
`ID` BIGINT(PK, Auto Increment) NOT NULL DEFAULT PK,
`storename` VARCHAR(10) NULL,
`number` VARCHAR(20) NULL,
`seatCount` INT NULL,
`deletedat` DATETIME NULL,
`userId` BIGINT(PK, Auto Increment) NOT NULL DEFAULT PK
);
CREATE TABLE `baseentity` (
`createdat` DATETIME NULL,
`modifiedat` DATETIME NULL
);
CREATE TABLE `user` (
`ID` BIGINT(PK, Auto Increment) NOT NULL DEFAULT PK,
`email` VARCHAR(30) NULL,
`username` VARCHAR(20) NULL,
`phone` VARCHAR(20) NULL,
`password` VARCHAR(20) NULL,
`role` ENUM NULL
);
CREATE TABLE `Untitled2` (
`PK` BIGINT(PK, Auto Increment) NOT NULL DEFAULT PK,
`FK` BIGINT(PK, Auto Increment) NOT NULL DEFAULT PK,
`FK,` BIGINT(PK, Auto Increment) NOT NULL DEFAULT PK,
`field 1` int NULL,
`field 2` DateTime NULL,
`field 3` Int NULL,
`field 4` ENUM NULL
);
CREATE TABLE `coupon` (
`id` BIGINT NOT NULL,
`ID` BIGINT(PK, Auto Increment) NOT NULL DEFAULT PK,
`discount` INTEGER NULL,
`count` INTEGER NULL
);
CREATE TABLE `searchkeyword` (
`ID` BIGINT(PK, Auto Increment) NOT NULL DEFAULT PK,
`keyword` VARCHAR(20) NULL,
`count` INT NULL
);
CREATE TABLE `Untitled3` (
`Key` BIGINT(PK, Auto Increment) NOT NULL DEFAULT PK,
`PeopleNumber` Int NULL,
`DateTime` DateTime NULL,
`userId` BIGINT(PK, Auto Increment) NOT NULL DEFAULT PK,
`storeId` BIGINT(PK, Auto Increment) NOT NULL DEFAULT PK,
`Id2` BIGINT NOT NULL
);
CREATE TABLE `UserCoupon` (
`Id` BIGINT NOT NULL,
`couponId` BIGINT NOT NULL,
`storeId` BIGINT(PK, Auto Increment) NOT NULL DEFAULT PK,
`userId` BIGINT(PK, Auto Increment) NOT NULL DEFAULT PK,
`isUsed` BOOLEAN NULL
);
ALTER TABLE `store` ADD CONSTRAINT `PK_STORE` PRIMARY KEY (
`ID`
);
ALTER TABLE `user` ADD CONSTRAINT `PK_USER` PRIMARY KEY (
`ID`
);
ALTER TABLE `Untitled2` ADD CONSTRAINT `PK_UNTITLED2` PRIMARY KEY (
`PK`,
`FK`,
`FK,`
);
ALTER TABLE `coupon` ADD CONSTRAINT `PK_COUPON` PRIMARY KEY (
`id`,
`ID`
);
ALTER TABLE `searchkeyword` ADD CONSTRAINT `PK_SEARCHKEYWORD` PRIMARY KEY (
`ID`
);
ALTER TABLE `Untitled3` ADD CONSTRAINT `PK_UNTITLED3` PRIMARY KEY (
`Key`
);
ALTER TABLE `UserCoupon` ADD CONSTRAINT `PK_USERCOUPON` PRIMARY KEY (
`Id`,
`couponId`,
`storeId`,
`userId`
);
ALTER TABLE `Untitled2` ADD CONSTRAINT `FK_user_TO_Untitled2_1` FOREIGN KEY (
`FK`
)
REFERENCES `user` (
`ID`
);
ALTER TABLE `Untitled2` ADD CONSTRAINT `FK_store_TO_Untitled2_1` FOREIGN KEY (
`FK,`
)
REFERENCES `store` (
`ID`
);
ALTER TABLE `coupon` ADD CONSTRAINT `FK_store_TO_coupon_1` FOREIGN KEY (
`ID`
)
REFERENCES `store` (
`ID`
);
ALTER TABLE `UserCoupon` ADD CONSTRAINT `FK_coupon_TO_UserCoupon_1` FOREIGN KEY (
`couponId`
)
REFERENCES `coupon` (
`id`
);
ALTER TABLE `UserCoupon` ADD CONSTRAINT `FK_coupon_TO_UserCoupon_2` FOREIGN KEY (
`storeId`
)
REFERENCES `coupon` (
`ID`
);
ALTER TABLE `UserCoupon` ADD CONSTRAINT `FK_user_TO_UserCoupon_1` FOREIGN KEY (
`userId`
)
REFERENCES `user` (
`ID`
);

@Cacheable(value = "storeSearch", key = "#keyword + '_' + #pageable.pageNumber + '_' + #pageable.pageSize")
@Cacheable(value = "popularKeywords")


v1 검색 (캐시 미사용)
응답 시간: 107ms
데이터 크기: 2.14 KB
결과: 가게 ID 46, 가게명 "고향떡볶이집 7호점"
v2 검색 (캐시 사용)
응답 시간: 75ms
데이터 크기: 2.15 KB
결과: 가게 ID 16, 가게명 "지인떡볶이집 13호점"
캐시를 사용한 v2가 약 30% 더 빠른 성능을 보여주고 있습니다: