스프링 29

JPA : 데이터 베이스와의 상호작용을 위한 특징

JPA 란 무엇인가?JPA(Java Persistence API)는 자바 애플리케이션에서 데이터베이스와 상호작용하기 위한 ORM(Object-Relational Mapping) 표준입니다.데이터베이스와의 상호작용을 위한 주요 특징 1. 쓰기 지연 (Write-Behind / Write-Delay)- 쓰기 지연은 JPA에서 성능을 최적화하기 위해 제공하는 기능입니다.- 엔터티(객체)에 대한 변경 사항이 즉시 데이터베이스에 반영되지 않고, 트랜잭션이 커밋될 때까지 변경 사항을 보류합니다.- 즉, 여러 변경 사항을 모아서 한 번에 데이터베이스에 반영하는 방식입니다. -> 데이터베이스와의 상호작용 횟수를 줄여 성능을 최적화할 수 있습니다. 2. 더티 체킹 (Dirty Checking)- 더티 체킹은 JPA가 객..

트랜잭션(Transaction)에 관하여

Transaction(트랜잭션)트랜잭션(Transaction 이하 트랜잭션)이란, 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻합니다.트랜잭션의 특징원자성 (Atomicity)트랜잭션 내의 모든 명령이 모두 수행되어야 하며, 하나라도 수행 안될 경우 트랜잭션 모두 취소 => 롤백이 일어납니다.일관성 (Consistency)트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지합니다.격리성 (Isolation)둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없습니다.지속성 (Durability)트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 합니다.트랜잭션 연산 및 상태연산C..

[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가 자동차들을 관리하기에 우승자 뽑는 로직을 간편하게 구..