본문 바로가기

전체 글94

[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.
[studyhub] 모듈러 모놀리식에서의 인터페이스 정의 SeatValidator모듈러 모놀리식을 처음 적용하면서 가장 헷갈렸던 것은 인터페이스를 정의하는 위치, 구현하는 위치, 사용하는 위치였다.reservation 모듈 ─ 정의: SeatValidator, MemberValidator (reservation.port) └ 사용: ReservationService — 인터페이스만 호출cafe 모듈 ─ 구현: CafeSeatValidatorImpl (cafe.service)member 모듈 ─ 구현: MemberValidatorImpl (member.service)정의와 사용은 같은 모듈에 있다. 필요한 것을 선언한 쪽이 그것을 쓴다.구현만 다른 모듈에 있다. cafe와 member는 자기 도메인 데이터를 써서 .. 2026. 8. 30.
[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.