로또 API 서버 구현 2탄입니다!
나머지 기능 모두 구현입니다!
3. 특정 사용자의 모든 로또 정보 조회
*LottoController
@GetMapping("/members/{memberId}/lottos")
public ResponseEntity<LottoResponses> showLottos(@PathVariable Long memberId) {
List<LottoResponse> lottoResponse = lottoService.getLottos(memberId).stream()
.map(LottoMapper::toLottoResponse)
.toList();
LottoResponses lottoResponses = LottoMapper.toLottoResponses(lottoResponse);
return ResponseEntity.ok(lottoResponses);
}
특정 사용자의 로또 값을 나타내야 하기 때문에, @PathVariable 어노테이션을 사용하였습니다.
*LottoService
@Transactional(readOnly = true)
public List<LottoEntity> getLottos(Long id) {
return lottoRepository.findAllByMemberId(id);
}
사용자의 id 값을 통해 로또를 조회할 수 있도록 하였습니다.
*결과
사용자가 어떤 로또를 구입하였는지 조회가 되는 것을 볼 수 있습니다!
4. 특정 사용의 특정 로또 정보 조회
*LottoController
@GetMapping(value = "/members/{memberId}/lottos", params = "order")
public ResponseEntity<LottoResponse> showLotto(@PathVariable Long memberId, @RequestParam("order") int order) {
List<LottoResponse> lottoResponse = lottoService.getLottos(memberId).stream()
.map(LottoMapper::toLottoResponse)
.toList();
LottoResponses checkedOrderLottoResponses = LottoMapper.toCheckedOrderLottoResponses(lottoResponse, order);
return ResponseEntity.ok(checkedOrderLottoResponses.lottoResponses().get(order - 1));
}
@PathVariable로 유저의 id값을 받고, @RequestParam으로 몇 번째 로또인지 나타낼 수 있도록 하였습니다.
*LottoService
@Transactional(readOnly = true)
public List<LottoEntity> getLottos(Long id) {
return lottoRepository.findAllByMemberId(id);
}
3번 API 와 동일한 서비스층 메서드를 이용하였습니다.
다른 점이 있다면 Mapper 에서 순서만 따로 지정해주었습니다!
*LottoMapper
public static LottoResponses toCheckedOrderLottoResponses(List<LottoResponse> lottoResponses, int order) {
return LottoResponses.of(lottoResponses, order);
}
이런 식으로 LottoMapper에서 LottoResponses의 정적 팩토리 메서드를 이용하였습니다.
*LottoResponses
public static LottoResponses of(List<LottoResponse> lottoResponses, int order) {
validateLottoOrder(lottoResponses, order);
return new LottoResponses(lottoResponses);
}
private static void validateLottoOrder(List<LottoResponse> lottoResponses, int order) {
if (order < 1 || order > lottoResponses.size()) {
throw new NotFoundLottoException();
}
}
LottoResponses 는 LottoService의 getLottos()에서 받아온 값들을 이용해, 몇 번째 로또를 이용하고 싶은지에 대한 로직을 간단히 구현하였습니다.
받아온 값들을 이용해 몇 번째 로또를 조회하였는지에 대한 검증 처리도 진행할 수 있었습니다.
*결과
원하는 1번 째 로또 값만 잘 조회되는 것을 확인하실 수 있습니다.
(데이터 베이스를 인메모리 형식으로 구현하였는데, 서버를 껐다 켜서 3번 API와 결과가 다르네요..ㅎ 그래도 잘 나옵니다.)
5. 모든 유저 정보 조회
*MemberController
@GetMapping("/members")
public ResponseEntity<MemberResponses> showUsers() {
List<MemberResponse> memberResponse = memberService.findAllUsers().stream()
.map(MemberMapper::toMemberResponse)
.toList();
MemberResponses memberResponses = MemberMapper.toMemberResponses(memberResponse);
return ResponseEntity.ok(memberResponses);
}
stream 메서드를 통해 memberReponse로 변환하였습니다. 이외의 따로 특별한 로직은 없습니다!
*MemberService
@Transactional(readOnly = true)
public List<MemberLotto> findAllUsers() {
return memberLottoRepository.findAll();
}
findAll()로 모든 유저를 끌어왔습니다.
이 경우에 예외처리를 해주지 않은 이유는 '[]' 이런식으로 빈 리스트 형태가 프론트단에 전달되어도, 이거를 이용해서 또 다른 로직을 만들어 낼 수 있다고 합니다.
그래서 일부로 예외처리는 하지 않았습니다!
*결과
유저의 [유저 아이디, 이름, 로또 티켓 수, 당첨금]이 잘 나오는 것을 확인할 수 있습니다!
이로써, lotto API 서버 구현은 끝이 났습니다.
API 자체는 어렵지 않았는데, 이번에 처음 접해보는 JPA가 상당히 어려웠습니다.
[자바 ORM 표준 JPA 프로그래밍] 이라는 책이 있다던데, 한 번 사서 읽어봐야겠습니다.
감사합니다!
개선사항이나 질문이 있다면 댓글로 남겨주세요!
'스프링 > 미션' 카테고리의 다른 글
[Spring] lotto - API 서버 구현(1) (0) | 2024.10.05 |
---|---|
[Spring] lotto - exception 적용 (0) | 2024.10.04 |
[Spring] lotto - exception 구현 (0) | 2024.10.04 |
[Spring] lotto - 도메인 로직 구현 (0) | 2024.10.02 |
[Spring] lotto - 기능 구현 목록 작성에 대한 중요성 (1) | 2024.10.02 |