개-발/Java + Spring + Kotlin

문제발급 가능 수량은 100장의 쿠폰이 있다. 10000명이 동시 접근 할때 쿠폰 발급을 정상적으로 수행 가능하게 하려면 어떻게 해야 할까 ?냅다 코드를 짜버리면 이런식으로 100개 이상의 쿠폰이 발급되곤 한다.이에 많은 답변으로 싱글스레드인 Redis 분산 락을 사용하는데필자는 환경에 제한을 두어 In-memory와  RDB를 사용하여 해결하려고 한다.  쿠폰의 갯수 제한을 두는 방법을 2가지로 생각해 보았다.- 발급된 쿠폰갯수를 카운트 하기쿠폰을 발급할때마다 데이터 베이스에 조회를 따로 해야 하므로 네트워크 비용 , 부하가 발생할 수 있다.- 엔터티에 갯수를 넣어 카운트 하기  쿠폰 발급 시 전체 쿠폰 수를 조회하지 않아도 되므로 성능면에서 이점이 있다.하지만 추가 수량에 대한 대응 관리 기능을 추가..
문제 String 타입의 필드를 특정 형식으로 받아오고 싶은데 .... 이 문제를 Controller 에서 처리 하기엔 코드가 복잡해 졌다. @Constraint 어노테이션을 활용하여 커스텀 Validatation을 만들자 Controller 에서 dto를 요청으로 받아올때 String 값을 yyyy-MM-dd HH:mm 이런 형식으로 받아오고 싶었다. 1. 어노테이션 만들기 // CustomDateTimeFormat.java @Constraint(validatedBy = DateTimeFormatValidator.class) @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface CustomDateTimeForma..
문제 시나리오 사용자의 네트워크 지연 사용자의 잘못된 조작 중복요청이 발생 할 경우 데이터의 동시성 문제로 일관된 데이터가 입력이 될 수 있기 때문에 중복요청을 방지 하고자 했다. 많은 방법이 있지만 Spring AOP (Aspect-Oriented Programming)를 활용하여 문제를 해결하고자 했다. @Aspect @Component public class DuplicateRequestAspect { private Set requestSet = Collections.synchronizedSet(new HashSet()); @Pointcut("within(*..*Controller)") public void onRequest() {} @Around("onRequest()") public Object..
병렬 처리(Parallel Operation)란 멀티 코어 환경에서 하나의 작업을 분할해 각각의 코어가 병렬적으로 처리하는 것이다. 동시성(Concurrency) 멀티 작업을 위해 멀티 스레드가 번갈아가며 실행하는 성질이다. 싱글 코어 CPU를 이용한 멀티 작업은 병렬적으로 실행되는 것처럼 보이지만 실제로는 동시성 작업이다. 병렬성(Parallelism) 병렬성은 멀티 작업을 위해 멀티 코어를 이용해 동시에 실행하는 성질이다. 예제1) 해당 예제는 리스트에 10개의 요소를 더하고 , 1초의 대기시간을 주는 예제이다. 일반 반복문 public class SequentialProcessingExample { public static void main(String[] args) { List numbers = ..
1. 간결하고 가독성이 좋은 코드: 람다를 사용해서 가독성이 좋아진다. 2. 병렬 처리 가능: 병렬 스트림을 사용하면 멀티코어 프로세서의 장점을 활용하여 빠른 속도로 대량의 데이터를 처리할 수 있다. 3. 지연 연산(lazy evaluation): 필요한 데이터만 처리하고 나머지 데이터는 처리하지 않는다는 의미 - 성능을 향상 4. 강력한 기능: 맵(map), 필터(filter), 정렬(sort), 그룹화(grouping) 등 다양한 연산을 스트림을 통해 수행할 수 있습니다. 지연 연산(lazy evaluation) 불필요한 연산을 안한다. 아래의 코드는 1~10까지의 정수를 갖는 List에서 6보다 작고, 짝수인 요소를 찾아 10배 시킨 리스트를 출력하는 코드입니다. final List list = A..
given() Mock 객체인 -> productService .getProduct 메서드에 "12315" 를 넣으면 .willReturn( 응답값 ) perform() RESTAPI TEST를 할 수 있는 환경을 만들어준다. >> get - get요청 / post , get , put , delete 어떤 Http통신을 할지 정의를 해줌 - builder구조를 사용한다 ( . 을사용하여 옵션 사용 ) - andExpect() 기대하는 값이 나왔는지 체크해볼 수 있는 메소드 - jsonPath() 기대하는 json값이 나왔는지 - exists() [현재 값이 있는지 판단] -andDo(print()) 위에서 테스트 한 내용을 프린트 verify() 해당 객체의 메소드가 실행 되었는지 체크 값을 Json..
TDD (Test-Driven-Development) 방법론 테스트를 먼저 설계하고 구축하여 통과할 수 있는 코드를 짜는것 장점 코드의 안정성을 높일 수 있음 (기능을 추가하거나 변경하는 과정에서 발생할 수 있는 상황들을 줄일 수 있음) 해당 코드가 작성된 목적을 명확하게 표현 할 수 있음 통합 테스트 통합 테스트는 여러 기능을 조합하여 전체 비즈니스 로직이 제대로 동작하는지 확인하는 것을 의미 통한 테스트의 경우, @Spring BootTest를 사용하여 진행 @SpringBootTest는 @SpringBootApplication을 찾아가서 모든 Bean을 로드하게 됨 이 방법을 대규모 프로젝트에서 사용할 경우, 테스트를 실행할 때마다 모든 빈을 스캔하고 로드하는 작업이 반복되어 매번 무거운 작업을 수..
이전글인 랜덤매칭 서비스에서 Discord봇을 이용하여 방을 생성하고 Url을 받아온다. https://soobysu.tistory.com/76 MatchingService 매칭 정원이 다 찻을경우 채널을 생성해준다. DiscordService DI Application.yml Application.yml 파일을 셋팅해준후 값을 넣어준다. discord key = 봇id guild id = 디스코드 서버id category = 디스코드 서버 내의 채널 카테고리 id 를 넣어주면 된다 아래의 사진은 디스코드 사용자설정 > 고급 > 개발자 모드를 활성화 해주면 나타난다 settingkey 얻는방법은 밑의 URL참고. https://appmaster.io/ko/blog/discord-bos-saengseong..
imSoo
'개-발/Java + Spring + Kotlin' 카테고리의 글 목록 (3 Page)