Spring 16

연습용 주문 서버 만들기 03 메뉴 목록 조회 API

연습용 주문 서버 만들기 git repository 01 Kotlin/Spring 멀티모듈 프로젝트 구성 02 멤버십 발급 API 작성하기 03 메뉴 목록 조회 API 등록 API는 따로 만들지 않고, 메뉴가 고정되어 있다고 가정하겠습니다. 메뉴 조회는 누구나 가능하다. 프로젝트 실행 시 기본 메뉴 생성 역시 매우 간단한 기능이므로 딱히 부연 설명할 게 없습니다. 메뉴 조회 API Controller @RestController @RequestMapping(V1_API_PREFIX) class MenuViewApiController( private val menuService: MenuService ) { @GetMapping("/menu") fun getAllMenu(): ResponseEntity {..

Spring 2023.01.17

연습용 주문 서버 만들기 02 멤버십 발급 API 작성하기

연습용 주문 서버 만들기 git repository 01 Kotlin/Spring 멀티모듈 프로젝트 구성 02 멤버십 발급 API 작성하기 03 메뉴 목록 조회 API 가장 간단한 아이디 발급 API부터 만들겠습니다. 지난 번 글에도 말했듯이 편의상 회원가입없이 아이디 발급 요청하면 임의의 UUID를 발급하겠습니다. 이 아이디를 membership이라고 하겠습니다. 사용자는 나중에 발급받은 membership를 가지고 포인트를 충전하거나 결제할 수 있습니다. 구현할 요구사항은 아래와 같습니다. 사용자는 누구나 membership 발급 API를 통해 멤버십 번호를 발급받을 수 있다. 따로 무엇을 검증하지 않을 것이므로 매우 간단한 구현이 되겠습니다. 아이디 발급은 실패하는 케이스가 없다고 가정하겠습니다. ..

Spring 2023.01.15

연습용 주문 서버 만들기 01 Kotlin/Spring 멀티모듈 프로젝트 구성

연습용 주문 서버 만들기 git repository 01 Kotlin/Spring 멀티모듈 프로젝트 구성 02 멤버십 발급 API 작성하기 03 메뉴 목록 조회 API Kotlin + Springboot로 주문 서버를 만드는 연습을 해보겠습니다. 최대한 간략하게 구성하기 위해 아래 네 개의 API만 만들겠습니다. 아이디 발급 API 편의상 회원가입 없이 아이디 발급 요청하면 임의의 아이디 발급 메뉴 조회 API 포인트 충전 API 결제 API 이번주 인기 메뉴 API 요구 사항 누구나 고유한 아이디를 발급 받을 수 있습니다. 누구나 메뉴를 조회할 수 있다. (메뉴 등록은 안 만들겠습니다.) 고유한 아이디에 포인트를 충전할 수 있다. 한 아이디를 여러 명이서 쓸 수도 있기 때문에 동시성을 고려해보겠습니다...

Spring 2022.12.22

Spring Scheduler 테스트 하기

Spring Scheduler Test Spring Scheduler 사용법은 매우 간단하다. SpringBoot는 스타터에 스케줄러를 내장하고 있기 때문에 별도의 의존성을 추가하지 않고도 사용할 수 있다. 초간단 Spring Scheduler 적용에서 스케줄러를 동작시키는 방법을 정리했는데, cron expression 말고도 fixedDelay 속성을 이용하면 지정한 주기로 스케줄러를 실행시킬 수 있다. @Scheduled(cron = "0 0,30 3 * * *") // 매일 3시, 0시 30분 fun publishReward() { log.info("START === PUBLISH::REWARD::EVENT::DAILY::SCHEDULER ${UUID.randomUUID()}") rewardSer..

Spring 2022.11.28

Springboot 통합 테스트로 불안한 리팩토링에서 벗어나기

통합테스트를 작성한 경험을 기록했습니다. 아래와 같은 순서로 말해보겠습니다. 통합테스트 작성 계기 웹 레이어 테스트와 통합테스트 웹 레이어 테스트 작성 통합 테스트 작성 군말 통합 테스트 작성 계기 제가 참여하는 프로젝트는 구조를 크게 3계층으로 나눌 수 있습니다. 아주 흔한 구조입니다. Web Service Repository 저는 이중에서 서비스 레이어에 대한 단위 테스트만 집중해서 작성했습니다. (모든 레이어를 꼼꼼하게 테스트해야 한다고 생각하지만 내부적인 협의점이 그것이었습니다.) 라이브러리에 의존하는 단위 테스트를 하면서 가장 불편했던 점은 프로덕션 코드를 변경하면 테스트 코드를 함께 변경해야 한다는 것이었습니다. 간단한 예시를 들어보겠습니다. 불필요한 부분은 생략하겠습니다. //제품 코드 fu..

Spring 2022.08.24

ConstraintValidator 그리고 유효성 검사에 대한 고민..

스프링에서는 JSR303 기반 애노테이션 기반으로, 일관성 있는 유효성 검증을 진행할 수 있다. @NotNull , @NotEmpty , @Email 등은 검증 가능하지만, 비즈니스 요구사항이 따르는 유효성 검증은 별도로 해야 한다. 예시 차랑 예약 시스템이고 예약 기간에 대한 유효성 검증이 필요하다. 검증 조건은 간략하게 두 가지 정도로 한다. 존재하는 주차장이어야 한다. 퇴차일시가 입차일시보다 앞이면 안 된다. 예약일수가 내부적으로 정해진 최대 예약 일수를 초과해서는 안 된다. 데이터는 아래와 같은 형태로 들어온다. data class 차량예약DTO( var zoneId: Int = 0, //예약할 주차장ID var carNo: String = "", var startDateTime: LocalDat..

Spring 2022.05.16

Spring ArgumentResolver

클라이언트와 통신하다보면 전처리가 필요할 때가 있다. 간단한 예로 session에서 userId를 가져와야 한다고 가정해보겠다. HttpSession에서 UserID를 받아온다. UserID를 UserAuth로 변환해서 서비스 레이어로 넘긴다. @PostMapping("/api/sign-up") public ResponseEntity signUp(@RequestBody SignUpReq signUpReq, HttpSession session) { Long userId = (Long) session.getAttributre("userId"); loginService.signUp(signUpReq, AuthUser.of(userId)); return ResponseEntity.ok().build(); } C..

Spring 2022.05.12

@ControllerAdivce를 사용한 예외 처리 로직 분리

@ControllerAdvice를 사용하여 예외처리 로직 분리하기 과제 프로젝트를 개선하면서 받은 피드백 중 하나는 @ControllerAdvice를 통해 예외 처리 로직을 분리하라는 것이었습니다. 아래 코드를 보면 예외를 잡고 발생하는 예외마다 다른 Http Status code를 반환했습니다. 예시 코드 @PostMapping fun requestApartmentToBeMoved(@RequestBody apartmentRequest: ApartmentRequest, httpSession: HttpSession) : ResponseEntity { logger.info("apartmentRequest:{}", apartmentRequest) z try { val apartment = apartmentVi..

Spring 2021.05.15

초간단 Spring Scheduler 적용

Spring Scheduler는 Quartz라이브러리에 비해 사용하기가 매우 쉽습니다. 따로 의존성을 추가할 필요도 없습니다. 3분이면 적용해볼 수 있습니다. Springboot프로젝트 JDK1.8 이상 SchedulerTask @Slf4j @Component public class SchedulerTask { //1초마다 반복 @Scheduled(cron = "0/1 * * * * ?") //@Scheduled(fixedRate = 1000) public void schdulerTest() { log.info("NOW : {} ", LocalDateTime.now()); } } DemoApplication @EnableScheduling //Scheduling 활성화 @SpringBootApplicat..

Spring 2021.03.02

Springboot + JPA + Querydsl로 좋아요 기능 만들기 1 - 등록

Springboot + JPA + Querydsl로 좋아요 기능 만들기 1 - 등록 개인 프로젝트에 좋아요 기능을 추가했다. Springboot2.3.1, SpringDataJPA, Querydsl을 사용하여 구현했다. 테스트는 JUnit5로 진행했다. 코드는 전체 코드는 github에서 확인할 수 있다. 화면 처리나 환경설정은 이 글에서 다루지 않는다. 내가 생각한 요구사항은 다음과 같다. 사용자는 게시물에 좋아요를 누를 수 있다. 사용자는 자신의 좋아요를 취소할 수 있다. 사용자는 자신이 좋아요를 누른 게시물을 조회할 수 있다. 사용자는 게시물 당 한 번만 좋아요를 누를 수 있다. 사용자는 전체 게시물을 조회할 때 좋아요 카운트를 확인할 수 있다. 우선 구현을 위해 세 개의 엔티티(테이블)가 필요하다..

Spring 2021.02.07