개발
-
프로그래머스 게임맵 최단거리개발/코딩테스트 2024. 9. 9. 16:46
문제ROR 게임은 두 팀으로 나누어서 진행하며, 상대 팀 진영을 먼저 파괴하면 이기는 게임입니다. 따라서, 각 팀은 상대 팀 진영에 최대한 빨리 도착하는 것이 유리합니다. 1번 maps = [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] answer = 112번maps = [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] answer = -1 최단거리의 경우 전체 경로를 다시 돌아가서 하는 stack을 이용하는 bfs로 하면 효율성이 떨어진다 그러므로 queue를 통해 다시 돌아가는 것이 아닌 해당 queue를 넣어 바로 빼는 방식으로 동작하는 dfs를 이용하는 것이 맞다 우선..
-
프로그래머스 베스트앨범개발/코딩테스트 2024. 9. 7. 22:28
문제스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.속한 노래가 많이 재생된 장르를 먼저 수록합니다.장르 내에서 많이 재생된 노래를 먼저 수록합니다.장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요. 입출력 예genres ["classic", "pop", "classic", "classic", "pop"]plays [500, 600,..
-
S3 쓰기개발/AWS 2024. 9. 6. 10:56
AWS에서 제공하는 S3를 통해 파일 입출력을 하게 되면 비용이 저렴하여 많은 회사에서 S3를 사용하고 있다.이는 단순 이미지 파일업로드 뿐이 아니라 이력을 적재하여 잘못된 데이터를 추적하는 시스템 내에서도 활용이 가능하다. 간단히 AmazonS3를 주입하여 putObject(쓰기) , listObjects(읽기)를 사용해주면 된다 여기서 중요한 포인트는 파일을 위치를 어떻게 할지 , 업로드 시 압축을 어떻게 할지에 따라 비용 감축과 활용도가 달라진다는 점이다 위치의 경우 업무단위로 구분 후 생성날짜별로 저장하면 된다 예를 들면 취소라는 기능 수행 도중 S3에 파일업로드를 원한다면 S3 취소 폴더 내 금일 일자를 폴더를 만들고 거기에 해당 취소에 따른 고유 키 폴더를 만들면 될 것이다 압축의 경우 여러..
-
CompletableFuture개발/java 2024. 9. 5. 14:19
multi Thread를 통한 성능 개선 단일 Thread를 통해 작업을 수행하게 되면 많은 서비스를 수행하는 로직에서는 동작이 다소 지연 되는 경우가 있다.이 경우 Thread를 추가하여 작업을 main Thread가 아닌 다른 Thread에 작업을 배정함으로써 속도를 향상 시킬 수 있다 그 중 CompletableFuture를 통해 성능을 개선한 사례를 소개하려 한다 CompletableFuture의 경우 ForkJoin을 통해 스레드 풀을 할당받으며 반환 값이 있는 supplayAsync method와 반환 값이 없는 runAsync를 통해 다중 스레드로 작업을 할 당 할 수 있다 또한 아래와 같이 ThreadPoolTaskExecutor를 직접 생성하여 작업별 할당 스레드를 직접 선언하는 것..
-
java stream Util 만들기개발/java 2024. 9. 4. 10:14
java에서 제공하는 stream을 이용하여 코드를 단축할 수 있다 아래와 같이 Map을 통해 그룹핑을 하는 과정이다 Map> collect = orderInfoList.stream() .collect(Collectors.groupingBy(t -> t.getTrNo()+"-"+ t.getLrtrNo()));Map collect1 = orderInfoList.stream() .collect(Collectors.toMap(t -> t.getTrNo() + "-" + t.getLrtrNo(), Function.identity(), (t1, t2) -> t1)); 우선 그룹핑을 하기 위한 조건을 보면 변수 사이를 "-"를 묶어서 키로 만드는 과정을 볼 수 있다 이를 코드화하면 아래와 ..
-
mybatis로 jpa 흉내내기개발/java 2024. 9. 3. 13:18
mybatis의 경우 jdbc를 통해 코드와 db를 혼합하여 작성하는 방식에서 둘을 분리하게 구현함으로써 유지 보수 및 개발을 함에 있어 간편하고 쉽게 만들었다 그 이후 JPA가 도입됨에 따라 DB table에 따라 구현하는 방식이 서비스를 구현하는 것이 아닌 실 서비스를 세분화하여 ORM에 좀 더 다가갈 수 있게 되었다 그러나 특정 이유로 JPA를 사용하지 못하는 경우 mybatis에서 제공하는 new SQL() 과 ProviderMethodResolver를 통해서 별도 쿼리 작성 없이 동적으로 만들 수 있는 방법이 있다. import org.apache.ibatis.builder.annotation.ProviderMethodResolver;//mybatis 인터페이스 ProviderMethodRe..
-
싱글턴 문제점과 해결책개발/java 2024. 9. 2. 11:55
자바의 경우 싱글턴 패턴으로 이루어져 있다 예를 들어 동일 서비스를 10번 호출을 하게 되면 10번을 새로운 서비스로 인지해서 비효율적이니 1번의 호출만 새로운 서비스로 인식하고 나머지 9번을 1번을 호출된 서비스를 받아 처리하는 구조이다. 이 경우 상태를 체크하는 부분에서 문제가 발생할 수 있다. 예를 들어 멀티스레드로 구성된 경우 주문을 접수를 하는 고객이 여러번 주문생성이 가능한 구조라면 여러가지 상태 체크를 무시하는 경우가 발생할 수 있다. 이를 방지하는 경우는 여러가지가 있으나 그중 DB를 통해 resource lock을 걸어 제어하는 방법이 있다. 방식 1. 서비스 시작 시 특정 키를 통해 db를 insert 한다 2.서비스 수행 도중 해당 키를 통해 유입된 경우 유입을 대기 한다 3.서비..
-
api retry하기개발/java 2024. 8. 28. 13:06
msa 구조 내에서는 api 통신이 빈번하게 발생한다. 그중 gateway 관련된 오류의 경우 일시적인 경우가 많기에 재시도를 하면 해소 되는 경우가 많다 그러므로 해당 api의 응답코드(httpStatusCode)가 502 ,504인 경우 재호출을 하여 오류 빈도를 줄일 수 있다. 재시도의 경우 아래와 같이 HttpClient 내부에서 제공하는 HttpRequestRetryHandler를 이용하는 방법이 대표적이다. HttpRequestRetryHandler retryHandler = (exception, executionCount, context) -> { if (executionCount > 3) { // retry의 maxCount를 설정하여 false를 return 하면 재시도가 중단된..