스프링/미션 13

[Spring] lotto - API 서버 구현(2)

로또 API 서버 구현 2탄입니다! 나머지 기능 모두 구현입니다!  3. 특정 사용자의 모든 로또 정보 조회  *LottoController@GetMapping("/members/{memberId}/lottos")public ResponseEntity showLottos(@PathVariable Long memberId) { List lottoResponse = lottoService.getLottos(memberId).stream() .map(LottoMapper::toLottoResponse) .toList(); LottoResponses lottoResponses = LottoMapper.toLottoResponses(lottoResponse); ..

[Spring] lotto - API 서버 구현(1)

이번에는 API 서버 구현입니다!  중간에 exception 설명하느라 길어졌네요 ㅋㅋ 바로 시작합니다!  1. 로또 사용자 등록 *MemberController@PostMapping("/members")public ResponseEntity createUser(@RequestBody CreateRequest createRequest) { CreateResponse createResponse = MemberMapper.toCreatedResponse(memberService.createMember(createRequest)); URI location = URI.create("/api/members/" + createResponse.id()); return ResponseEntity.cre..

[Spring] lotto - exception 적용

저번 포스팅에서는 제가 exception 코드를 어떻게 구현했는지 설명했습니다.  이번 포스팅에서는 구현한 exception 코드를 어떻게 적용하였는지 알아보겠습니다!  저는 아래에 첨부한 API를 통해 어떻게 exception 을 적용하였는지 설명하겠습니다!  *MemberServicepublic void buyLotto(Long id, int count) { Member member = memberRepository.findById(id) .orElseThrow(NotFoundMemberException::new); member.updateMoney(count); MemberLotto memberLotto = new MemberLotto(member); mem..

[Spring] lotto - exception 구현

오늘은 exception 처리입니다!  제가 어떠한 원리로 exception 코드를 작성했는지는 이 곳을 참고해주세요!  exception 패키지 구조입니다!  예외처리를 전역적으로 적용시킬 것이기에 global 패키지를 생성하여 예외 처리를 구현하였습니다.먼저, enum을 사용하여 에러코드를 커스텀하였습니다. * CustomErrorCodepublic enum CustomErrorCode { NOT_LOTTO_RANGE_EXCEPTION(400, "로또 범위 아님."), USER_NOT_FOUND_EXCEPTION(404, "유저 없음."), MONEY_NOT_FOUNT_EXCEPTION(404, "돈 없음."), LOTTO_NOT_FOUND_EXCEPTION(404, "로또 없음..

[Spring] lotto - 도메인 로직 구현

저번 포스팅에서 작성했던 도메인 로직 기능 구현 목록입니다.  바로 제가 작성한 도메인에 대해 설명드리겠습니다. 먼저, 로또 숫자 생성에 관한 로직입니다. * CreateRandomNumberpublic interface CreateRandomNumber { int generateRandomNumber();} 저는 숫자 하나 하나를 생성하는 인터페이스를 만들었습니다. * LottoRandomNumberpublic class LottoRandomNumber implements CreateRandomNumber { private static final Random createRandomNumber = new Random(); private static final int MINIMUM = 1;..

[Spring] lotto - 기능 구현 목록 작성에 대한 중요성

사실 저는 코드를 작성할 때 일단 시작하고 보는 편입니다. 일단 시작을 하게되면, 그 다음에 어떤식으로 코드를 구현해야 할 지 마구 마구 떠올거든요.그렇기에 기능 구현 목록 작성에 대한 중요성을 깨닫지 못했어요. 물론 "기능 구현 목록 작성이 중요하다", "순서를 다지는 것이 중요하다" 라는 말은 많이 들어왔지만 실제로 저에게는 와닿지 않았습니다. 하지만 이번 Lotto 미션을 진행하며 완전히 생각이 바뀌게 되었습니다!!  처음 Lotto 미션 기능 구현 목록을 보았을 때, 어떤 도메인 로직을 작성해야 할 지 감 조차 잡히지 않았습니다. 당연히 Lotto 객체를 만들어 Lotto를 관리해야된다는 것은 알았지만 세세하게 어떤 부분을 어떻게 구현하는게 좋을지 막막했습니다. 그래서 저는 무작정  API 명세서..

[Spring] lotto - 미션 소개와 기능 구현 목록 정리

racing 미션을 완료하고 lotto 미션을 시작할 차례입니다. 먼저, lotto 미션에 대해 소개드리겠습니다!  이번 로또 미션은 따로 콘솔 프로그램을 구현하지 않아도 됩니다. 따라서 API 서버에 필요한 도메인 로직만 구현하면 됩니다! 그래서 저는 기능 구현 목록을 정리했습니다. 먼저 API 문서를 작성했습니다. [미션 내용]란에 나와있는 기능을 세세하게 다시 정리해보았습니다. 1. 로또 사용자 등록 2. 로또 n장 구매 구매 즉시 당첨 번호와 비교하여 얼마나 맞았는지 확인하는 로직을 같이 구현할 예정입니다. 3. 특정 사용자의 모든 로또 정보 조회 4. 특정 사용의 특정 로또 정보 조회 5. 모든 유저 정보 조회 다음은 도메인 로직 설계입니다! API 명세서를 미리 정리하고 나니, 어떤 로직을 구..

[Spring] racing - 후기

* 콘솔 초록스터디를 통해 일급컬렉션, 원시값 포장을 익힌 뒤에 racing 콘솔 코드를 작성하게 되었습니다.  사실 콘솔 프로그램을 구현하기 전에 초록스터디에서 익혔던 것이 체화되지 않을까 걱정되었는데, 기능을 구현하며 어떻게 코드를 작성해나가야 할 지 감이 잡혀서 너무 뿌듯했습니다. 특히 이번 미션을 진행하면서 도메인 로직을 구현할때 왜 일급컬렉션, 원시값 포장을 해야 하는지 느낄 수 있었습니다. 확실히 일급컬렉션으로 객체를 구현하니, 필요한 값만 넣으면 원하는 값을 꺼내 쓸 수 있는 점이 너무 편리하고 재사용성이 좋다는 생각이 들었습니다.  racing 미션에서는 Cars 객체에서 List 를 필드로 두어 일급 컬렉션을 구현하였는데, Cars가 자동차들을 관리하기에 우승자 뽑는 로직을 간편하게 구..

[Spring] racing - API 서버 구현(2)

저번 포스팅에 이어 바로 제가 어떻게 구현했는지 보여드리고자 합니다.  2. 자동차 경주 시작(Post) * WebController@PostMapping("/cars/racing")private ResponseEntity starRace() { racingService.startRace(); return ResponseEntity.status(HttpStatus.NO_CONTENT).build();} 컨트롤러는 위와 같이 구현하였습니다.경주만 시작하면 되고, Response가 따로 정해진게 없어서 Response 를 넘겨주지 않았습니다. *RacingServicepublic void startRace() { for (int i = 0; i private void moveCars() { ..

[Spring] racing - API 서버 구현(1)

콘솔 프로그램을 구현했으니, API 서버를 구현할 차례입니다.  API 서버 구현 규칙은 다음과 같습니다.  서버 구현 규칙 미션 설명 란에 처음 보는 단어들이 많은 것 같습니다. 해당 키워드들은 따로 정리하여 포스팅하려고 합니다.  다음은 API 명세서 입니다.구현해야할 API는 다음과 같습니다. API 명세서 이렇게 총 4개의 기능을 구현하면 됩니다.이제 바로 기능 구현으로 넘어가도록 하겠습니다.  1. 자동차 이름 등록(POST) * WebController@PostMapping("/create")private ResponseEntity createCars(@RequestBody CreateRequest createRequest) { racingService.createCars(createRe..