전체 글 136

카카오 기출 풀이 - 외벽 점검(Python)

개요 자바로 기출을 다시 풀어보다가 잘 안풀려서 파이썬으로 풀어봤다. 머리속으로 구상한 내용은 파이썬이랑 똑같은데 자바로 풀 때는 좀 어렵다고 생각했는데 파이썬으로 풀니까 좀 수월하게 풀리는 감이 있다. 자바 실력이 부족한 것 같으니 자바를 좀 더 공부하자.. 근데 풀고나서 보니 좀 깔끔하게 푼 감이 있어서 포스팅을 하고 싶어졌다. 카카오스러운 문제다. 모든 경우의 수를 구해서 조건에 들어 맞는 경우를 택해주면 된다. 풀이 과정 외벽을 돌 수 있는 사람의 경우를 size를 1부터 len(dist) 까지 해서 순열로 구해준다. 외벽 점검하는 사람들의 모든 경우의 수를 구한다. 시작 지점을 모든 곳으로 잡아줘야한다. 이는 외벽을 반시계방향으로 도는 경우도 있기 때문에 이를 보완하기 위함이다. 출처에 들어가서..

인프라를 지탱하는 응용 기술

캐시 캐시는 사용 빈도가 높은 데이터를 고속으로 액세스할 수 있는 위치에 두는 것을 의미한다. 캐시는 데이터를 잃을 가능성이 있기 때문에 데이터가 손실 돼도 괜찮은 경우에 주로 사용한다. 적합한 시스템 참조 빈도가 높은 데이터 캐시의 데이터가 손실돼도 문제가 없는 시스템 부적합한 시스템 데이터 갱신 빈도가 높은 시스템 대량의 데이터에 액세스하는 시스템 인터럽트 어떤 원인으로 인해 지금 하고 있는 일을 중단하고 급히 다른 일을 하는 것을 인터럽트라고 한다. 하나의 작업 중에 다른 작업을 할 수 있는 이유는 인터럽트를 통해서 CPU가 짧은 순간 다른 처리를 한 후 원래 하고 있던 작업을 계속하기 때문이다. 끼어들기는 어떤 일이 발생하면 연락하는 event-driven 구조이다. 반대로 CPU가 정기적으로 폴..

CS/컴퓨터 구조 2023.11.06

인프라를 지탱하는 기술

직렬과 병렬 직렬 처리로는 속도를 올리는데 한계가 있다. 병렬화를 통해 속도는 빨라지지 않지만, 단위 시간당 처리량을 늘릴 수 있다. 병렬 처리에서는 합류점,직렬화 구간, 분기점이 병목 지점이 되기 쉽다. 병렬화할 때는 일을 분담해서 처리를 한 후 다시 집약할 때 오버헤드가 걸린다. 그러므로 이 오버헤드를 감안하더라도 효과가 있을 경우에 병렬화를 한다. 직렬 처리 속도를 올리는 방법은 CPU의 클럭 주파수를 올린다. 어디에 사용되나? 웹서버는 다수의 이용자가 접속하기 때문에 복수의 프로세스가 분담해서 병렬 처리를 하고 있다. AP 서버에서는 JVM 프로세스가 하나이지만 복수의 스레드가 병렬로 처리하고 있다. Apapche HTTP Server 에서는 이번에 소개한 멀티 프로세스 모델 외에도 멀티 프로세스..

CS/컴퓨터 구조 2023.11.06

다양한 콜렉션에 대해서..

Collection 과 Map 인터페이스 데이터를 담기 위해서는 Collection 과 Map 인터페이스를 상속한 객체를 주로 사용한다. Set, List, Queue 는 Collection을 구현한 구현체들이다. Set HashSet: 데이터를 해쉬 테이블에 담는 클래스로 순서 없이 저장된다. TreeSet: red-black 이라는 트리에 데이터를 담는다. 데이터를 담으면서 동시에 정렬하기 때문에 HashSet 보다 성능상 느리다. LinkedHashSet: 해쉬 테이블에 데이터를 담는다. 저장된 순서에 따라 순서가 결정된다. 레드 블랙 트리란? - 각각의 노드는 검은색이나 붉은 색이다. - 가장 상위 노드는 검은색이다. - 가장 말단 노드는 검은색이다. - 붉은 노드는 검은 하위노드만을 가진다. -..

3계층형 시스템의 구성도

개요 웹서버, AP 서버, DB 서버가 있다. 주요 개념 프로세스와 스레드 프로세스는 프로그램을 실행하면 OS 상에서 실행되어 독립적으로 동작하는 것이다. 프로세스 및 스레드가 활동하려면 메모리가 필요하고 이것은 커널에 의해 메모리 상에 확보된다. OS 커널 OS 처리는 원칙적으로는 커널을 통해서 이뤄진다. 커널의 역할을 여러가지가 있지만 6가지로 정리가 가능하다. 시스템 콜 인터페이스 프로세스/스레드에서 커널로 연결되는 인터페이스다. 애플리케이션 OS 에서 어떤 처리를 하고 싶으면 시스템 콜이라고 하는 명령을 이용해서 커널에 명령을 내린다. 프로세스를 관리한다. OS 상에서는 몇 천개의 프로세스를 가동할 수도 있지만 물리서버의 CPU 코어는 수십 개 정도 밖에 되지 않기때문에 어떤 프로세스가 어느 정도..

