스프링/미션

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

문상휘파람 2024. 10. 5. 16:15

로또 API 서버 구현 2탄입니다!

 

나머지 기능 모두 구현입니다!

 


 

3. 특정 사용자의 모든 로또 정보 조회

API

 

 

*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. 특정 사용의 특정 로또 정보 조회

API

 

*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. 모든 유저 정보 조회

API

 

 

*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 프로그래밍] 이라는 책이 있다던데, 한 번 사서 읽어봐야겠습니다. 

감사합니다! 

 

개선사항이나 질문이 있다면 댓글로 남겨주세요!