전체 글429 자바(Java) Map의 동작원리 Map의 기본적인 내용은 이전에 정리했으니 동작 원리에 대해 정리한다. Map은 내부적인 저장을 배열을 이용하여 저장한다. Key를 해시함수에 적용하여 나온 값을 이용해 인덱스를 지정한다. Map은 메모리를 절약하기 위해 처음부터 많은 공간을 차지하고 있지 않고 데이터가 일정이상 늘어나면 그때 배열의 크기를 2배로 늘리는 방식으로 진행한다. Java에서 해시 버킷의 크기를 확장하는 임계점은 load factor * 현재의 해시 버킷 개수이며, load factor는 0.75이다. 즉 3/4를 넘어가면 확장하게 된다. 배열의 초기 사이즈는 2^4(16)개이며 최대 버킷의 개수는 2^30이다. 인덱스를 구할때는 해시값을 배열의 크기인 M으로 모듈러 연산을 해서 구하게 된다. java의 경우 int를 사용하여.. 프로그래밍언어/Java 2021. 10. 26. Java Collection FrameWork(JCF)란? 왜 나오게 되었을까? 예전에는 자료구조를 이용할 때 같은 역할이나 목적이 같지만 구현체의 메서드명이 달라 여러움을 느꼈다. (Vector, Array, HashTable) 즉, 확장이 쉽지 않았으며, 표준 인터페이스를 구현하지 않다. 이러한 부분을 해결하기 위해 JCF가 나오게 되었다. JDK 1.2 버전부터 나왔다. 그래서 JCF가 먼데? 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합이다. 간단히 생각하면 자료구조 모음이라고 생각해도 될 것 같다. JCF의 계층 구조 크게 Iterable을 상속한 인터페이스와 Map을 상속한 인터페이스로 나눌 수 있다. Iterable에 포함된 인터페이스는 List, Queue, Set이다. List ArrayList : 크기가.. 프로그래밍언어/Java 2021. 10. 25. 자바(Java) 왜 for-each문을 추천할까? 인텔리제이에서 for문으로 작성하다보면 List와 같은 경우는 인덱스를 따로 쓰지 않는이상 for-each문으로 바꾸라고 경고를 한다. private static void test(List numbers) { for (int i = 0; i < numbers.size(); i++) { System.out.println(numbers.get(i)); } } 'for' loop replaceable with enhanced 'for' 왜 그럴까? 그것은 자료구조의 변경을 유연하게 하기위해 인터페이스로 객체를 사용하고 있기 때문이다. 인자로 들어오는 List가 ArrayList인지 LinkedList인지 Vector인지 Stack인지 알 수 없다. 여기서 발생하는 문제점은 바로 List에서 사용하는 get().. 프로그래밍언어/Java 2021. 8. 25. [Spring, Java] 멀티스레드 적용기 서비스를 만들며 가장 컸던 문제점은 중간지점을 찾기위한 탐색시간이 오래걸린다는 부분이다. 내부적으로 살펴보면 탐색지점을 찾기위해 추천할만한 역들의 리스트를 뽑고, 외부 API를 통해서 출발점과 도착역까지 걸리는 시간을 구하는 부분에서 시간이 오래걸리는 부분이었다. 모든 알고리즘을 적용하고 나니 걸렸던 시간은 대략 1분이었다. 정확한 지점을 찾기위한 로직이 추가되다 보니 시간이 많이 늘어나게 된것이다. 그렇지만 1분이라는 시간... 사용자 입장에서는 짧은시간이 아니다. 이러한 문제로 인해 여러가지 의견이 나오게 되었다. 정확하지 않아도 괜찮으니 로직을 빼서 시간을 단축하자. 우리 서비스의 아이덴티티인데 정확하지 않은것보다 낫지않냐? 그래서 둘의 타협점을 찾기위해 하루 정도의 시간을 두고 최적화를 해보고 그.. 프레임워크/Spring 2021. 8. 25. 컨테이너와 가상환경이랑 차이점은? 둘의 사용처는 독립된 공간에서 작업을 하고싶을때 사용한다는 것이다. 그렇다면 결과는 같은게 내부적으로는 어떤것이 다를까? 가상환경 하이퍼 바이저는 가상화 기술을 통해 여러개의 운영체제를 하올려 사용할 수 있도록 도와주는 스포트웨어이다. 하이퍼 바이저 위에 올라가서 독립적으로 돌아가는 여러개의 운영체제들을 가상머신이라는 단위로 구분한다. 가상환경(가상머신)의 단점 : Guest OS를 각각 이용하면서 모든 OS마다 라이브러리, 커널등을 전부 포함하고 있으며 운영체제가 동작하기 위한 기능들이 모두 포함되어 있기때문에 자원의 소모가 크며 느리다. 또한 배포하기 위한 용량이 커지게 된다. 하이퍼바이저를 통해 작업을 하며 성능손실 또한 발생한다고 한다. 컨테이너 가상환경의 단점을 줄이기 위해 나오게 되었다. Gu.. 기타 2021. 8. 25. 도커(Docker)란? 도커는 언제 적용할까? 도커란? 도커는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하과 관리하는 오픈 소스 프로젝트이다. 도커는 왜 나오게 되었을까? 기존에는 프로세스를 격리하기 위해 가상환경을 이용했는데 이러한 방법은 많은 리소스를 차지하고 무겁기 때문에 경량화가 필요했고 경량화를 적용한 컨테이너를 이용하는 것이 도커이다. 왜 사용해야 할까? 내가 생각하는 사용이유는 환경을 통일하는데 있다. 서비스를 만들때 환경에 따른 영향을 받을 수밖에 없다. 그래서 같은 코드에 같은 패키지를 설치하더라도 어디서는 동작하고 어디서는 동작을 하지 않을 수 있다. 또한 이미지를 이용하여 모든 종속성에 관련된 패키지들을 한번에 설치가 가능하다. 언제 적용해야 할까? 서비스환경와 개발환경이 다를때(window, lin.. 기타 2021. 8. 25. Redis란 무엇인가? Remote Dictionary Server의 약자이다. 풀이하면 외부에서 딕셔너리(Key-Value)를 이용하는 서버이다. Redis는 하드에 데이터를 저장하지 않고 Inmemory Data Structure Store 메모리상에 데이터를 저장한다. DataBase보다 더 빠른 Memory에서 더 자주 접근하고 덜 자주 바뀌는 데이터를 저장하자는 취지에서 나오게 되었다. Redis는 다양한 자료구조(Collections)를 지원한다 Redis는 왜 사용할까? 서버에서도 로컬캐시나 Map과 같은 자료구조를 통해서 캐싱을 시도할 수 있다. 그런데 왜 Redis와 같은 캐시서버를 사용할까? 분산처리 환경에서 Local 캐시의 경우 일관성이 없을 수 있으며, 일관성이 보장된다고 하더라도 각 서버마다 각각 캐싱.. 기타 2021. 8. 24. 캐시(Cache)란 무엇인가? 캐시는 데이터나 값을 미리 복사해 놓은 임시저장소이다. 캐시는 언제 적용해야 할까? 원본 데이터에 접근하는데 시간이 오래걸리거나 값을 계산하는데 시간이 오래걸리는 경우 캐시를 적용하면 처음에는 같은 시간이 걸리지만 똑같은 값을 다시 요청하면 한번에 응답이 가능하다. 이번에 만든 서비스의 경우 특정역에서 특정역까지 걸리는 시간 구하기 위해 1초정도의 시간이 걸리게 된다. 그렇지만 캐시를 적용하게 되면 걸리는 시간은 매우 줄어든다. 캐시는 어떻게 적용하면 좋을까? 캐시는 같은 값을 넣었을때 효과가 있다. 그렇다면 여기에서 힌트를 얻을 수 있다. 우리가 자주 사용하는 데이터에 캐시를 적용하면 되는것이다. 자주 사용되지 않는다면 캐싱을 해두더라도 요청이 들어오지 않기때문에 의미가 없을것이다. 예를들어서 A라는 .. 기타 2021. 8. 24. [Spring] @Qualifier란 무엇인가? Spring을 이용하여 서비스를 만들다보면 필연적으로 Bean을 만들어 등록하는 일이 생기게 된다. 스프링의 강력한 기능중 하나인 Autowired를 이용하여 의존성을 주입받는데, Bean에 하나의 타입만 있다면 해당객체를 주입받지만 만약 같은 타입이면 문제가 발생한다. Qualifier를 왜 사용해야 할까?? 내 상황의 경우 WebClinet를 Bean으로 등록했는데 요청해야 할 url이 많아서 여러개의 WebClient를 등록하면서 문제가 발생하였다.(카카오, 네이버, 공공API 등) 물론 그때그때 생성해서 쓰면되지만 자주 사용하고 재사용이 가능하다면 방법을 찾아야 하지 않을까? 이러한 문제를 해결하기 위해서 @Quailifer를 이용하게 된다. 특정한 객체를 찾기위한 이름을 지정한다고 생각하면 된다.. 프레임워크/Spring 2021. 8. 24. [Spring] RestDocs와 Swagger 프론트와 같이 협업을 하면서 API문서를 제공해야 하는 상황이 왔다. 처음에는 Notion에 하나하나 작성하였으나 API가 수정되었을때 변경하지 않아 불일치 되는 경우가 생기게 되었다. 이러한 문제를 해결하기 위해 문서 자동화를 도입하게 되었다. Spring에서 유명한 Swagger와 RestDocs중 어떤것을 도입할지 고민하기 위해 찾아보았다. Spring Rest Docs Swagger 장점 제품코드에 영향 없다. API 를 테스트 해 볼수 있는 화면을 제공한다. 테스트가 성공해야 문서작성된다. 적용하기 쉽다. 단점 적용하기 어렵다. 제품코드에 어노테이션 추가해야한다. 제품코드와 동기화가 안될수 있다. Swagger는 적용하기 쉽지만 컨트롤러에 어노테이션을 추가해야 하며 실제로 동작을 하지 않을 수도.. 프레임워크/Spring 2021. 8. 24. 블록킹/논블록킹, 동기/비동기 면접에서 자주나오는 질문중 하나이다. 또한 서비스를 만들다보면 해당 개념을 가지고 처리를 하는 경우가 생긴다. 비슷하면서도 비슷하지 않은 두개때문에 헷갈릴때가 많다. Blocking : 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것 Non-Blocking : 다른 주체의 작업에 관련없이 자신의 작업을 하는 것 Synchronous : 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작 Asynchronous : 시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음 각각의 정의만 보면 매우 어렵다. 4가지 경우를 조합하여 각각의 상황을 확인해보자. Blocking / Synchronous 블록킹이기 때문에 제어권이.. 이론공부/운영체제 2021. 8. 23. 웹훅(Webhook)이란 무엇인가? 서비스를 만들다 보면 어디에서 무슨일이 일어나고 있는지 알아야 할때가 있다. 백엔드 개발자가 겪을 수 있는 예로는 CI/CD를 들 수 있다. 깃허브에 코드가 업데이트 되었는지 알고싶다면 어떻게 해야할까? 계속 요청을 보내서(polling 방식) 코드가 바뀌었는지 확인을 해야할까? 그렇다면 깃허브 서버에 부담이 늘어날 것이다. 또한 바뀌는 잠깐을 확인하기 위해서 계속해서 요청을 보내는 것 역시 매우 비효율적이다. 이러한 문제를 해결하기 위해 Webhook을 이용한다. Webhook이란 특정 이벤트가 발생하였을때 타 서비스 혹은 응용프로그램으로 알림을 보내는 기능이다. 즉, 깃허브에서 코드가 업데이트가 되었다면 CI/CD를 담당하는 Jenkins서버에 요청을 내고, Jenkins서버는 깃허브에서 코드를 가져.. 이론공부/네트워크통신 2021. 8. 23. 이전 1 ··· 4 5 6 7 8 9 10 ··· 36 다음 💲 광고입니다.