본문 바로가기

전체 글95

[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.
[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.