본문 바로가기

분류 전체보기

(125)
JPA에서 Geometry 타입 데이터 저장하기 무엇을 구현할 것인가? 사용자의 위치에 따라 가까운 거리의 정보부터 보여주기 위해 좌표 값을 저장해야 함. 왜 구현할 것인가? DB 컬럼에 직접 double 데이터를 넣어 좌표계를 만들고 애플리케이션에서 정렬하는 방법이 있지만, RDB에서 이미 공간 정보를 저장하기 위한 데이터 타입이 따로 있기 때문에 확장성 관점에서 굳이 내가 바퀴를 직접 구현할 필요가 없다. RDB에서 인덱스를 구성하는 등의 검색을 위한 최적화를 시도해 볼 수 있다. 1. 대로 하여도 테이블의 row는 점점 늘어날 것이기 때문에 WAS에서 점점 부하가 많이 걸릴 것이다. 어떻게 구현할 것인가? 가까운 거리를 계산하기 위해선 다음과 같은 조건들이 필요하다. 1. 위치 정보를 저장하기 위해 통일된 좌표계가 필요함. 2. 임의의 두 점 사..
일급 컬렉션에 대하여 일급 + 컬렉션의 의미로 나누어 생각했다. 일급의 의미는 일급 객체의 의미 (위키백과)를 참조했는데, 다음과 같다. 컴퓨터 프로그래밍 언어 디자인에서, 일급 객체란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 인자로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다. 말이 어렵지만 정의는 간단하다. 변수에 할당(assignment)할 수 있다. 다른 함수를 인자(argument)로 전달 받는다. 다른 함수의 결과로서 리턴될 수 있다. 컬렉션은 자바에서 목록성 데이터를 처리하는 자료구조를 통칭한다. 일급 컬렉션이란 이러한 컬렉션을 자료구조로만 사용하는게 아닌 목적성을 가지고 의미있게 만드는게 목적이라 볼 수 있다. 그렇다면 왜 목적..
스프링초짜의 도메인 이벤트 찍먹 도전기 (1) 사이드 프로젝트로 멘토링을 구하는 서비스를 만들고 있다. 모바일과 연동이 필요한 기능이 있었는데, 멘토링을 제안하거나 수락, 거절하게 되면 보낸 사람에게 푸시 메시지를 보내는 구조였다. 푸시 메시지는 firebase에서 제공하는 클라우드 메시징 기능을 사용하여 보내기로 했다. 메시지를 보내기 위해선 상대방의 디바이스 토큰이 필요했기 때문에 조회 로직이 반드시 들어가야 했다. (fcm: Firebase Cloude Messaging) 그런데 코드를 작성하면서 이상한 점이 들었다. 문제인식 @Transactional public void requestTutoring(RequestTutoringDto dto, TokenAccountInfo token) { Tutoring tutoring = Tutoring.b..
Optional에 대하여 자바를 사용하면서 Null Pointer Exception를 만나본 적이 있는 사람들은 null 처리를 위한 분기를 작성할 것이다. 자바 8에서 이러한 분기를 코드 흐름은 가독성에 방해가 된다 생각하여 Optional을 도입하였다. Optional은 한 마디로 정의내린다면 null일 수도 있는 값이다. 즉, 값이 없거나 (null) 있거나 둘 중 하나란 소리다. Optional에 구현된 메서드들은 null이 아니라면 동작하도록 구현되어 있다. 이를 통해 복잡한 null 처리 분기를 작성하지 않고, 순차적인 흐름으로 코드를 읽도록 도와준다. 예제를 통해 살펴보자. public class Manager{ List cars = new ArrayList(); public Car getCar(int idx){ i..
Stream에 대하여 자바 8에서 스트림이란 기능이 추가되었다. 스트림이란 한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임이다. 유닉스 계열 운영체제의 명령어 중 파이프라인과 유사한 동작을 하는데, 출력의 스트림은 입력 스트림이 될 수 있다. 본격적으로 스트림에 대해 알아보자. 명령을 파이프라인으로 처리하면 무엇이 좋길래 추가한걸까 자바에서는 우리가 하려는 작업을 고수준으로 추상화해서 일련의 스트림으로 만들어 처리할 수 있는게 목적이라 생각한다. (마치 데이터베이스 질의처럼) 연속된 요소: 스트림은 컬렉션과 마찬가지로 특정 요소 형식으로 이루어진 연속된 값 집합의 인터페이스를 제공한다. 컬렉션은 자료구조이므로 시간과 공간의 복잡성과 관련된 요소 저장 및 접근 연산이 주를 이루지만, 스트림에서는 filter, sor..
ArgumentResolver로 토큰에서 값 추출하기 사이드 프로젝트 중에 jwt 토큰에서 ID와 authority를 꺼내어 사용하는 일이 생겼는데, token을 발급해주는 클래스에서 처리했었다. 그런데, 최근 오브젝트라는 책을 보고 객체가 가져야 할 책임에 대해 고민하게 되었고 프로젝트에 적용해보려 한다. 코드를 잘 작성한 줄 알았는데, 역시나.. 문제가 있었다. 문제 인식 기존 코드에서는 Authorization 헤더의 값을 컨트롤러에서 받아 서비스로 전달했다. @DeleteMapping(value = "/tutorings/{tutoringId}", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity cancelTutoring( @RequestHeader(name = "Authoriza..
10836 여왕벌 https://www.acmicpc.net/problem/10836 접근 방식 처음 시도한 방식 (태스크4에서 시간초과): N개의 입력에 대해 2M-1번씩 순회하여 누적합을 저장 개선한 방식: N개의 입력에 대해서도 누적합을 하고, 마지막에 M^2으로 출력 import java.io.*; import java.util.*; public class Main { static int N, M; static int[] arr; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new Stri..
13335 트럭 https://www.acmicpc.net/problem/13335 13335번: 트럭 입력 데이터는 표준입력을 사용한다. 입력은 두 줄로 이루어진다. 입력의 첫 번째 줄에는 세 개의 정수 n (1 ≤ n ≤ 1,000) , w (1 ≤ w ≤ 100) and L (10 ≤ L ≤ 1,000)이 주어지는데, n은 다리를 건너는 트 www.acmicpc.net 간단한 문제이지만 논리를 헷갈려서 헤맸던 문제였다. 입력의 크기가 작기 때문에 다리를 다 빠져나가는 시간을 바로 계산하지 않고, 1초 단위로 계산하여도 100만으로 시간이 충분하다. 따라서 time이라는 변수를 증가시켜 계산하도록 하고, 무게 제한을 구현하기 위해 deque를 사용하였다. 이후 트럭의 대기 큐에서 하나씩 빼내어 넣게 되는데, 이 때 ..
1967 트리의 지름 구하기 https://www.acmicpc.net/problem/1967 1967번: 트리의 지름 파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연 www.acmicpc.net 모든 정점에서 BFS를 수행을 시도했더니 메모리 초과가 발생했다. 이유를 모르겠어서 정답을 참고했는데, 방식이 인상 깊어 기록으로 남기는게 좋을 것 같았다. 트리의 지름을 구하는 방법으로 루트 노드에서 가장 먼 정점을 구한다. 트리의 특성 상 절반으로 연산을 줄일 수 있기 때문이다. 이후 해당 정점에서 다시 가장 먼 정점의 거리를 구하면 트리의 지름이 된다. import jav..
1916 최소비용 구하기 https://www.acmicpc.net/problem/1916 1916번: 최소비용 구하기 첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 www.acmicpc.net 문제 접근 도시와 버스의 관계를 묵시적 그래프로 나타낼 수 있고 그래프 탐색 방법으로 문제의 답을 도출할 수 있다. 시간제한이 짧고, 도시의 개수와 버스의 개수가 많기 때문에 그리디한 방법을 사용해야 한다. 즉, 가장 짧은 엣지부터 방문하고, 이미 짧은 경로를 알고 있다면 이후의 노드들은 탐색하지 않아야 한다. 우선순위 큐를 사용하여 가장 짧은 cost의 엣지부터..