Category: Develop

0

JPA - 객체지향 쿼리 언어

목차 JPA JPQL - Fetch Join JPA JPQL - Projection (Select) JPA JPQL (Java Persistence Query Language) JPA - 객체지향 쿼리 언어 객체 지향 쿼리 언어 종류 JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SrpignjdbcTemplate 함께 사용 JPQL JPA 를 사용하면 엔티티 객체 를 중심으로 개발 문제는 검색 쿼리 검색을 할때도 테이블이 나닌 엔티티 객체 를 대상으로 검색 모든 DB 데이터를 객체로 변화해서 검색하는 것은 불가능 애플리케이션이 필요한 데이터만 DB 에서 불러오려면 결국 검색 조건인 포함된 SQL 이 필요 JPA 는 SQL 을 추상화한 JPQL 이라는 객체지향 쿼리 언어 제공 SQL 과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원 JPQL 은 엔티티 객체를 대상으로 쿼리 SQL 은 데이터 베이스 테이블을 대상으로 쿼리 public class JpaMain { public static void main(String[] ars) { EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hello"); EntityManager em = entityManagerFactory.createEntityManager(); EntityTransaction transaction = em.getTransaction(); transaction.begin(); try { String qlString = "select m from Member m where m.username like '%kim%'"; List<Member> result = em.createQuery(qlString, Member.class) .getResultList(); } catch (Exception e) { transaction.rollback(); } finally { em.close(); } entityManagerFactory.close(); }}

0

프로그래머스 - 양과 늑대 Cpp

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/92343 프로그래머스 - 양과 늑대 Cpp 문제 풀이이 문제의 가장 어려운 점은 한번 방문한 노드를 여러번 방문할 수 있다는 것이다. 중복을 허용한 탐색을 진행하면 탐색이 끝나지 않으므로, 최대한 중복 방문을 제거하기 위해 비트마스크 를 이용해 방문한 노드들을 관리하면서 같은 상태에서 같은 노드 방문을 못하게 하는게 이 문제의 핵심이다.그 다음으로 어려웠던 부분은 이 탐색의 끝은 항상 루트 노드에서 끝나야 한다는 점이고, 반대로 생각하면 루트 노드에서 탐색 가능한 범위만 정답이 될 수 있는 것이다. 처음에 이 부분을 염두하지 않아서 계속 틀렸다. 이 두 부분만 잘 염두 하면 이 문제를 해결하는데 큰 어려움은 없다. 전체 소스 코드#include <iostream>#include <string>#include <vector>using namespace std;int maxValue = 0;void dfs(int sheep, int woof, int start, int state, vector<int> info, vector<vector<int>>& grape, vector<vector<bool>>& check) { if (woof >= sheep) { return; } maxValue = max(maxValue, sheep); for (int i = 0; i < info.size(); i++) { int node = 1 << i; int isVisited = state & node; int nextState = state | node; if (grape[start][i] == 0) { continue; } if (check[nextState][i] == true) { continue; } check[nextState][i] = true; if (isVisited) { dfs(sheep, woof, i, nextState, info, grape, check); } else { if (info[i] == 0) { dfs(sheep + 1, woof, i, nextState, info, grape, check); } else { dfs(sheep, woof + 1, i, nextState, info, grape, check); } } check[nextState][i] = false; }}int solution(vector<int> info, vector<vector<int>> edges) { int answer = 0; vector<vector<int>> grape = vector<vector<int>>(info.size() + 1, vector<int>(info.size() + 1, 0)); vector<vector<bool>> check = vector<vector<bool>>((1 << 18) - 1, vector<bool>(17 + 1, false)); for (vector<int> edge : edges) { int from, to; from = edge[0]; to = edge[1]; grape[from][to] = 1; grape[to][from] = 1; } maxValue = 0; int state = 1 << 0; check[state][0] = true; dfs(1, 0, 0, state, info, grape, check); answer = max(maxValue, answer); return answer;}

0

Oracle 12c - Docker 로 시작하기

목차 Oracle - Docker 로 시작하기 Oracle 12c - Docker 로 시작하기 11g 제한사항Oracle 11g 의 경우 11G 제한이 걸려 있어서 부득이 하게 12c 로 변경 했다. 11g 가 11G 까지라서 11g 인건가….. SQL Error [12953] [72000]: ORA-12953: The request exceeds the maximum allowed database size of 11 GB 이미지 다운로드 Image : absolutapps/oracle-12c-ee docker pull absolutapps/oracle-12c-ee 이미지 실행하기

0

Oracle - Docker 로 시작하기

목차 Oracle - Docker 로 시작하기 Oracle 12c - Docker 로 시작하기 이미지 다운로드Oracle 의 경우 Mac 버전 데이터 베이스를 지원하지 않기 때문에 Docker 를 이용해 Oracle 를 이용해보려고 한다. Image : jaspeen/oracle-xe-11g docker pull jaspeen/oracle-xe-11g 이미지 실행하기docker run --name oracle11g -d -p 1521:1521 jaspeen/oracle-xe-11g# Docker Volumn 과 외부 Volumn 연결docker run --name oracle11g -d -p 1521:1521 -v ~/docker/oracle:/u01/app/oracle jaspeen/oracle-xe-11g Sqlplus 실행

0

프로그래머스 - 양궁 대회 (Python)

https://programmers.co.kr/learn/courses/30/lessons/92342 프로그래머스 - 키패드누르기 Cpp 프로그래머스 - 키패드누르기 Python 유의 사항 화살을 맞춘 개수를 저장하고 정렬하는데 있어서 주의해야 한다. 정렬에 대한 가중치가 앞자리가 아닌 뒷자리 에 있으므로 값을 저장할 때 뒤집어서 저장한 후 내림 차순으로 정렬해 가장 큰 값을 가져와 해당 값을 뒤집으면 가장 낮은 점수를 많이 맞춘 순서대로 정렬된 값을 가져올 수 있다. cases = []maxDiff: int = 0results = []def getScore(index: int): return 10 - indexdef calScores(ryan: list, apeech: list) -> None: diff: int = 0 apeech_score: int = 0 ryan_score: int = 0 global maxDiff for i in range(11): if apeech[i] == 0 and ryan[i] == 0: continue if ryan[i] > apeech[i]: ryan_score += getScore(i) else: apeech_score += getScore(i) diff = ryan_score - apeech_score if diff <= 0: return if diff >= maxDiff: oneCase: str = ''.join(list(map(str, ryan[::-1]))) if(diff > maxDiff): results.clear() maxDiff = diff results.append(oneCase)def makeAllCase(start: int, choice: int, n: int, ryan: list) -> None: if(choice >= n): cases.append(ryan.copy()) return for i in range(start, 11): ryan[i] += 1 makeAllCase(i, choice+1, n, ryan) ryan[i] -= 1def solution(n, info): answer = [] ryan = [0] * 11 makeAllCase(0, 0, n, ryan) for case in cases: calScores(case, info) if len(results) > 0: results.sort(reverse=True) answer = list(map(int, results[0][::-1])) # print(answer) else: answer.append(-1) return answer

0

백준 1197 - 최소 스패닝 트리 (Cpp)

링크 https://www.acmicpc.net/problem/1197 전체 소스 코드#include <algorithm>#include <iostream>#include <string>#include <vector>#define endl '\n';using namespace std;int find(int node, vector<int>& v) { if (node == v[node]) { return node; } return v[node] = find(v[node], v);}void merge(int a, int b, vector<int>& v) { if (a != b) { v[a] = b; }}int main(void) { int vertex, edge; int totalWeight = 0; cin >> vertex >> edge; vector<pair<int, pair<int, int>>> edges = vector<pair<int, pair<int, int>>>(vertex + 1); vector<int> v = vector<int>(vertex + 1); for (int i = 0; i < v.size(); i++) { v[i] = i; } for (int i = 0; i < edge; i++) { int from, to, weight; cin >> from >> to >> weight; edges.push_back({weight, {from, to}}); } sort(edges.begin(), edges.end()); for (auto we : edges) { int weight = we.first; pair<int, int> e = we.second; int from = e.first; int to = e.second; int setA = find(from, v); int setB = find(to, v); if (setA != setB) { totalWeight += weight; merge(setA, setB, v); } } cout << totalWeight << endl; return 0;}

0

Oracle - Clustering Factor

Oracle - Clustering Factor 데이터베이스에서는 특정 컬럼을 기준으로 같은 값을 갖는 데이터가 서로 모여있는 정도를 의미한다. 인덱스 클러스터링 팩터가 좋다. 고 하면 인덱스 정렬 순서 와 테이블 정렬 순서 가 서로 비슷하다는 것을 말한다. Index Scan의 Cost에 큰 영향을 준다. Index Lookup을 통해 Data를 읽는 일량을 결정한다.

0

Kafka Consumer

Kafka Consumer카프카에서는 Consumer 가 데이터를 가져가도 데이터가 사라지지 않는다. Kafka Consumer 는 기본적으로 Topic 의 데이터를 가져온다. 데이터를 가져오는 것을 Polling 이라고 한다. Partition Offset 위치 기록(Commit) Consumer Group 을 통해 병렬 처리 offset 메시지가 파티션 내에서 가지는 고유의 번호 offset 은 토픽 별로 파티션 별로 별개로 지정된다. Consumer 가 데이터를 어느지점까지 읽었는지 확인하는 용도로 사용한다. Consumer 가 데이터를 읽어가면 offset 을 Commit 한다. Consumer 가 Partition 의 읽은 위치(offset) 은 Kafka 의 __Consumer_offset 토픽에 저장된다. Consumer 가 중지가 되더라도 시작 위치를 알고 있으므로 다시 복구하여 데이터를 처리할 수 있다. Multiple Consumer Consumer 개수는 Partition 개수보다 적거나 같아야 한다. 여러 Partition 을 가진 Topic 에 대해 Consumer 가 병렬 처리하게 하기 위해서는 Consumer 가 Partition의 개수보다 작아야 한다. 다른 Consumer Group

0

Kafka Partitioner

Kafka Partitioner Producer 가 데이터를 보내면 무조건 Partitioner 를 통해 Broker 로 데이터를 보낸다. Recode 에 포함된 Message Key 혹은 Message 값에 따라서 Partition 의 위치가 결정된다. Producer 를 사용할때 Partitiooner 를 설정하지 않는다면 UniformStickyPartitioner 로 설정된다. Key 가 있는 Message Message Key 를 가진 레코드는 Partitioner 에 의해서 특정한 Hash 값이 생성된다. 해당 Hash 값을 이용해 어느 Partition 에 저장될지 결정된다. 동일한 Message Key 를 가진 Record 는 동일한 Hash 값을 만들기 때문에 항상 동일한 Partition 에 들어가는 것을 보장한다. 순서를 지켜서 데이터를 처리할 수 있는 장점이 있다. Partition 내부에서는 Queue 처럼 동작하기 때문에 순서를 지킬 수 있다. Key 가 없는 MessageRound Robin 형태로 데이터가 들어가게 된다. UniformStickyPartitioner 는 프로듀서에서 배치로 모을 수 있는 최대한의 Record 를 모아서 Partition 으로 데이터를 보내게 된다. Message Key 가 없는 Record 들은 Partition 에 적절히 분배된다.

0

Kafka Producer

카프카 프로듀서카프카 프로듀서는 브로커에 존재하는 토픽에 메시지를 전달하는 역할을 담당합니다. Topic 에 해당하는 메시지를 생성 후 해당 Topic으로 데이터를 publish 한다. 또한, 메시지 전송이 실패할 경우, 재전송을 한다. 카프카 프로듀서는 브로커로 메시지를 보낼때 파티션 Key 도 함께 보낼 수 있습니다. 브로커는 파티션 Key 의 유무에 따라 데이터를 저장하는 방식이 달라집니다. 파티션 Key 가 null 인 데이터 전송Topic 에 Partition 이 한개인 경우는 데이터들이 순차적으로 쌓이게 된다. Topic 에 Partition 이 여러개인 경우 Round Robin 형식으로 데이터가 쌓이게 된다. 파티션 Key 를 전송할 경우Kafka 는 Key 를 특정한 Hash 값으로 변형 시켜 Partition 과 1:1 매칭을 시킵니다. 각 파티션에 동일 Key 의 Value 만 쌓이게 된다. Partition 의 개수와 Key 의 개수가 일치하지 않는 경우 Key 와 Partition 의 매칭이 깨지게 돼 Key 와 Partition 연결은 보장되지 않습니다.

0

Kafka Replication

Kafka Broker카프카가 설치 돼 있는 서버 단위를 말한다. 보통 3개 이상의 Broker 로 구성해 사용하는 것을 권장 Replication 데이터의 복제를 의미한다 Replication 은 Partition 의 고가용성 을 위해 사용된다. 3개 이상의 Broker 를 사용할 때 Replication 은 3으로 설정하는 것이 좋다 Replication 이 1인 경우 Partition 이 원본 1개만 존재한다는 것이다. Replication 이 2인 경우 Partition 이 원본 1개와 복재본 1개 총 2개가 존재함을 의미한다. Replication 이 3인 경우 Partition 이 원본 1개와 복재본 2개 총 3개가 존재함을 의미한다. Broker 개수에 따라서 Replication 개수가 제한된다. Replication 의 개수는 Broker의 개수를 넘어설 수 없다. 원본 Partition 은 Leader Partition 이라 부르고, 복재본 Partition 은 Follower Partition 이라 부른다. Leader Partition 과 Follower Partition 을 합쳐서 ISR (In Sync Replica) 라고 부른다. Producer 가 Topic 의 Partition 에 데이터를 전달할 때 전달받는 주체가 Leader Partition 이된다. Replication 이 1인 경우 Partition 이 한개고 Replication 이 1인 Topic 이 존재하고 Broker 가 3대라면 Broker 3대 중 1대에 해당 Topic 정보가 저장된다.

0

Kafka 설치

카프카 설치http://kafka.apache.org/ 주키퍼 실행bin/zookeeper-server-start.sh config/zookeeper.properties Properties 변경server.properties에서 Listner 설정을 추가해 줘야 한다. listeners=PLAINTEXT://127.0.0.1:9092 kafka 실행bin/kafka-server-start.sh config/server.properties

0

Kafka 구조

Kafka 구조 Topic 데이터를 구분하기 위해 사용하는 논리적인 단위 (데이터 베이스의 테이블 명과 유사하다고 생각하면 된다.) Topic은 한개 이상의 partition으로 구성된다. 카프카에서는 데이터를 주고 받을 때 Topic 을 이용해 pub/sub 형태로 데이터를 주고 받는다. Partition 토픽에 속한 Record 를 실제 저장소에 저장하는 가장 작은 물리적인 단위 Consumer 가 Record 를 가져가더라도 Record 는 삭제되지 않는다. 파티션은 늘리는 것은 가능하지만 줄이는 것은 불가능하므로 파티션을 늘릴때는 주의 해야 한다. Record 파티션에 저장되는 데이터 Kafka Pub/Sub 모델 Kafka 를 사용하기 위해서는 Message 를 발행하는 Producer 와 Message 를 구독하는 Consumer 로 구성한다. Kafka 에서는 메시지를 발행하는 Publisher 를 Producer 로 메시지를 구독하는 Subscriber 를 Consumer 라고 부른다. Kafka 에서는 Consumer 가 데이터를 가져가도 데이터가 사라지지 않는다. Kafka Producer Kafka Producer 는 데이터를 Kafka 로 보내는 역할을 한다.

0

백준 15650 - N 과 M (2) - 순열

백준 15650 - N 과 M (2) - 순열 Post not found: algorithm/baekjoon/경우의수/15649-N과M-cpp Post not found: algorithm/baekjoon/경우의수/15650-N과M-cpp 링크https://www.acmicpc.net/problem/2606 문제 풀이 주어진 N 개에서 M 개를 뽑는 경우의 수를 다루는 조합 문제 백트레킹 을 이용해 만들 수 있는 모든 경우의 수를 만들어 줬다. 다만, 조합은 순서와 상관 없이 뽑은 상태가 같으면 같은 Case 로 분류가 된다. 때문에 현재 뽑은 위치(idx) 에서 앞에 있는 것들만 뽑게 하면 같은 경우의 수가 나오는 것을 방지할 수 있다. 전체 소스 코드#include <iostream>#include <vector>#define endl '\n'using namespace std;vector<int> v;vector<bool> check;// idx : 수열 탐색 현재 시작 위치를 알려주기 위한 변수// depth : 재귀 문이 몇번 호출 됐는지 확인하기 위한 변수// n : 수열 탐색의 마지막 위치를 확인하기 위한 값// m : 재귀 문을 최대 호출할 수 있는 횟수void nCr(int idx, int depth, int n, int m) { if (depth == m) { for (int value : v) { cout << value << " "; } cout << endl; return; } for (int i = idx; i < n; i++) { if (check[i] == true) { continue; } check[i] = true; v[depth] = i + 1; nCr(i + 1, depth + 1, n, m); check[i] = false; }}int main(void) { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false); int n, m; cin >> n >> m; v = vector<int>(m); check = vector<bool>(n); nCr(0, 0, n, m); return 0;}

0

백준 15649 - N 과 M (1) - 순열

백준 15649 - N 과 M (1) Post not found: algorithm/baekjoon/경우의수/15649-N과M-cpp Post not found: algorithm/baekjoon/경우의수/15650-N과M-cpp 링크https://www.acmicpc.net/problem/2606 문제 풀이 주어진 N 개에서 M 개를 뽑아 나열하는 순열 문제. 백트래킹 을 이용해 만들 수 있는 모든 수열의 경우의 수 를 만들어 준다. check 를 이용해 똑같은 숫자를 여러 번 뽑는 중복 행위를 판단하고 v 배열을 통해 한 수열이 만들어지면 출력하도록 한다. v : 뽑은 숫자를 저장하기 위한 배열 check : 해당 숫자가 뽑혔는지 판단하기 위한 배열 전체 소스 코드