전체 글99 [studyhub] 카페 검색 결과 캐싱 상세 조회 캐싱과 다른 점 상세 조회검색캐시 키cafe::3 (카페 하나에 키 하나)지역·키워드 조합마다 키 하나카페가 바뀌면그 카페의 키만 삭제어떤 검색 결과에 영향을 줬는지 알 수 없음무효화 방법@CacheEvict버전 번호를 올려 이전 키를 모두 쓰지 않음구현@CacheableStringRedisTemplate 직접 사용TTL1시간10분"강남" 카페의 이름을 바꾸면 "강남", "강남 + 스터디", "스터디" 검색 결과가 모두 바뀐다. 이 키들을 전부 찾아서 지우기 어렵다.키를 요청 값으로 만들어야 하고, 조회와 저장 사이에 필터를 끼워야 해서 @Cacheable로는 처리하기 어려웠다.버전 번호@Component@RequiredArgsConstructor@Slf4jpublic class CafeSea.. 2026. 10. 19. [studyhub] 카페 상세 조회 캐싱 카페 단건 조회 API// CafeController@GetMapping("/{cafeId}")public ResponseEntity searchCafeDetail(@PathVariable Long cafeId) { return ResponseEntity.ok(cafeService.searchDetail(cafeId));}// CafeService@Transactional(readOnly = true)public CafeDetailResponse searchDetail(Long cafeId) { Cafe cafe = validateCafe(cafeId); return CafeDetailResponse.from(cafe);}private void validateOwner(Long membe.. 2026. 10. 5. [studyhub] Refresh Token 저장소를 Redis로 옮기기 기본 구조@Entitypublic class Member extends BaseTimeEntity { @Column(name = "refresh_token_hash") private String refreshTokenHash; @Column(name = "refresh_token_expired_at") private LocalDateTime refreshTokenExpiredAt;}옮기기로 결정한 이유회원 정보와 토큰 정보가 한 테이블에 섞여 있다. 회원 이름이나 상태는 회원 도메인의 정보이고, 토큰 해시는 인증 기능의 정보이다.만료 여부를 세 번 확인하고 있었다. JWT안의 만료 시각, DB의 refreshTokenExpiredAt컬럼, 해시 일치 여부다.로그아웃과 탈퇴에서 토큰을.. 2026. 10. 5. [studyhub] Redis 토큰 블랙리스트 구현 해당 게시글에서는 Redis 컨테이너 구성과 연결 설정은 다루지 않는다.로그아웃, 회원탈퇴 API 구현@Transactionalpublic void withdraw(Long memberId, WithdrawRequest request, String header) { Member member = memberRepository.findById(memberId) .orElseThrow(() -> new BusinessException(MemberErrorCode.MEMBER_NOT_FOUND)); if (member.isWithdrawn()) { throw new BusinessException(MemberErrorCode.ALREADY_WITHDRAWN); } .. 2026. 9. 19. [studyhub] ArchUnit으로 모듈 경계 검증하기 ArchUnittestImplementation 'com.tngtech.archunit:archunit-junit5:1.3.0'아키텍처 규칙을 테스트 코드로 검증하는 라이브러리로, "reservation은 cafe를 참조하면 안 된다"같은 약속을 JUnit 테스트로 작성해두면, 규칙을 어긴 코드가 생겼을 때 테스트가 실패하면서 실패한 위치를 알려준다.일반 테스트와 다른 점단위 테스트나 통합 테스트는 코드가 무엇을 하는지를 검증한다.아키텍처 테스트는 코드가 어떻게 생겼는지를 검증한다. (어떤 패키지가 어떤 패키지를 참조하는지, 클래스 이름이 규칙에 맞는지 등)기능이 정상 동작해도 아키텍처 테스트는 실패할 수 있다.어떻게 검사하는지컴파일된 .class 파일을 읽어 클래스 간 의존 관계를 분석한다. 애플리케이.. 2026. 9. 14. [studyhub] 중복 예약 방지와 좌석 이동 기능 구현 좌석 중복 예약한 회원이 여러 좌석을 예약할 수 있는 문제14:00 ~ 15:00 1번 좌석 예약 -> 성공16:00 ~ 17:00 2번 좌석 예약 -> 성공 (시간이 겹치지 않음)15시에 이용이 끝나기도 전에 16시부터 쓸 다른 좌석을 미리 잡아두는 것이 가능하였다.그래서 진행 중인 예약이 하나라도 있으면 신규 예약 불가로 변경하기로 하였다.락 대상을 Seat에서 Cafe로 바꾼 이유// reservation.portpublic interface CafeLockPort { void lock(Long cafeId);}// cafe.repositorypublic interface CafeRepository extends JpaRepository, CafeRepositoryCustom { @Loc.. 2026. 9. 13. 이전 1 2 3 4 ··· 17 다음