개요 Spring을 사용을 하든 안하든 우리는 프로그램을 만들어가면서 Entity → Dto, Dto → Entity 변환을 많이 사용하게 되는데 다음과 같은 행위를 객체 Mapping이라 한다. 이러한 객체 Mapping 행위를 손쉽게 할 수 있도록 이미 많은 객체 Mapping라이브러리가 존재하며, 종류는 Jackson의 ObjectMapper, ObjectUtils, JMapper등 여러개가 존재한다. 그렇다면 이 많은 것들 중에서 어떤 것을 써야할까?? 개발의 편의성을 고려한다면 ObjectMapper, ObjectUtils등 별도의 설정이나 코딩이 없는 것을 사용하는게 편할 것이다. 하지만 다음 링크를 보면 알 수 있듯이 MapStruct와 JMapper 두개의 퍼포먼스가 빠른 것을 확인 할 수..
얼마전 회사에서 개발한 Spring으로 구현 된 REST API, Apache web server에서 php로 돌아가는 서비스, expressJS로 돌아가는 서비스, Netty로 동작하고 있는 실시간 Push 서버에 동일한 보안 로직을 적용하기 위한 프로젝트를 진행하였다. 기존에는 각각의 보안 정책을 가지고 있어서 관리하기가 힘들고 또 여러개의 보안 프레임워크와 독자적으로 개발된 보안 로직을 관리 해야 했다. 서비스 되는 서비스들의 크기가 크지 않을 때는 이러한 방법이 편리할 수도 (?) 있겠지만, 이미 우리는 상당히 꽤 많은 프로젝트 들이 생겨 버려서 더 이상은 프로젝트 별 보안 로직을 관리하기가 힘들어 졌다. 그래서 프로젝트 별로 동일하게 적용되는 보안 정책과 개별 정책들을 모아서 하나의 보안 서버를..
[서론] 이번 개발을 진행하면서 IndexedDB를 사용하게 되었다. 그 이유는 서버로부터 많은 데이터를 받아오게 되는 우리 서비스 환경상 계속해서 서버로 부터 많은 데이터를 계속해서 가져가면 조회 속도에 문제가 발생하여 이를 개선하고자 IndexedDB를 사용하게 되었다. 이번 포스팅에서는 IndexedDB를 사용하면서 내가 실수 했던 두가지에 대해서 포스팅 할 것이다. 전체적인 소스코드는 별도로 공유하지 않습니다. [문제점] 1. indexedDB에서 데이터를 넣고 조회하는 작업이 모두 비동기라는 점 2. getAll() 메소드가 많은 데이터를 호출 할 때는 동작하지 않았던 점 위 두가지가 내가 실수 했던 요소 두가지이며 어떻게 해결 했는지에 대해서 공유한다. getAll()이 동작하지 않는 부분에서..
지금까지 책들을 읽어오면서 책에 대한 글을 블로그로 남기는 것은 이번이 첨인거 같다. 앞으로는 읽고 좋은 책에 대해서는 느낀점을 적어 보려 한다. 우선 이 책은 딥러닝의 근본인 신경망에 대해서 설명해 간다. 신경망을 설명하기 전에 퍼셉트론이라는 이론 및 구현을 시작으로 하여 신경망에 대한 설명 및 구현을 하는데, 구현은 어렵지 않은 수준으로 잘 설명하고 있다. 여기서 중요한거는 이 책에서 구현한 소스코드 보다 어떻게 신경망이 동작하는지 이해 하는것이 중요한 포인트라는 느낌을 받았다. 신경망이 어떻게 학습되고 이 학습이란 개념이 어떤 것이며 어떻게 학습 되는지를 이해도 하지 못한채 책에서 제공하는 소스코드만 무작정 따라 친다고 도움이 될 것이 없다는 말이다. 나는 이 책을 읽기 전부터도 딥러닝에 대해서 듣..
서론최근 하나의 회사가 제공하는 서비스의 규모가 커지고 복잡해지면서 이 서비스를 지탱하기 위해서 큰 서비스를 여러 개의 작은 서비스로 나누고 개발, 배포 하는 Micro Service Architectur(이하: MSA) 가 유행하고 있다. 이렇게 MSA에서는 각 서비스들은 독립적이며 자신을 Restful API로 자신을 노출 시킨다. MSA에서 각 서비스들은 서로 독립적 이기는 하나 그렇지 못한 부분들이 존재 할 수 있다. 예를 들어 사용자의 인증 및 권한 부여 같은 경우 서비스들의 독립성을 위해 각 서비스 마다 구현 또는 라이브러리를 넣고 사용 할 수 있지만 이렇게 되면 개발 언어마다 사용자 인증, 권한부여 로직을 구현을 해야 하며 관리 또한 복잡하게 된다. 그래서 인증 및 권한 부여 서비스를 따로 ..
소개 인접한 두 수를 비교하면서 대소 비교에 적합한 수를 뒤로 보내는 알고리즘이다. 평균적으로 시간 복잡도는 $O(n^2)$를 나타낸다. 설명현재 인덱스의 바로 다음번 인덱스와의 크기를 비교해서 조건에 맞다면 위치를 옮겨준다. 여기서 조건은 대소 비교의 조건이다.비교하면서 한 번 순회를 끝내면 순회 시 제일 마지막 인덱스는 자연스럽게 제일 크거나 작은 값이다. 다음번 순회에서는 최종 인덱스 까지 순회할 필요 없다. 즉 순회마다 -1만큼 순회할 크기가 줄어 드는 것이다. 시간 복잡도 계산 전체 원소의 수가 $n$ 개라면 $(n-1) + (n-2) + ... + 2 + 1 = (n - 1) * n / 2 = (n^2-n)/2$의 값을 연산을 하게 될 것이다. 그래서 평균적인 시간 복잡도는 $O(n^2)$ 이..
소개특정 인덱스 값의 값을 남은 값들을 순회 하면서 가장 크거나 작은 값으로 바꾸는 정렬 알고리즘으로, 메모리가 제한적인 경우 사용하면 성능 상 이점이 있는 알고리즘이다.설명1. 주어진 데이터의 첫번째 인덱스의 값을 첫번째를 제외한 나머지 데이터 중에서 가장 크거나 작은 값으로 변경한다2. 순회를 끝내면 인덱스 값을 증가 시켜서 나머지 데이터 중에서 가장 크거나 작은 값으로 변경한다. 3. 위의 동작을 순회가 끝날때 까지 반복한다.시간복잡도선택정렬 또한 순회를 할 때마다 -1씩 순회 할 데이터 양이 줄어 든다. 그러면 다음과 같은 수식을 얻을 수 있게 된다. $(n-1) + (n-2) + ... + 2 + 1 = (n - 1) * n / 2 = (n^2-n)/2$ 그래서 선택정렬의 시간 복잡도는 $O(n..
소개최적해를 구하는 데에 사용되는 근사적인 방법, 여러 경우 중 하나를 결정해야 할 때마다 그 순간에 최적이라고 생각되는 것을 선택해나가는 방식이다. 여기서 중요한 것은 선택들을 계속 수집해서 최종적인 해답을 얻었을 경우 이 해답이 최적의 답이라는 보장은 없다. 탐욕 알고리즘은 동적알고리즘이 지나치게 많은 일을 한다는 것에 착안되어 만들어진 알고리즘이다.적용이 잘되는 경우1. Greedy Choice Property (탐욕 선택 조건)앞의 선택이 이후 선택에 영향을 주지 않는 경우를 적용이 잘된다. 즉, 각 사건들이 서로 독립적일 때 잘 맞는다. 2. Optimal Substructure (최적 부분 구조 조건)문제에 대한 최적해가 부분 문제에 대해서도 최적인 경우대표적인 해결 문제1. 배낭 문제2. 동..
HashTable 사용 저번 포스팅에서 HashTable을 구현 해보았다. 다소 많이 부족한 소스이지만 이번 포스팅에서는 해당 HashTable을 사용하여 알고리즘 문제를 하나 풀어보려고 한다. 본 문제는 https://programmers.co.kr/learn/courses/30/lessons/42576 해당 링크에서 풀어 볼 수 있다. 해당 문제는 해시로 풀어 낼 수 있어서 이전에 구현 했던 HashTable을 사용해 보았다. 해당 문제를 해시로 풀 수 있는 이유는 각 선수들의 이름을 키로 해쉬 테이블을 구성 한 뒤 찾으면서 찾은 선수들을 지워가면서 지워지지 않는 선수는 완주를 하지 못한 사람임이 보장되기 때문이다. 여기서 솔루션 부분을 구현해야 했는데 솔루션 클래스의 내용은 아래와 같고, 나머지 H..
해쉬 알고리즘이란?? 키 값을 입력 받아서 해쉬 테이블의 주소가 되는 값을 반환해주는 함수 해쉬 테이블이란?? Key & Value로 이루어진 테이블 형태의 자료 구조로서 Key값이 Hash 함수를 거쳐 나온 Hash 값을 테이블 상의 저장 주소로 사용한다. 해쉬 값은 최대한 중복이 발생 되지 않는게 좋겠지만 현실적으로 불가능 하며 이것을 해결 하기 위한 방법들이 몇 가지 있다. 해쉬 테이블 충돌 해결 방법 위 그림처럼 키 값은 다르지만 Hash함수를 거치고 난 뒤의 해쉬 값이 동일하여 충돌이 발생하는 경우에는 데이터를 안전하게 저장하고 관리하기 위해서 충돌에 대한 해결을 해주어햐 하며 2가지가 존재한다. Separate Chaining 방식 이 방법은 Linked List를 사용하는 방법이다. 인덱스에..