본문 바로가기

전체 글92

[studyhub] 시간대 예약 기능 구현 Reservation 엔티티@Entity@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)@Table(name = "reservation")public class Reservation { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long memberId; private Long cafeId; private Long seatId; private LocalDateTime startTime; private LocalDateTime endTime; @Enumerated(EnumType.STRING) pri.. 2026. 8. 27.
[studyhub] 카페 검색 API와 N+1 해결 카페 검색 조건 바인딩GET 쿼리 파라미터를 @ModelAttribute로 바로 바인딩한 이유@Getter@Builderpublic class CafeSearchRequest { private String region; private String keyword; private Boolean openNow; // 영업 여부}@GetMapping public ResponseEntity> search(@ModelAttribute CafeSearchRequest request) { return ResponseEntity.ok(cafeService.search(request)); }Spring FrameWork 6.1(Spring Boot 3.2)부터 클래스에 생성자가 정확.. 2026. 8. 20.
[studyhub] 카페 등록 구현 Cafe 엔티티@Entity@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)@Table(name = "cafe")public class Cafe extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(length = 50, nullable = false) private String name; @Column(length = 100, nullable = false) private String address; @Column(length = 20, nullable = false) .. 2026. 8. 18.
[studyhub] Member 설계와 로그인, 토큰 재발급 구현 * 해당 게시글에서는 회원가입 로직은 다루지 않는다.member 엔티티member는 회원 도메인의 핵심 애그리거트이다. 인증(로그인)과 회원 정보를 하나의 엔티티가 함께 갖고, Refresh Token의 현재 상태(해시, 만료시각)까지 이 엔티티가 직접 관리한다.@Entity@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)@Table(name = "member")public class Member extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(length = 20, nullable = fa.. 2026. 8. 13.
[studyhub] Custom Error Code 구현 구현의 이유예외 발생 시 HTTP 상태 코드를 몇으로 응답되어야 하는지, 그 정보를 어디에 둘 것인가클라이언트가 메시지 문자열을 파싱하지 않고도 '이게 정확히 어떤 에러인지' 구분하려면 무엇이 필요한가예외 종류가 늘어날 때 이걸 어디에 어떻게 정리해둘 것인가에러 코드를 정의하는 방법을 찾아보다가, 회사에서 진행했던 두 가지 서로 다른 방식이 떠올랐다.1.추상 클래스를 상속public class AuthExceptionCode extends ExceptionCode { public static final AuthExceptionCode UNAUTHORIZED_ACCOUNT = new AuthExceptionCode( HttpStatus.UNAUTHORIZED, "UNAUTHORIZED_A.. 2026. 7. 22.
[studyhub] JWT 기반 인증/인가 구현 JWT를 선택한 이유Stateless 구조세션 방식을 사용할 경우 세션을 어딘가에 저장하고 관리해야 하며, 서버를 여러 대로 늘리는 경우 세션 공유 문제를 겪음추후 서버를 늘릴 가능성을 생각하여 세션 저장소를 신경 쓸 필요 없이 토큰 검증 로직만 각 서버 인스턴스에 동일하게 있으면 됨학습 목적Spring Security는 기본적으로 세션 기반 인증을 전제로 설계되었기에 JWT를 사용하는 경우 기본 흐름(폼 로그인, 세션 생성 등)을 걷어내고, 그 자리에 직접 만든 필터를 끼워 넣어야 함이 과정을 통해 Spring Security의 필터 체인이 어떻게 동작하는지, 인증/인가가 프레임워크 내부에서 어떻게 분리되고 그 위에 원하는 방식을 얹어보는 경험을 얻고자 함 JwtProvider해당 클래스는 다음 세 가.. 2026. 7. 15.