분류 98

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

IoC(Inversion Of Control) 컨테이너와 스프링 빈(Bean)

앞서 설명한 의존성 주입(Dependency Injection, DI)은 IoC의 한 형태입니다.  도대체 무슨 말일까요?  이를 이해하기 위해서는 IoC를 이해해야 합니다. IoCIoC란 흔히 "제어의 역전" 이라고 불립니다.객체의 생성과 소멸 등등을 책임졌던 개발자의 객체 제어권이 바뀌었다는 소리입니다. 일반적으로 개발자는 객체를 직접 생성하고, 메서드를 호출하여 코드를 작성하였습니다.하지만 IoC에서는 직접 객체를 생성하고 호출하는 것이 아니라, 외부에서 객체를 생성하거나 호출합니다. 이를 통해 개발자는 코드를 작성할 때 의존성을 최소화하고 더욱 유연하게 코드를 작성할 수 있습니다. 위의 질문을 해결하자면, Spring Framework는 IoC 컨테이너를 이용하여 의존성 관리 및 의존성 주입을 수..

의존성 주입(DI)과 주입 방식

의존성 주입의존성 주입은 흔히 DI(Dependency Injection) 라고 불립니다. 그렇다면 의존성 주입이란 도대체 뭘까요?-> 스프링 프레임워크에서, 의존성 주입은 직접 객체를 생성하거나 참조하지 않고 외부에서 주입받는 것을 의미합니다. 그렇다면 의존성 주입을 왜 사용할까요?1. 코드가 깔끔해진다.2. 의존성 주입을 통해 객체들이 효과적으로 분리된다.3. 코드의 재사용성과 유연성이 높아진다.의존성 주입 방법1. 생성자 주입 생성자를 통해 의존성을 주입하는 방법입니다. 스프링이 가장 권장하는 방법이기도 합니다.@Servicepublic class SimpleMovieLister { private final MovieFinder movieFinder; public SimpleMovieLi..

@Data 어노테이션에 관하여

기본적으로 @Data 어노테이션은 Lombok 라이브러리에서 제공하는 기능입니다.## @Data 어노테이션 특징1. Getter 메서드: 각 필드에 대해 getter 메서드를 생성합니다.2. Setter 메서드: 각 필드에 대해 setter 메서드를 생성합니다.3. toString() 메서드: 객체의 내용을 문자열로 변환하는 toString() 메서드를 생성합니다.4. equals() 메서드: 객체 간의 동등성을 비교하는 equals() 메서드를 생성합니다.5. hashCode() 메서드: 객체의 해시 코드를 반환하는 hashCode() 메서드를 생성합니다.6. RequiredArgsConstructor: final 또는 @NonNull로 선언된 필드에 대한 생성자를 자동으로 생성합니다.이렇게..