CS/컴퓨터 구조 2023.10.28

물리서버와 내부 구조

서버 설치장소 서버는 랙이라는 것에 장착된다. 랙에는 서버외에도 HDD 가 가득 장착돼 있는 저장소나 인터넷 및 LAN 을 연결하기 위한 스위치 등도 탑재돼 있다. 서버 내부 구성 CPU, 메모리, HDD 등의 컴포넌트들이 버스들로 연결되어 있다. CPU와 메모리는 직접 연결되어있고 HDD나 네트워크 인터페이스는 메모리에 비해 멀리 있다. CPU 서버 중심에 위치해서 연산 처리를 한다. CPU는 명령을 받아서 연산을 실행하고 결과를 반환한다. 명령과 데이터는 기억 장치나 입출력 장치를 통해 전달된다. CPU를 코어라고 하며, 하나의 CPU 에 여러 개의 코어가 존재하는 멀티 코어화가 진행되고 있다. 우리가 프로세스나 키보드 마우스를 통한 입력을 하면 OS 가 동작하고 OS 가 CPU에 명령을 내리게 된다..

CS/컴퓨터 구조 2023.10.27

String을 사용하면 안되는 이유

String과 StringBuilder를 사용시 성능의 차이 public class StringTest { Integer MAX_NUM = 10000; @Test public void streamTest() { List array = new ArrayList(); stringTest(); // stringBuilderTest(); } private void stringTest() { String a = "a"; long startTime = System.nanoTime(); for (int i = 0; i < MAX_NUM; i++) { a += "bfwfj"; a += "afwf;iac"; a += "afwfie;jawefd"; } long endTime = System.nanoTime(); Syste..

프로그램의 속도를 측정하고 싶을 때

프로그램의 성능을 측정하는 법 프로그램의 성능을 측정하기 위해서는 툴을 이용하는 방법과 System 클래스를 활용하는 법으로 나뉜다. 프로파일링 툴 vs APM 툴 프로파일링툴 소스 레벨의 분석 위한 툴 애플리케이션 세부 응답 시간까지 분석 가능 메모리 사용량 객체나 클래스, 소스의 라인 단위까지 분석가능 사용자 수 기반으로 가격 정해짐 자바 기반의 클라이언트 프로그램 분석 가능 APM 툴 애플리케이션의 장애 상황에 대한 모니터링 및 문제점 진단이 주목적 서버의 사용자 수나 리소스에 대한 모니터링 가능 실시간 모니터링 위한 툴 CPU 수 기반으로 가격 책정 자바 기반의 클라이언트 프로그램 분석 불가능 프로파일링 기능 응답 시간 프로파일링 응답 시간 프로파일링을 하는 주된 이유는 응답 시간을 측정하기 위함..

TDD 에 대해 알아보자

TDD 란 무엇인가? Test driven devlopment 로 테스트 주도형 개발이다. 흔히들 코드를 짠 후에 테스트 코드를 짜는 방식을 이용해왔지만 TDD 는 패러다임을 바꿔 테스트 코드를 짠 후에 코드를 짜서 테스트에 알맞은 코드를 짰는지 확인하면서 넘어간다. 즉 테스트 코드를 짜는 것도 하나의 실력인 시대가 온것이다. TDD 왜 진행하는 걸까? 요구사항이 시시때때로 바뀌고 유연한 개발 시스템이 필요할 때 "피드백"과 "협력"의 가치를 높이기 위해서 TDD 를 진행한다. 변화에 대해 유연한 개발이 가능하기 때문에 TDD 를 사용하는 것 같다. TDD의 장점 객체지향적 설계 가능 단위 테스트를 통해서 기능을 세세하게 분리하기 때문에 철저히 모듈화된 코드를 작성할 수 있다. 코드의 재사용성 역시 높아..

개발방법론/TDD 2023.10.09

AWS Elastic cache 를 통한 인메모리 서버 구축

개요 Jwt 를 이용 해서 로그인부터 인증 서비스를 모두 구축한 후, 별 생각 없이 프로젝트를 진행하고 있다가 로그아웃을 구축하려고 하니 한 가지 문제가 발생했다. Jwt Token 만료시키는 게 가능한가...? 구글링을 해본 결과 token 의 만료는 불가능 하다는 글을 보고 말았다. 새로운 방법이 필요한 타이밍이었다. 마음에 드는 방법을 찾아 다니다가 딱 마주친게 Redis 를 통한 인메모리 캐시에 로그아웃된 액세스 토큰을 저장하면서 해결하는 방법이었다. 문제 해결 방법은 로그아웃 할 때 마다 AccessToken 을 블랙 리스트로 저장하는 것이었다. 우리의 프로젝트에 맞는 간단하고 리소스가 적게 들어가는 해결책이었다. 하지만 RDBMS 에 넣기에는 너무 테이블도 아깝고 자주 접근하면 속도 측면에서도..