![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/ciEhak/btrKBHnlvbY/GrD8SY9hYNMdL49BAkx1E1/img.jpg)
스프링은 POJO 프로그래밍을 손쉽게 할 수 있도록 IoC/DI, AOP, PSA 세 가지 기술을 제공한다. 이 세 가지 모두 스프링이 있기 이전에도 여러 가지 형태로 시도됐고, 발전하고 있던 기술이었다. 다만 스프링은 통일성 있고, 세련된 방법으로 자바 엔터프라이즈 개발의 전 영역에 걸쳐 효과적으로 적용될 수 있도록 프레임워크 형태로 제공한다. 제어의 역전 (IoC)과 의존관계 주입 (DI) 왜 두 개의 오브젝트를 분리해서 만들고, 인터페이스를 두어 느슨하게 결합한 뒤, 실제 사용할 대상은 DI를 통해 외부에서 지정하는걸까? DI 방식이 직접 new 연산자를 사용해서 강한 결합을 쓰는 방법보다 나은 점이 무엇일지 의문을 가져본 적이 있을 것이다. 바로 유연한 확장이 가능하게 하기위해서 라고 할 수 있다..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bZ2wHi/btrKq53HLpY/5GmdmfwEoQzhKVH3pPyXv1/img.png)
📚 문제 입력 출력 예제 입력 1 11 44 0 38 41 38 31 23 8 41 30 38 Hello World예제 출력 1 y예제 입력 2 5 12 3 34 52 0 apple예제 출력 2 n🧑🏻💻 풀이 과정 딕셔너리를 이용하여 평문과 비교할 암호문을 초기화 하자.(word_dit = init_dic()) 입력받은 암호문(secret_text)을 오름차순 정렬하자. 평문(plain_text)에서 단어를 하나씩 추출하여 암호문으로 치환하고, 암호문과 비교하기 위해 오름차순 정렬도 잊지말자.(arr = sorted([word_dit.get(text) for text in plain_text])) 서로 정렬된 결과를 비교하여 반환하자. (return 'y' if secret_text ==..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/1tmoY/btrKpCUzctL/ZKTEistTZxh6R4dH7KqRQk/img.png)
관계형 데이터베이스(RDB)는 사전에 엄격하게 정의된 DB schema를 요구하는 table 기반 데이터를 구조를 갖는데 반해, 비관계형 데이터베이스(NoSQL)는 table 형식이 아닌 비정형 데이터를 저장할 수 있도록 지원한다. RDB는 엄격한 schema로 인해 데이터 중복이 없기 때문에 데이터 update가 많을 때 유리하고, NoSQL은 데이터 중복으로 인해 update 시 모든 컬렉션에서 수정이 필요하기 때문에 update가 적고 조회가 많을 떄 유리하다. NoSQL 기존의 관계형 데이터베이스의 경우에는 단일 기업의 데이터를 다루는데 최적화 되어 있었다. 하지만 최신 데이터들은 꼭 관계형으로 처리할 필요가 없는 경우도 많고, 다뤄야 하는 데이터의 양도 훨씬 많이 커졌다. 즉 빅데이터라고 일컬어..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/BseXA/btrKmLK7KbR/puup8hgbhEV42JX0Sr56OK/img.png)
📚 문제 입력 출력 예제 입력 4 3 10 21 10 3 20 10 10 3 10 10 10 4 15 15 15 45예제 출력 majority winner 2 minority winner 1 no winner minority winner 4🧑🏻💻 풀이 과정 입력받은 후보자의 득표수를 리스트에 저장하자(arr) arr에서 가장 큰 값을 별도의 변수 max_val에 저장하고, arr에 max_val과 중복된 값이 있으면 no winner를 출력하고 return. arr에서 max_val의 인덱스를 구한 뒤, arr - max_val < max_val이면 majority winner, 아니면 minority winner을 출력하자. def popularity_vote(): arr = [int(input())..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bupimL/btrKcvvTV7V/rPR0WktxxkxAWRpMghKke1/img.png)
실제 우리가 사용하고 있는 운영체제에서 가상 메모리를 사용하고 있기 때문에 개발자는 가상 메모리를 이해하는 것이 중요하다. 운영체제에 의해 메모리 관리가 어떻게 이루어지는지, 또 page fault, page 교체 알고리즘은 어떤 것인지에 대해서 알아보자. 가상 메모리 (virtual memory) 가상 메모리는 실제 물리 메모리 개념과 개발자 입장의 논리 메모리 개념을 분리한 것이다. 이렇게 함으로써 개발자는 메모리 크기를 전혀 신경쓰지 않고, 손 쉽게 프로그램을 작성할 수 있게 된다. 운영체제는 가상 메모리 기법을 통해 프로그램의 논리적 주소 영역에서 필요한 부분만 물리적 메모리에 적재하고, 직접적으로 필요하지 않은 메모리 공간은 디스크(Swap 영역)에 저장하게 된다. 요구 페이징 (demand p..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/kJ0aX/btrJ6Z4JAH5/1WNj2tIg61cP9N0xCHnunK/img.png)
Paging을 알아보기에 앞서 간단하게 논리적 주소와 물리적 주소의 차이에 대해 살펴보자. 논리적 주소 (logical address) 프로세스가 메모리에 적재되기 위한 독자적인 주소 공간인 논리적 주소가 생성된다. 논리적 주소는 각 프로세스마다 독립적으로 할당되며, 0번지부터 시작된다. 물리적 주소 (physical address) 물리적 주소는 프로세스가 실제로 메모리에 적재되는 위치를 말한다. 주소 바인딩 (address binding) CPU가 기계어 명령을 수행하기 위해 프로세스의 논리적 주소가 실제 물리적 메모리의 어느 위치에 매핑되는지 확인하는 과정을 말한다. Paging paging기법은 프로세스의 메모리 공간을 동일한 크기의 page 단위로 나누어 물리적 메모리의 서로 다른 위치에 pag..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/b1T1Tm/btrJ5ykc8rV/HU5MKUtseT5IPxa5G6KIlk/img.png)
📚 문제 입력 출력 예제 입력 7 36 3 9 70 15 13 19 20 11예제 출력 3🧑🏻💻 풀이 과정 CTP 회원들의 볼펜의 수를 내림차순 정렬하자. 입력받은 총 회원의 수를 구하자(m * k) 정렬된 볼벤의 수를 반복하며, 빌려줄 펜의 수(pen_sum)보다 총 회원의 수(total_member_sum)가 더 많다면, pen_sum에 볼펜의 수를 더하고 cnt를 1 증가시키자. 반복을 마치고 펜이 부족하면 STRESS, 부족하지 않으면 cnt를 출력하자. def iupc(arr): # 총 회원 수 total_member_sum = m * k # 회원이 빌려줄 수 있는 볼펜의 수 pen_sum = 0 # 볼펜을 빌려줄 회원의 수 cnt = 0 for i in arr: # 빌려줄 펜의 수보다 총 회..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/choQFD/btrJZIoX0Bl/NHSFKhFOeCZzMyGhHs1h8k/img.png)
IPC (Inter Process Communication) 프로세스는 각자 자신만의 독립적인 주소공간을 갖기 때문에, 다른 프로세스가 이 주소공간을 참조하는 것은 불가능하다. 그러므로 다른 프로세스와 데이터를 주고 받을 수 없다. 하지만, 운영체제는 IPC기법을 통해 프로세스들 간에 통신이 가능하게 해준다. IPC는 크게 공유 메모리 방식과 메시지 전달방식으로 나뉘어진다. 공유 메모리 (shared memory) 공유 메모리 방식에서는 프로세스들이 주소 공간의 일부를 공유하는데, 이 공유한 메모리 영역에 read/write를 통해서 통신을 수행한다. 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해준다. 공유 메모리 영역이 구축된 이후에는 모든 접근이 일반적인 ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bH8hcf/btrJ2mLpdvR/2yvPKkk4X81dRIYNAQ9ncK/img.png)
Thread & Multi Thread 쓰레드는 한 프로세스 내에서 실행되는 동작(function)의 단위이다. 각 쓰레드는 속해있는 프로세스의 Stack 메모리를 제외한 나머지 memory 영역을 공유할 수 있다. 멀티 쓰레드란, 하나의 프로세스가 동시에 여러 개의 일을 수행할 수 있도록 해주는 것이다. 즉, 하나의 프로세스에서(실행된 하나의 프로그램) 여러 작업을 병렬로 처리하기 위헤서 멀티 쓰레드를 사용한다. 멀티 쓰레드에서는 한 프로세스 내에 여러 개의 thread가 있고, 각 쓰레드들은 Stack 메모리를 제외한 나머지 영역(Code, Data, Heap) 영역을 공유한다. Stack memory & PC Register 쓰레드가 함수를 호출하기 위해서는 인자 전달, Return Address ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/xz3ok/btrJWM4FG8Y/uWsINfqL64kRHlxu4Haqi0/img.png)
Milti Process Milti Process란 2개 이상의 프로세스가 동시에 실행되는 것을 말한다. 이 때 프로세스들은 CPU와 메모리를 공유하게 된다. memory의 경우에는 여러 프로세스들이 각자의 memory영역을 차지하여 동시에 적재되는데, 하나의 CPU는 매 순간 하나의 프로세스만 연산이 가능하다. 하지만 CPU의 처리 속도는 상당히 빠르기 때문에 여러 프로세스들이 CPU에서 번갈아 실행되어도 사용자 입장에서는 마치 여러 프로그램이 동시에 실행되는 것처럼 느껴진다. 이처럼 CPU의 작업시간을 여러 프로세스들이 조금씩 나누어 쓰는 시스템을 시분할 시스템(time sharing system)이라고 한다. 메모리 관리 여러 프로세스가 동시에 memory에 적재된 경우, 서로 다른 프로세스의 영역..
- Total
- Today
- Yesterday
- 스프링부트
- 구현
- webflux
- leetcode
- 파이썬
- Spring
- 코테
- 노마드코더
- 그리디
- 노마드
- 데이터베이스
- kotlin
- 김영한
- 백준
- 코틀린
- 알고리즘
- 스프링
- 북클럽
- MySQL
- 릿코드
- 리팩토링
- 문자열
- spring boot
- Algorithm
- 스프링 부트
- 자료구조
- Real MySQL
- 정렬
- mysql 8.0
- 인프런
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |