전체 글689 [쿠링] Multi thread를 활용한 공지 조회속도 개선 (feat 동기화) 해당 글은 개인 프로젝트를 개선해 나가면서 내용을 정리하는 글입니다. 1. 도입 배경 쿠링에서는 학교의 전체 공지를 주기적으로 scrap해와야 한다. 하지만 이를 동기 처리 하다 보니 특정 학과의 scrap 속도가 늦어지면, 자연스럽게 전체 작업 속도가 늦어지는 문제가 발생하였다. 문제는 학교의 API를 사용하는 방식이 아니라, 직접 scrap을 통해 정보를 긁어오는 형식이기 때문에 주기적으로 신규 공지를 확인해줘야 하는데, 단일 코어상의 싱글 스레드로 처리하기에는 작업이 너무나 오래 걸렸다. 내가 생각한 공지 확인 간격보다, 한번 업데이트하는 시간이 더 길어지는 문제가 발생한 것이다! 나는 이를 해결하기 위해 Multi Thread를 도입한 비동기 처리를 해야겠다 생각하게 되었다! 2. 사전에 예상되는.. BackEnd/쿠링 2023. 4. 28. [프로그래머스][Java] 택배 배달과 수거하기 (267) 직접 풀어보고 올리는 코드입니다. 지적이나 더 좋은 방향에 대한 댓글은 항상 환영합니다. 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 생각의 흐름 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 생각이고 나발이고 문제 진짜 어렵다 생각 드는데, 이거 나처럼 greedy라고 생각 못한 사람은 끝까지 이 문제 못 건들이다가 끝났을것 같다. 일단 N제한이 100,000 이라 O(N^2), 즉 완전 탐색은 절대 안된다 생각했다. 여기서 문제다. 그럼 O(logN) = 5, O(NlogN) = 500,000, O(N) = 1000.. Algorithm/프로그래머스 2023. 4. 27. [쿠링] SonarCloud와 CI 도입 해당 글은 개인 프로젝트를 개선해 나가면서 내용을 정리하는 글입니다. 1. 도입 배경 기존의 쿠링의 배포 과정에서 CI 과정이 없다는 점이 아쉬웠다. 따라서 이번에는 SonarCloud를 통한 정적분석과 코드 커버리지 측정을 위한 CI과정을 추가해야겠다는 생각이 들었다! SonarCloud공식문서를 보면서 하나하나 해결해봅시다~ https://docs.sonarcloud.io/advanced-setup/ci-based-analysis/github-actions-for-sonarcloud/ GitHub Actions To configure analysis of your project using GitHub Actions you should follow the in-product tutorial. docs... BackEnd/쿠링 2023. 4. 21. [컴퓨터 구조] 2. 명령어: 컴퓨터 언어 2.2 하드웨어 연산 다음 MIPS 어셈블리 언어는 두 변수 b, c를 더해서 그 합을 a에 넣으라고 컴퓨터에게 지시하는 것 이다. add a, b, c MIPS 산술 명령어는 반드시 한 종류의 연산자만 지시하며 항상 변수 3개를 갖는 형식을 엄격하게 지킨다. 변수 b, c, d, e의 합을 구하여 a에 집어 넣는 예를 생각해보자. add a, b, c // a에 (b + c)를 대입한다 add a, a, d // a에 d를 더한다 add a, a, e // a에 e를 더한다 따라서 네 변수의 합을 구하려면 명령어 3개가 필요하다. 덧셈과 같은 연산자의 피연산자(operand)는 더해질 숫자 2개와 합을 기억할 장소 하나, 장소가 모두 3개인 것 이 자연스럽다. 이렇게 모든 명령어가 피연산자를 반드시 3.. CS/Computer Organization Design (2023-1) 2023. 4. 17. [쿠링] 형상관리를 위한 Flyway 도입기 해당 글은 개인 프로젝트를 개선해 나가면서 내용을 정리하는 글입니다. 1. 도입 배경 이번 쿠링 전 학과별 공지 지원 과정에서 기존의 Notice 테이블이 아닌, DepartmentNotice가 추가적을 발생하게 되었다. 새로운 테이블을 기존의 Notice테이블에 Dtype으로 구분하기 시작하면서, 추가된 속성들이 있고, 새로운 값들이 추가되었다. 물론 나야 내가 변경했으니 해당 의미들 을 빠르게 파악 가능하지만, 과연 다른 이가 봐도 이를 빠르게 이해할 수 있을까? 란 의문이 들었다. 또한 서로 다른 환경(local, test, prod)간에 통일된 스키마를 가지기 위해서 많은 리소스가 사용된다. 그러한 과정 속에서 다음 3가지 목표가 생기게 되었다. 업데이트마다 운영 DDL과 개발 DDL을 하나하나 .. BackEnd/쿠링 2023. 3. 31. [쿠링] 중복코드를 Template Method Pattern으로 Refactoring 하기 해당 글은 개인 프로젝트를 개선해 나가면서 내용을 정리하는 글입니다. 1. 현 상황 (개선하기 전의 코드) 우선 다음 코드는 Notice를 Scarp 하는 코드입니다. 문제는 (scarp, scarpAll), (requestWithDeptInfo, requestAllPageWithDeptInfo) 간의 중복 코드가 너무나 많다는 점입니다. scarp : 최근 공지 조회 scarpAll : 모든 공지 조회 이렇게 2개의 메서드를 구분하다 보니 발생한 중복 코드였습니다. 템플릿 메서드 패턴, 함수형 인터페이스, 람다식을 통하여 중복을 제거할 생각입니다! 우선 개선하기 전의 코드는 다음과 같습니다! @Slf4j @Component @NoArgsConstructor public class DepartmentNo.. BackEnd/쿠링 2023. 3. 27. [Spring] @Async와 ThreadPoolTaskExecutor 1. ThreadPoolTaskExecutor 스레드 풀을 사용하는 Executor java.util.concurrent.Executor를 Spring에서 구현한 것 이다. org.springframework.scheduling.concurrent 패키지에서 제공 주로 spring에서 비동기처리를 위해 사용 스레드풀을 사용하여 멀티스레드 구현을 손쉽게 해준다. Default 생성자 하나만 존재 2. Configuration 2 - 1) Pool size configuration @Bean public ThreadPoolTaskExecutor shineTaskExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); ta.. BackEnd/Spring 2023. 3. 26. [컴퓨터 구조] 1. 컴퓨터 추상화 및 관련 기술 1.4 케이스를 열고 컴퓨터의 고전적 구성 요소 다섯가지는 다음과 같다. 1) 입력 2) 출력 3) 메모리 4) 데이터패스, datapath 5) 제어 유닛, control unit 이중 뒤의 2개를 합쳐서 프로세서라고 부르기도 한다. 위 그림은 컴퓨터의 표준 구성을 보여주는 그림이다. 이 구성은 하드웨어 기술과는 독립적이다. 1.4.1) 상자를 열고 다음 그림은 Apple iPhone Xs MAX 스마트폰의 내용물이다. 컴퓨터의 고전적인 5대 구성요소 중 입출력 장치의 비중이 큰것은 놀라울 일이 아니다. 입출력 장치로는 정전용량식 멀티터치 LCD 디스플레이 등이 있으며, 데이터패스, 제어 유닛, 메모리는 구성 요소 중의 작은 일부를 차지하고 있다. 다음 그림에는 직접회로(Intergrated circu.. CS/Computer Organization Design (2023-1) 2023. 3. 21. [쿠링] Spring에서 Custom Annotation을 사용하여 객체를 Map에 등록시키기 해당 글은 개인 프로젝트를 개선해 나가면서 내용을 정리하는 글입니다. 1. 현 상황 (개선하기 전의 코드) 우선 쿠링에서는 DepartmentName이라는 enum값과, 해당 학과의 정보를 저장하고 있는 DeptInfo객체를 저장하고 있다. 이를 통해 map을 필요한 곳에서 전달받아 enum을 key로 사용하여 해당 학과의 정보를 사용하는 코드이다. 우선 코드는 대략 다음과 같다. 이 정도만 보면 몇 개 안돼서 수동 등록할 수도 있을 것 같지만... 무려 학과가 75개.... 이걸 수동으로 다 등록하는 건 진짜 무리다... (물론 지금 코드는 그렇게 구현된 있긴 한데...) 나는 Custom Annotation을 만들어서 Reflection을 통해 configuration에서 등록하여 bean객체로 만들.. BackEnd/쿠링 2023. 3. 21. [백준][C++] 16120번: PPAP (266) 직접 풀어보고 올리는 코드입니다. 지적이나 더 좋은 방향에 대한 댓글은 항상 환영합니다. https://www.acmicpc.net/problem/16120 16120번: PPAP 첫 번째 줄에 문자열이 주어진다. 문자열은 대문자 알파벳 P와 A로만 이루어져 있으며, 문자열의 길이는 1 이상 1,000,000 이하이다. www.acmicpc.net 생각의 흐름 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 우선 입력이 1,000,000까지라 O(NlogN), O(N) 안에 해결해야겠다는 생각부터 들었다. 그런데 경험상 이런 문자열 처리는 대부분 O(N)에 처리하는 문제였기에, 문자열을 처음부터 끝까지 한 번만 탐색해서 처리하는 방식을 생각하게 되었다. 문제는 이해만 하면.. Algorithm/백준 2023. 3. 21. [RabbitMQ] RabbitMQ 기본 개념 1. RabbitMQ의 기능과 장점 오픈소스 Pivotal의 소프트웨어이며, Mozilla Public 라이선스로 배포되고 있다. erlang으로 작성된 RabbitMQ는 오픈소스의 유연함에 안정성까지 갖췄다고 한다. 플랫폼과 업체 중립성 AMPQ(Advanced Message Queuing Protocol)스펙을 구현한 메시지 브로커 이다. 경량성 관리자 UI플러그인과 함께 코어 애플리케이션을 구동하는데 40MB 미만의 메모리만 사용한다. 이후에 Queue에 메시지 양이 증가하면 메모리 사용량이 증가하게 된다. 다양항 클라이언트 라이브러리 RabbitMQ는 다양한 언어와 운영체제, 환경에서 서로 데이터를 공유할 수 있는 유용한 다리 역할을 한다. 유연한 성능과 안정성 절충 제어 안정적인 메시지 전달과 .. BackEnd/RabbitMQ 2023. 3. 12. [쿠링] QueryDsl을 활용한 키워드 검색 쿼리 구현 개인적으로 작업하고 있는 프로젝트에서 검색쿼리를 리팩토링 해야 하는 상황이 발생하였다. 우선 이전 방식의 코드를 살펴본 후, 이를 리팩토링 해 나가는 과정을 남겨보자! 1. 리팩토링 전의 코드 우선 keywords를 전달받아 처리하는 이전의 코드는 다음과 같다. ▶ NoticeServce.handleSearchRequest() public List handleSearchRequest(String keywords) { keywords = keywords.trim(); String[] splitedKeywords = keywords.split("[\\s+]"); // 키워드 중 공지 카테고리가 있다면, 이를 영문으로 변환 for (int i = 0; i < splitedKeywords.length; ++i).. BackEnd/쿠링 2023. 3. 7. 이전 1 2 3 4 5 6 7 ··· 58 다음