개발 일지

Lazy Loading Lazy Loading은 관련된 엔티티를 실제로 필요할 때까지 로딩하지 않는 방식입니다.특징연관된 엔티티가 실제로 접근될 때까지 데이터베이스에서 조회되지 않습니다.프록시 객체를 사용하여 연관된 엔티티를 참조합니다.장점초기 로딩 시 불필요한 데이터를 로딩하지 않으므로 성능이 향상될 수 있습니다.메모리 사용량을 줄일 수 있습니다.불필요한 데이터베이스 쿼리를 줄일 수 있습니다.단점관련 데이터를 접근할 때 추가적인 데이터베이스 쿼리가 발생할 수 있습니다.복잡한 경우, N+1 문제를 초래할 수 있습니다.프록시 객체를 사용할 때 예상치 못한 동작이 발생할 수 있습니다. Eager Loading Eager Loading은 관련된 엔티티를 즉시 로딩하는 방식입니다.특징엔티티가 조회될 때 연관된 ..
· 프로젝트
프로젝트를 진행하다가 오류를 어떻게 처리할지에 대해 이야기가 나왔었는데 전에 있던 프로젝트에선 그냥 기본적으로 제공해주는 오류 처리 형식을 썼었다.throw new IllegalArgumentException("오류 메세지");하지만 이렇게 할 경우에 오류가 발생할 경우 {"status" : 500, "error" : "Internal Server Error"}와 같은 형식으로 뜨며 어느 부분에서 문제가 생기는지 정확히 알 수 없다. 이를 어떤식으로 해결할지 의논하다가 ErrorType을 enum으로 만들어 전체적인 총괄을 하기로 했다....public enum ErrorType {... //reply NOT_FOUND_REPLY(HttpStatus.NOT_FOUND, "해당하는 댓글이 없습니다."..
· 문제풀이
SCPC 2015 1차 예선문제더보기 일직선 상에 돌들이 놓여있고, 개구리가 처음에는 '좌표 0'에 위치한 돌 위에 앉아 있다.'좌표 0'에는 돌이 항상 놓여 있고, 모든 돌들은 정수 좌표에 놓여 있다. (그림 1) 개구리는 점프를 통해서 돌들 사이를 이동해서 마지막 돌까지 이동해야 한다.이 때, 개구리가 한번의 점프로 이동 가능한 최대 거리 K 가 주어진다.개구리는 한번의 점프로 자신이 앉아 있던 돌에서  K 이하의 거리에 위치한 돌들 중 하나의 돌로 이동 할 수 있다. 여기서 문제는, '좌표 0'에 위치한 개구리가 마지막 돌까지 이동할 수 있다면,마지막 돌까지 이동하기 위한 최소 점프 횟수를 계산하는 것이다. 예를 들어서, 위의 "그림1"의 예에서 보면, 한번의 점프로 이동 가능한 최대 거리가 K=..
· 프로젝트
새로운 프로젝트에 참여하려고 보니 깃허브에서 다음과 같은 메세지를 띄워준다...찾아보니 이메일로 사유를 보내준다는데 아무런 이메일도 와있지 않고 인텔리제이에서 연동하려고 하니"You are marked as spam, and therefore cannot authorize a third party application." 이라고 뜨며 사용이 안된다.바로 Github Support에 문의를 보냈다. 빨리 해결이 되어야 프로젝트에 참여할 수 있을텐데 길면 7일까지도 걸린다고 한다...살려줘
· Clean Code
르블랑의 법칙나중은 결코 오지 않는다. 나쁜 코드의 대가나쁜 코드가 쌓일수록 생산성이 떨어진다. 이를 증가시키기 위해 새로운 인력을 투입하지만 새로운 인력은 기존의 시스템에 대한 조예가 깊지 않고 결국 더 많은 나쁜 코드를 생성한다.원대한 재설계의 꿈 : 시스템을 재설계하려는 팀과 기존의 시스템을 유지보수하는 팀이 있다면 그들은 끊임없는 레이스를 하게 되며 재설계하려는 팀이 기존의 시스템을 따라잡을 즈음이면 기존 팀원들이 모두 떠나고 새 인력이 들어와 새 시스템을 설계하자고 나선다. 결국 재설계가 반복된다.태도 : 일정이 아무리 빠듯해도, 요구사항이 아무리 어려워도 좋은 코드를 사수하는 것은 프로그래머들의 책임이다. 나쁜 코드의 위험을 이해하지 못하는 관리자 말을 그대로 따르는 행동은 전문가답지 못하다...
· 알고리즘
Q : Write a query to print all prime numbers less than or equal to 1000 . Print your result on a single line, and use the ampersand ( & ) character as your separator (instead of a space).For example, the output for all prime numbers  would be: 2&3&5&7문제 : 1000 과 같거나 작은 모든 소수를 출력하는 쿼리문을 작성하시오. 한 줄에 출력하되 숫자간 구분은 문자 '&' 을 사용하시오. 예를 들어 10보다 작은 소수를 출력하면 2&3&5&7 이 출력되어야 합니다. 간단히 재귀 함수를 떠올려서 이를 쿼리문으로 바..
· 알고리즘
Convex Hull 알고리즘은 2차원 평면에 여러 개의 점이 주어졌을 때 모든 점을 포함하는 볼록 껍질을 이루는 점들을 구하는 알고리즘입니다. 이 알고리즘의 구현에는 CCW 알고리즘이 사용됩니다.이 알고리즘의 구현 방법은 Graham’s scan이라는 방법을 사용합니다. 이 방법의 순서는 다음과 같습니다.(1) 2차원 평면의 점들을 정렬하고 가장 아래에 있는 점 P0를 고르고 스택에 넣습니다.(여러 개일 경우 가장 왼쪽에 있는 점)(2) 해당 점과 나머지 점들의 기울기를 구해 x축과의 각도를 구합니다.(3) 해당 각도를 기준으로 오름차순 정렬합니다.(4) P0와 각도가 가장 작은 P1과 그 다음으로 작은 P2를 고릅니다. P0, P1, P2에 대해서 CCW 알고리즘을 사용하고 만약에 양수 값(반시계방향..
· 알고리즘
1. Network Flow란유량 그래프란 간선의 가중치가 정점에서 정점으로 보낼 수 있는 최대 유량을 의미하는 그래프입니다. 최대 유량이란 해당 간선을 통해 동시에 흘려보낼 수 있는 물의 최대치입니다. 이러한 유량 그래프에서 Source로 정의된 정점에서 Sink로 정의된 정점까지 최대 얼마만큼의 유량이 지나갈 수 있는지에 관한 문제를 Network Flow 혹은 Maximum Flow라고 정의합니다. 아래는 유량 그래프의 예시입니다.각 간선을 유한 번 사용할 수 있는 통로라고 생각하고, 한 사람이 통로를 지나가면 사용할 수 있는 횟수가 한 번 줄어드는 문제를 생각해봅시다. 이때 무한히 많은 사람들이 Source에서 출발할 때, 최종적으로 Sink에 도달할 수 있는 사람의 수는 최대 몇 명일까요? 사람..
· 프로젝트
KPTKeep 초반 회의 때 원활한 소통과 적극적인 자세로 다른 팀들보다 빠른 역할 분담, 와이어프레임이나 erd 작성이 순조로웠던 점이 좋았습니다. Github를 통한 협업 및 버전관리를 수행했다는 점이 만족스러웠습니다. 보안에 관한 요구 사항을 엄밀하게 준수한 내용이 좋았습니다. 진행하면서 서로 도와주고 배려해주고 원활한 의사소통을 통해 팀원들간의 협업 및 과제 수행이 잘 진행되어 좋았습니다. 민감 데이터를 환경변수화 하고, 고유 DB를 만들어서 사용한 부분이 좋았습니다. 코드 병합하는 부분에서 모르거나 이해가 안가는 부분이 있으면 질문을 계속 해주시는 부분이 좋았다. 데이터가 그대로 노출되는 것에 대해 생각을 전혀 하지 못했는데 관련된 아이디어를 공유 받아서 좋았다.  Problem 초반에 ..
· 알고리즘
슬라이딩 윈도우(Sliding Window) 알고리즘은 투 포인터(Two Pointers) 알고리즘과 유사하게 동작하지만, 두 개의 포인터 사이의 길이가 고정되어 있다는 차이점이 존재합니다.위의 그림과 같이 모든 영역을 고정된 영역을 만든 후, 한 칸씩 밀면서 테스팅 해보는 방법입니다.이를 통해 길이가 고정된 모든 연속 부분집합들의 누적합, 최댓값, 최솟값을 구할 수 있습니다.간단히 누적합을 생각해보면, 윈도우를 한 칸 밀 때마다 기존 윈도우의 합에서 윈도우의 오른쪽 방향의 값을 더하고 윈도우에서 빠진 한 칸을 빼주면 각 창마다의 누적합을 구할 수 있습니다.이 경우의 시간 복잡도는 O(N)이 됩니다.길이가 고정된 모든 연속 부분집합들의 최댓값을 구하는 방법은 우선순위큐(Priority Queue, 또는 ..
· 알고리즘
투 포인터(Two Pointers) 알고리즘은 주로 순차적 접근이 요구되는 조건 등의 특수한 경우에 사용되는 알고리즘입니다.예를 들면, 정렬된 두 배열이 주어질 때 두 배열을 하나의 정렬된 배열로 합치는 경우, 어떤 배열의 연속 부분집합(contiguous subarray)의 원소의 합이 k인 경우의 수를 찾는 경우 등이 있습니다.투 포인터 알고리즘의 기본 동작원리는 이름 그대로 두 개의 지점(포인터)를 옮겨가면서 구하고자 하는 답을 구하는 것입니다.정렬된 두 개의 배열 A, B가 주어집니다. 이를 정렬된 하나의 배열로 합치는 문제를 투 포인터 알고리즘으로 해결해보겠습니다.이미 정렬이 되었기 때문에, 각 배열의 0번지는 각 배열의 최솟값이 있습니다.합친 배열의 0번지에는 A[0]과 B[0]중 작은 값이 ..
· 알고리즘
1. 경우의수경우의 수란 '일어날 수 있는 사건의 가짓수'입니다. 예를 들어 정육면체 주사위를 던져서 나올 수 있는 경우의 수는 {1, 2, 3, 4, 5, 6}의 6가지가 있습니다. 이때 '정육면체 주사위를 던지는 사건'은 6개의 경우의 수를 가집니다. 이를 확장시켜보면, 정육면체 주사위 두 개를 던졌을 때 합이 3이 되는 경우의 수는 두 주사위의 눈이 (1, 2)거나 (2, 1)일 때의 2가지가 됩니다. 이는 ‘정육면체 주사위 두 개를 던졌을 때 합이 3이 되는 사건'은 2개의 경우의 수를 가진다는 말과 같습니다.N개의 경우의 수를 가진 사건 A와 M개의 경우의 수를 가진 사건 B가 있을 때를 생각해봅시다. 두 개의 사건은 따로 일어나거나, 동시에 일어날 수 있습니다. 먼저 두 개의 사건이 따로 일어..
· 알고리즘
플레인 스위핑(Plane sweeping)은 직각 도형의 넓이를 구할 때 주로 쓰이는 알고리즘입니다.작은 범위는 flood-fill 을 사용하여 배열을 원하는 격자만큼 그린 후, 도형의 넓이를 직접 배열에 칠해가며 해결할 수 있지만, 범위가 커진다면 메모리와 시간 모두 문제가 생기기 때문에 다른 방법을 찾아야만 합니다. 플레인 스위핑은 이를 해결할 수 있는 방법 중 하나입니다.먼저 2개의 직사각형의 그림자의 넓이를 구해보겠습니다. 먼저 직사각형은 왼쪽 아래와 오른쪽 위 두 점으로 주어집니다. 두 개의 직사각형은 겹친 부분이 있기 때문에, 단순 공식에 의한 직사각형 넓이의 합으로 구하기 어렵습니다.플레인 스위핑은 위 문제에서 사용되는 좌표들은 한정됨을 이용합니다.각 직사각형들은 4개의 꼭짓점을 가지고, 이..
· 알고리즘
CCW 알고리즘은 한 선과 한 점의 위치 관계를 구할 때 사용하는 알고리즘입니다. 한 선분 AB와 점 C가 일직선 상에 있는지, 반시계 방향에 있는지, 시계방향에 있는지를 알려줍니다. 이 알고리즘은 기하 문제를 푸는데 사용이 되며 이 알고리즘을 이용하는 알고리즘에는 대표적으로 Convex Hull이라는 알고리즘이 있습니다. 이 알고리즘의 구현 방법은 점 A, B, C에서 AB와 BC 벡터의 외적을 통해 음수 값이 나오면 시계 방향, 0값이 나오면 일직선, 양수 값이 나오면 반시계 방향으로 판단하는 것입니다. 두 벡터의 외적은 두 벡터 Vx={Xx,Xy}, Vy={Yx,Yy}라고 했을 때 Xx*Yy-Xy*Yx입니다. 따라서 점 A, B, C가 A(x1,y1), B(x2,y2), C(x3,y3)라면 CCW값..
· 알고리즘
두 그룹으로 구분된 정점과, 서로 다른 그룹의 정점을 연결하는 간선들로 이루어진 그래프를 이분 그래프(Bipartite Graph)라고 합니다. 그룹 A에 속하는 정점 Ai와 그룹 B에 속하는 정점 Bj를 연결하는 간선 (Ai, Bj)을 선택하는 것을 매칭이라고 합니다. 이때 모든 정점은 단 하나의 매칭에만 속해야 합니다. 즉, 선택한 모든 매칭은 같은 정점이 중복되어서는 안 됩니다. 최대 매칭이란 이분그래프에서 선택할 수 있는 매칭의 최대 개수를 의미합니다. 이러한 문제를 이분매칭(Bipartite Matching) 혹은 최대이분매칭(Maximum Bipartite Matching)이라고 합니다.위는 이분그래프의 예제입니다. 오른쪽 그래프에서 파란색으로 칠해진 것보다 많은 간선을 주어진 조건에 맞도록 ..
fenec_fox
'분류 전체보기' 카테고리의 글 목록