유튜브를 보던 중 추천 영상으로 떠서 보게 되어 간단하게 정리해봤습니다. 카프카가 빠르다는 의미는 무엇일까? 낮은 레이턴시? 많은 데이터 전송 처리? 카프카는 높은 데이터 전송 처리를 위해 최적화 되었습니다. 카프카는 많은 수의 레코드(데이터)를 짧은 시간에 처리하도록 디자인되었습니다. 그래서 누군가 카프카가 빠르다고 말하면 주로, 많은 데이터를 보내는 카프카의 성능을 말하는 것이다. 어떠한 디자인 결정이 많은 데이터를 카프카가 효과적으로 처리할 수 있게 하였을까요? 카프카의 성능을 위해 많은 컨트리뷰터가 디자인 결정을 했지만 두 가지를 집중해보겠습니다. 1. 카프카는 Sequential I/O입니다. 기본적으로 디스크 접근은 메모리 접근보다 느립니다. 그러나, 데이터 접근 패턴에 따라 차이가 큽니다. ..
재고시스템으로 알아보는 동시성 이슈 해결방법 해당 글은 인프런 | 재고시스템으로 알아보는 동시성 이슈 해결방법 강의를 보고 정리한 자료입니다. 모든 코드는 Github에 공개되어 있으며 각 해결 단계를 커밋으로 분리해두었으니 확인해주세요. 상품이 판매될 때마다 재고를 하나씩 줄여주는 기능을 만들어본다. 이 때 발생할 수 있는 동시성 문제를 하나씩 해결해보자. 문제발생 케이스 하나의 상품이 100개의 재고를 가지고 있을 때 단순하게 생각하면 판매될 때 재고를 -1 한 후 저장해주면 될거라고 생각할 수 있지만, 실무에서는 다양한 케이스가 발생할 수 있다. 대표적으로, 하나의 상품에 주문이 동시에 (ms 차이 수준) 들어온다고 가정을 한다. 이럴 때, Race Condition이 발생하여 최종 재고 값이 이상..
Query Parameters Path Variable이 아닌 다른 함수 매개변수를 선언하면, 쿼리 매개변수로 자동 해석됩니다. Query Parameter란 URL에서 ? 후에 나오는 값을 말합니다. &로 구분되는 키-값 쌍의 집합 www.exmaple.com?size=10&page=1 size : 10/ page : 1 값입니다. # 임시 데이터 mock_items_db = [ {"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"} ] @app.get("/items") async def read_items(skip: int = 0, limit: int = 10): return mock_items_db[skip : skip + limit] P..
기본 사용법 main.py from fastapi import FastAPI app = FastAPI() @app.get("/items/{item_id}") async def read_item(item_id): return {"item_id": item_id} {item_id}에 매핑되어 read_item(item_id) 매개변수로 받을 수 있습니다. 서버를 실행 한 후 PostMan으로 위에서 만든 핸들러를 호출해봅니다. {item_id}로 받은 값이 출력되는 것을 확인할 수 있습니다. 매개변수 타입지정 @app.get("/items/{item_id}") async def read_item(item_id: int): return {"item_id": item_id} : int로 지정해주면 됩니다. 만약..
Facebook 을 보다FastAPI 톺아보기 - 부제: python 백엔드 봄은 온다 이러한 글을 보게되었는데, 굉장히 간결하고 좋아보여서 한번 공부해보려합니다. Fast Api 공식 사이트 문서가 아주 잘되어 있습니다. 공식 사이트에선 Fast Api 특징을 아래처럼 소개하고 있습니다. 간단한 예제로 살펴보겠습니다. python version : 3.6+ 1. Fast Api 패키지 설치 bash $pip install fastapi[all] # 만약 zsh: no matches found: fastapi[all] 오류가 난다면 # 아래로 설치해주세요. $pip install 'fastapi[all]' no matches found: error 2. Python Project & main.py 생성 ..
MapStruct 소개 DTOEntity간 객체 Mapping을 편하게 도와주는 라이브러리 비슷한 라이브러리로ModelMapper가 있습니다. ModelMapper는 변환과정에서 리플렉션이 발생합니다. MapStruct는 컴파일 시점에 구현체를 만들어내기 떄문에 리플렉션이 발생하지 않아 보다 빠릅니다. 간단하게 Gradle 프로젝트로 구성 1. add dependency build.gradle plugins { id 'java' } ext { mapstructVersion = '1.4.2.Final' lombokVersion = "1.18.12" } group 'io.alxndr' version '1.0-SNAPSHOT' repositories { mavenCentral() } dependencies {..
PasswordEncoder 설정하기 기존의 {noop} 문자열을 더해줘서 Password encoding 하던 것을 Spring Security가 지원해주는 PasswordEncoder를 사용해보겠습니다. Bean 등록 Application.java @SpringBootApplication public class Application { @Bean public PasswordEncoder passwordEncoder() { return NoOpPasswordEncoder.getInstance(); } // 1 public static void main(String[] args) { SpringApplication.run(Application.class, args); } } PasswordEncoder를..
JPA와 Security 연동 이전의 문제점 매번 유저를 추가하는 일이 생길 경우 코드를 수정해야 한다. 수정, 삭제도 마찬가지로 코드를 수정해야 한다. -> 위와 같은 문제를 DB를 연동하여 유저 정보를 관리할 수 있도록 수정해보겠습니다. (JPA를 사용하겠습니다.) 개선 JPA 설정 dependency 추가 build.gradle dependencies { ... // JPA implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // H2 runtimeOnly 'com.h2database:h2' ... } class 생성 Account @Entity @Getter @Setter public class Account { @Id @..
- Total
- Today
- Yesterday
- java11
- Java
- Security
- QueryDSL
- boot
- Spring
- springboot
- booleanExpression
- 웹서비스
- JPA
- paawordencoder
- API
- 스프링시큐리티
- ubuntu
- spring web
- ResourceHttpReqeustHandler
- howtoinstallnginx
- like절
- 스프링
- ControllerAdvice
- mapstruct
- 자바
- Python
- 스프링부트
- @formula
- FastAPI
- 스프링부트 시작하기
- 유사결과
- springsecurity
- 개발
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |