13 June 2024
gRPC vs REST 비교 gRPC는 구글에서 개발한 RPC 통신 프로토콜을 말합니다. RPC(Remote Procedure Call) 통신 프로토콜은 원격지의 프로시저를 호출 하는 통신 기술입니다. 오늘은 내부적으로 RestAPI를 활용한 개발을 많이 하고 있으나 gRPC 를 활용 해보면 어떨까? 하는 궁금증을 해소 하기 위해서 성능을 비교해 보고 장단점을 도출 하여 실무에 어떻게 적용 하면...
11 June 2024
트랜젝션 아웃박스 패턴 트랜젝션 아웃박스 패턴은 MSA 이벤트 기반 아키텍처에서 이벤트 발행 시 발생되는 이슈를 보완하기 위한 패턴입니다. 예를 들어, 주문 이벤트가 발생하여 DB에는 저장되었지만 이벤트 큐(MessageQueue)에 발행하다가 오류(네트워크 오류 등등)가 발생하면 어떻게 될까요? DB에는 주문이 들어갔지만 이벤트 큐 컨슈머는 발행된 이벤트가 없기 때문에 다음 절차를 진행하지 않을 것입니다. 이런...
22 May 2024
MSA 서비스 관리의 필요성 증가 프로젝트를 진행 하면서 다양한 서비스들을 만들게 되고 MSA 환경으로 작은 단위의 서비스가 분산 되는 형태로 구성 되다 보니 점점 관리의 필요성이 생깁니다. 하나의 서비스를 만들더라도 인증서버, 수신서버, 처리서버, 외부통신서버 등등 분산이 되게 되고 각각의 서비스의 상태 관리 자원관리 로깅, 미터링, 정산 등등 다양한 기능들이 필요합니다....
17 April 2024
Kotlin 을 활용 하여 개발하는 도중 ObjectMapper 로 JsonString을 deserialize 할때 아래와 같은 오류가 발생 했다. com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.kc.noti.dist.RedisTest$Hello` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (String)"{"name" : "Kotlin", "value" : "Hello"}"; line: 1, column: 2]...
26 February 2024
Resilience4j 란? Resilience4j는 자바 언어로 개발된 내결함성 라이브러리입니다. 이 라이브러리는 분산 시스템에서 장애를 처리하고 시스템의 내결함성을 향상시키는 데 사용됩니다. Resilience4j는 일련의 내결함성 패턴을 구현하고, 이러한 패턴을 사용하여 애플리케이션을 더 견고하고 신뢰할 수 있도록 지원합니다. 주요 기능 리스트 Circuit Breaker : Circuit Breaker 패턴은 서비스 호출을 모니터링하고, 호출 실패 또는 지정된...
14 February 2024
프로그래머스 - 택배상자(Java) 문제 링크 : 택배 상자 문제 해결 접근법 이번 문제는 문제를 이해 하는데 많은 시간을 사용 해야 했다. 아래 주의 사항만 잘 이해 하면 Stack 을 이용 해서 간단히 해결 할 수 있다. 주의 문제 에서 주어진 Order 는 택배 기사 님이 차에 실어 달라는 택배의 순서...
31 January 2024
프로그래머스 - 미로 탈출(Java) 문제 링크 : 미로 탈출 문제 해결 접근법 이번 문제는 기본 적인 bfs 를 활용 해서 문제를 해결 했다. 규칙 시작 위치를 찾는다. 시작 위치에서 레버(L) 까지의 최단 거리(BFS)를 찾는다. 레버(L) 위치에서 출구(E) 까지의 최단 거리(BFS)를 찾는다. 두 최단거리를 더해서 최종 답변을 낸다. 소스 public class...
31 January 2024
프로그래머스 - 호텔 대실(Java) 문제 링크 : 호텔 대실 문제 해결 접근법 이번 문제는 기본 적인 bfs 를 활용 해서 문제를 해결 했다. 규칙 예약을 예약 시간이 빠른 순서 대로 정렬 하여 큐(bookingQ)에 입력 합니다. 방 사용 시간을 확인할 스택 배열(useRoomList)을 생성 합니다. 큐에서 예약을 하나씩 가져오면서 각 방의 이용...
29 January 2024
프로그래머스 - 틱택토 게임(Java) 문제 링크 : 틱택토 게임 틱택토 게임 이란? 틱택토 게임은 우리나라 오목과 비슷하다. 3*3 보드판에서 O 와 X 를 번갈아 가면서 두고 가로,세로,대각으로 한줄이 완성 되면 이기는 게임이다. 문제 해결 접근법 이번 문제는 규칙을 찾는게 가장 핵심이 었다. 규칙 보드가 전부 비었다면 아직 시작 하지 않았으므로...
23 January 2024
프로그래머스 - 리코쳇 게임(Java) 문제 링크 : 리코쳇 게임 리코쳇 게임 이란? 리코쳇 게임은 1999년에 Alex Randolph가 디자인 한 추상 전략 보드 게임 입니다. 격자 모양의 보드에 로봇이 있는데 해당 로봇은 한 방향으로 이동 할 수 있으며 한번 이동 하면 벽을 만날때 까지 가야 합니다. 문제 해결 접근법(BFS 응용) 문제를...
22 January 2024
프로그래머스 - 연속된 부분 수열의 합(Java) 문제 링크 : 부분 수열의 합 이번 문제는 연속된 수열(sequence) 에서 부분 수열의 합이 k 가 되는 연속된 부분 수열을 찾는 문에 입니다. 처음에는 단순하게 dps 로 풀려고 시도 하였으나 시간 복잡도를 고려 하지 않아서 시간 초과가 발생 하여 투포인터 알고리즘을 통해 O(n) 으로...
07 January 2024
프로그래머스 - 도넛과 막대 그래프(Java) 프로그래머스 - 도넛과 막대 그래프 문제는 주어진 그래프에서 정점과 도넛 모양 그래프, 막대 모양 그래프, 8자 모양 그래프를 찾는 문제 입니다. 처음에는 그래프 순회 알고리즘을 사용해서 도넛과 막대를 찾고 유니온 파인드를 사용해서 순환그래프를 찾으려 했었습니다…..(반성) 그런데 edge 의 길이가 1,000,000…….문제 풀이 힌트를 좀 참고해서 풀고...
02 January 2024
Virtual Thread (Java 21) Java 21에 추가된 Virtual Thread 는 처리량이 높은 동시 어플리케이션을 작성 할 수 있는 경량 스레드 이다. 기존에 사용 하던 Thread 는 OS Thread 를 랩핑 해서 사용 하는 형태로 OS의 총 스레드 개수에 따라 최대 Thread 의 생성 갯수가 정해지며 생성 비용이 높다. 신규로 추가된...
17 December 2023
Kube-Scheduler Kube-scheduler 은 Kubelet 이 파드를 실행 할 수 있도록 파드가 노드에 적합 한지 확인 해서 할당 하는 것 입니다. Kube-scheduler 는 파드가 실행 될 수 있는 최적의 노드에 파드를 배치 합니다. Node label 노드에 레이블을 추가 해서 파드를 특정 노드 또는 노드 그룹에 스케쥴링 되도록 지정 할 수 있습니다....
02 December 2023
ReplicaSet ReplicaSet 설정 한 Pod 의 목표 숫자 만큼 Template 에 설정 된 Pod 를 생성 하고 축소 합니다. ReplicaSet 은 아래와 같은 기능을 제공 합니다. Auto Healing Pod 에 문제가 발생 했을 경우 복구를 합니다. Auto Scaling Pod 를 추가 할 수 있습니다. Software Update Pod 의 버전을 관리...
29 November 2023
쿠버네티스-ConfigMap, Secret (Env, Mount) 어플리케이션을 구성 하는 경우 필요한 환경 변수(ex. dev, prod..) 등을 Container 로 전달 하기 위한 옵션 입니다. 전달 받는 방법은 Object 와 File-Mount 방법이 있으며 각 성격은 아래와 같습니다. Object : Pod 생성 옵션에서 환경변수(key:value)를 입력하여 해당 Type 으로 전달 받을 수 있는 방법 Mount :...
29 November 2023
쿠버네티스-Volume (EmptyDir, HostPath, PVC/PV) K8s 에서 Volume 은 각 파드에 스토리지를 연결하여 전략적으로 구성 하는 기능 입니다. EmptyDir Pod 내에 서만 사용 할 수 있는 볼륨 영역 입니다. 해당 볼륨은 Pod 내에서 사용 할 수 있고 Pod 내의 컨테이너 간에는 공유가 가능 합니다. 다만 Pod가 삭제 되면 함께 삭제 되는...
28 November 2023
쿠버네티스-Service (ClusterIP, NodePort, LoadBalancer) K8s 에서 Service는 Pod를 서비스로 노출 하기 위한 기능 입니다. Pod 는 K8s 클러스터 내에서 사용 할 수 있는 자신의 IP를 가지고 있지만 Pod는 K8s 환경에서 언제든지 삭제되고 재생성 될 수 있기때문에 IP가 언제든 바뀔수 있습니다. Service 는 사용자가 삭제 하기 전까진 설정된 아이피를 가지고 있고...
27 November 2023
Kubernetes(k8s)? Kubernetes(K8s) 란 K8s라고도 알려진 쿠버네티스는 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리해주는 오픈소스 시스템입니다. K8s 공식페이지에서 제공한 문구입니다. 그럼 이 K8s 의 탄생은 아래표에서 보듯이 점차 기술을 보완 해나가기 위해 발전이 되었습니다. PM VM Container(Docker) K8s 서버를 1대 구매 하여 사용 중에 해당 서버에 설치되어 있는 서비스는 피크타임에만 리소스를...
22 November 2023
그래프 알고리즘 기초 - 최소 신장 트리(Minimum Spanning Tree) 최소 신장 트리란? (Minimum Spanning Tree) 최소신장 트리는 모든 정점을 포함하면서 가장 적은 비용으로 연결된 부분 그래프를 찾는 알고리즘. 프림 알고리즘과 크루스칼 알고리즘이 있음. 둘의 차이점은 프림 알고리즘은 복잡한 밀집 그래프에 적합하고 크루스칼 알고리즘은 간선이 적은 희소 그래프에 적합하다. 최소 신장...
22 November 2023
그래프 알고리즘 기초 - 플로이드 워셜 알고리즘(Floyd-Warshall) 플로이드 워셜 알고리즘(Floyd-Warshall) 모든 노드의 최단 거리를 구할 수 있는 알고리즘. 참고사항 시간복잡도(노드수 : v) : O(V^3) 3중 for 문을 이용해서 모든 경로를 탐색 하기 때문에 속도가 느릴 수 밖에 없다. N = 1000개가 넘으면 10억번의 반복을 해야 하기 때문에 시간 초과 할...
22 November 2023
그래프 알고리즘 기초 - 벨만포드 알고리즘(Bellman-Ford) 벨만포드 알고리즘(Bellman-Ford) 다익스트라 알고리즘과 동일하게 최단거리를 구할 수 있는 알고리즘 이지만 음수 간선 도 사용이 가능하다. 주로 음수 간선의 여부 확인에 활용. 참고사항 시간복잡도(노드수 : v, 에지 수 : E) : O(VE) 음수 가중치가 있는 경우 에도 사용 할 수 있음. 업데이트 조건 :...
22 November 2023
그래프 알고리즘 기초 - 다익스트라(Dijkstra) 다익스트라(Dijkstra) 다익스트라 알고리즘은 시작노드에서 모든 노드로의 최단거리를 찾는 알고리즘입니다. 참고사항 시간복잡도(노드수 : v, 에지 수 : E) : O(Elogv) 음수 가중치가 있는경우 사용 할 수 없음. 음수 가중치가 있는 경우 벨만포드 알고리즘(Bellman-Ford) 을 사용. 알고리즘 활용 영역 백준 1753 - 최단경로 https://www.acmicpc.net/problem/1753 다익스트라 구현 코드(백준-최단경로)...
22 November 2023
그래프 알고리즘 기초 - 위상정렬 위상 정렬(topological sorting) 사이클이 없는 방향 그래프(비순환 그래프-Directed Acycle Graph) 에서 모든 노드를 방향성에 거스르지 않고 순서대로 나열하는 정렬 방법입니다. 위상정렬에서는 진입 차수 와 진출 차수 를 알아야 합니다. 진입 차수 : 특정한 노드로 들어오는 간선의 개수 진출 차수 : 특정한 노드에서 나가는 간선의 개수...
22 November 2023
그래프 알고리즘 기초 - 유니온 파인드 유니온 파인드 알고리즘(Union-Find) 여러 노드가 주어 졌을 경우 두개의 노드를 1개의 집합으로 묶는 Union 연산과 같은 집합인지 확인하는 Find 연산으로 구성 되어있다. 1차원 배열을 사용 하여 유니온파인드 알고리즘 구현 방법 private static int[] graph; @Test void 그래프변환(){ graph = new int[5 + 1]; //...
22 November 2023
그래프 알고리즘 기초 - 노드 변환 그래프 알고리즘을 배우기 전에 필수로 연습해야할 그래프를 배열로 만드는 방법에 대해서 정리 해보겠습니다. 그래프 알고리즘 종류 유니온 파인드 알고리즘(Union-Find) 문제 유형 : 그래프에 사이클이 생성되는지 판별 하는 알고리즘 위상 정렬(topological sorting) 문제 유형 : 사이클이 없고. 방향이 있는 그래프에서만 사용할 수 있으며 전후 관계가...
09 November 2023
DDD를 위한 헥사고날 아키텍처 이해하기 1 도메인 주도 개발(DDD) 를 위한 헥사고날 아키텍처를 이해하기 위한 첫번째 기록입니다. 개발 아키텍처에는 모놀리식 아키텍처 와 마이크로 서비스 아키텍처 두가지를 가지고 목표와 비즈니스 요건에 따라 다르게 설계를 하고 있습니다. 모놀리식 아키텍처(Monolithic Architecture) 에서는 어플리케이션이 거대한 하나의 아키텍처를 가지고 구성 되어 있는 구조 이기 때문에...
20 April 2022
MockWebServer 를 활용 하여 RestAPI 테스트 하기 RestAPI 를 통한 어플리케이션 개발시 목적지 API 의 기능이 다 완성 되지 않았거나 미계약 등등의 사유로 API 스팩만 전달 받고 개발을 진행 할 경우가 있었습니다. 이런 경우 MockWebServer를 활용 하여 선개발을 진행 할 수 있습니다. 간단한 테스트 클래스를 작성하여 테스트 하는 방법을 알아...
27 March 2022
스프링 new instance 에 @Autowired 하는 방법 스프링 기반의 개발 하다 보면 new instance, static class 를 사용하게 되는 경우가 있습니다. new 로 생성 되는 인스턴스의 경우에는 스프링 IoC에서 관리 되는 Bean을 주입 받지 못 하고 @Autowired 로 주입된 bean 이 null 인 것을 확인 할 수 있습니다. @Autowired 어노테이션이...
24 March 2022
Github 에 잔디가 없을때 대처 방법 생각지도 않았습니다. 잔디가 생기지 않고 있을 줄은 .. 커밋을 했는데 잔디가 생기지 않는 경우를 위해 정리 합니다. user.email 확인 github에 잔디가 생기지 않는 경우는 github email 과 commit 한 email 정보가 틀린 경우 발생 할 수 있습니다. user.email 확인 방법은 아래와 같습니다. (프로젝트 폴더...
23 March 2022
ubuntu 서버 locale 설치 및 셋팅 서버 인스턴스 생성 후 locale 셋팅을 하다보니 자꾸 까먹어서…..기록 해두기 위한 포스팅 입니다. ubuntu 기본 locale 은 en-US.UTF-8 로 설정 되어있어 ko_KR.UTF-8 로 변경 하기 위함입니다. locale 확인 locale ko language pack 설치 sudo apt-get install language-pack-ko ko_KR.UTF-8 설치 sudo locale-gen ko_KR.UTF-8 로케일 설정...
21 March 2022
AMQP(Advanced Message Queuing Protocol) AMQP(Advanced Message Queuing Protocol, 어드밴스트 메시지 큐잉 프로토콜) 은 메시지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜입니다. 메시지 전달의 전달 보증, 신뢰성, 라우팅을 위한 기능 입니다. 무중단 서비스, 서비스의 scale-out, MSA 등을 위해서는 MQ를 사용 하는 시스템 구조가 유용합니다. MQ 에는 여러 가지 서비스가 있으나...
20 March 2022
스프링 배치 여러 곳에 write 를 하려면? 대부분의 배치서비스는 테이블 데이터를 읽어서(reader) 값을 확인 & 계산(processor) 한뒤 insert & update(writer) 하는 구성으로 되어있습니다. 하지만 1:1 구성으로 하나의 테이블 데이터를 읽어서 배치 처리를 하는 경우는 간단 하지만 하나의 테이블을 읽어서 여러 테이블에 처리를 해야 하는 경우에는 어떻게 처리를 할 것인가에 대해서...
19 March 2022
스프링 배치에서 테스트 코드를 작성 하려면 어떻게 해야 할까? 대부분의 배치 서비스들은 데이터를 읽어서(itemReader) 가공(itemProcess) 하여 처리(itemWriter) 하는 로직으로 구성 되어있습니다. 배치 서비스를 개발 하다 보면 실제로 배치를 수행 해보고 DB를 확인 하여 정상적인지 확인 하는 방법으로 검증 하였습니다. 로컬 테스트시에도 배치 대상 데이터를 임의로 생성 하고 배치를 돌려서 결과가...
16 December 2021
CVE-2021-45105 Log4j 2 DoS 취약점, CVE-2021-42550 Logback RCE 취약점 Log4j 보안 취약 관련 하여 log4j < 2.16.x 버전으로 업그레이드를 하였으나 또 다른 취약점이 발생 하여 제거 하기로 하였습니다. 사실 프로젝트에서 Logback 을 default logger 로 사용 하고 있기 때문에 하지 않아도 되나.. 혹시 모를 누군가의 사용을 방지 하기 위해 제거...
13 December 2021
log4j 2.15.x 버전이 우회되는 취약점이 발생 했습니다. (CVE-2021-45046) 이전 포스팅에서 log4j 보안 이슈에 대해서 정리 했는데. 어제 저녁 12/14일 2.15.x 버전이 우회 되어 신규 취약점이 발견 되었습니다. CVE-2021-45046 해당 취약점을 확인 하시고 2.16.x Log4j 2.16.x 링크 버전으로 업그레이드를 다시 진행 하셔야 합니다. 조치 방법 2.16.0 이상 (Java8 이상) 버전 업데이트...
12 December 2021
Log4j 보안 취약점 이슈! (CVE-2021-44228, NVD) Apache Log4j 에서 발생한 보안 이슈에 대해서 정리 합니다. 아파치 제단의 Log4j의 취약점 보고(CVE-2021-44228, NVD) 를 통해서 악성 코드 감염 및 원격 접속 등의 피해가 발생 할 수 있다는 보고가 나왔습니다. 해당 이슈를 통해서 전세계 적으로 라이브러리 패치를 진행 하였으며 전사 프로젝트도 점검을 하였습니다....
18 November 2021
Github Achievements 획득! 오랜만에 Github에 접속! 못보던 뱃지가 생겼습니다. 뱃지 이름은 Arctic Code Vault Contributor! 새로운 뱃지가 생겨 기분 좋은 마음으로 어떤 뱃지 인지 알아보기 시작 했습니다. 북극?? 저장소?? 이게 다 무슨 말인지 알아 보겠습니다. Arctic Code Vault Contributor. 북극 저장소에 보관 되는 소스 코드 기여자! 2020년 2월 2일에 Github...
29 June 2021
JetBrains 의 제품중에서는 Database Tool 인 DataGrip 이라는 유료 제품이 있습니다. Database 관리를 하기에 최적화된 툴이지만 유료이기 때문에 접근하기에 어렵습니다. 하지만 인텔리제이에서도 기본적인 Database 를 사용 할 수 있는 기능을 제공 하고 있습니다. 인텔리제이에서 Database 에 접속 하여 사용 하는 방법을 정리 해보겠습니다. 인텔리제이 프로젝트 생성 Database 를 관리 하기...
29 June 2021
사내에서 코드 품질 관리를 하기 위해 Sonarqube 를 사용 하기로 결정 되어 POC 진행 하면서 내용을 정리 합니다. 이번에는 Jenkins 를 활용 하여 github -> sonarqube scan -> build 처리 하는 방법에 대해서 정리 해보겠습니다. Jenkins plugins 설치 Jenkins 에서 Sonarqube 를 사용 하기 위에서 플러그인을 설치 해야 합니다. Jenkins...
17 May 2021
JPA 에서 제공 하는 키워드 정리 Keyword Sample JPQL snippet And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2 Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2 Is,Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals … where x.firstname = 1? Between findByStartDateBetween … where x.startDate between 1? and ?2 LessThan findByAgeLessThan...
13 May 2021
도커를 이용하여 MySql 환경을 구성 하는 방법을 정리해봅니다. 도커에 대해서 기본지식이 있는 상태에서 테스트가 가능합니다. 도커 설치 방법에 대해서는 아래 포스팅을 참고 하시기 바랍니다. 도커에 MySql 이미지 설치 하기 MySql 이미지 다운로드(https://hub.docker.com/_/mysql/?tab=tags&page=1&ordering=last_updated) $ Docker pull mysql:8.0.25 MySql 이미지 확인 $ Docker images Docker MySql 컨테이너 생성 및 실행 Docker 에...
10 May 2021
김치 프리미엄 조회 사이트 오픈 ###국내에서 거래되고 있는 코인의 시세 동향 및 김치프리미엄율을 조회 할 수 있는 참조 사이트 비트코인, 이더리움, 도지코인, 알트코인등의 현재 업비트 거래 시세와 바이낸스의 거래 시세를 비교 하여 현재 김치 프리미엄을 계산하여 제공함. 사이트 링크 : 김프다닷컴(kimpda.com)
08 March 2021
젠킨스 + 스프링 배치를 사용한지도 꽤 되었습니다. 기존에 사용 하고 있던 Cron 기반의 반복 처리 되고 있는 배치 서비스들이 전부 젠킨스 + 스프링배치에 녹아 들어 왔습니다. 편하게 사용을 하다보니 배치의 경계가 조금 무뎌지고 일 배치 뿐만 아니라 조금 더 빈번 하게 동작 해야하는 배치 서비스도 젠킨스 + 스프링배치를 통해서 구성...
14 October 2020
젠킨스 SSH 연결을 위한 SSH Key 생성 및 설정에 대한 기록 입니다. Jenkins Plugins Jenkins 관리 > 플러그인 관리 > 설치 가능 Publish Over SSH Git Github Github API Maven Integration SSH Key 생성 하기 배포 서버에서 타겟서버로 배포 하기 위해서는 배포서버(Jenkins Server) 의 SSH KEY 가 필요합니다. $ cd...
14 October 2020
젠킨스 node.js 설정을 위한 기록입니다. 배포 서버에 npm or node 를 설치 하지 않고 jenkins plugin 을 통해서 사용하는 방법입니다. Jenkins Plugins Jenkins 관리 > 플러그인 관리 > 설치 가능 NodeJS Plugin NodeJS 설정하기 Jenkins 관리 > Global Tool Configuration > NodeJS 아래 이미지를 참고 하여 해당되는 NodeJS 버전을 선택...
20 January 2020
이전 포스팅에 이어서 백준 알고리즘의 동적계획법 카테고리에 있는 알고리즘 문제를 풀고 있습니다. 이번 문제도 동일하게 동적계획법을 통해서 해결 할 수 있습니다. 문제 - 피보나치 함수 (백준 알고리즘 - 1003) 문제 링크 : https://www.acmicpc.net/problem/1003 풀이 피보나치 함수 처리 메소드에서 동적 계획법을 추가 하여 검색 효율 증가 시켜야지 시간 초과를 해결 할...
19 January 2020
이전 포스팅에서 알고리즘 문제중 재귀 문제 4가지를 확인 했습니다. 이번에는 동적 계획법을 통해서 어떻게 더 효율적으로 결과를 출력 할 수 있는지에 대해서 확인 해보겠습니다. 동적 계획법이란? DP(Dynamic Programming) 특정 범위까지의 값을 구하기 위해서 그것과 다른 범위까지의 값을 이용하여 효율적으로 값을 구하는 알고리즘 설계 기법입니다. 이 알고리즘은 이미 계산된 값을 메모리에...
15 January 2020
2020년 첫 알고리즘 풀이. 백준 알고리즘 문제의 재귀 카테고리에 있는 4가지 유형의 문제입니다. 재귀 알고리즘은 매우 기초적이지만 자주 헤깔릴 수 있는 알고리즘으로 아래 4가지 유형의 문제 풀이를 보고 되뇌여 보겠습니다. 문제4 - 하노이 탑 이동 순서 문제 링크 : https://www.acmicpc.net/problem/11729 풀이 하노이의 탑은 퍼즐을 일종으로 세 개의 기둥에 N개의 원판이...
15 January 2020
2020년 첫 알고리즘 풀이. 백준 알고리즘 문제의 재귀 카테고리에 있는 4가지 유형의 문제입니다. 재귀 알고리즘은 매우 기초적이지만 자주 헤깔릴 수 있는 알고리즘으로 아래 4가지 유형의 문제 풀이를 보고 되뇌여 보겠습니다. 문제3 - 별찍기 문제 링크 : https://www.acmicpc.net/problem/2447 풀이 별찍기 문제는 주어진 별 그림을 보고 패턴을 분석 하여 결과를 출력 하는...
15 January 2020
2020년 첫 알고리즘 풀이. 백준 알고리즘 문제의 재귀 카테고리에 있는 4가지 유형의 문제입니다. 재귀 알고리즘은 매우 기초적이지만 자주 헤깔릴 수 있는 알고리즘으로 아래 4가지 유형의 문제 풀이를 보고 되뇌여 보겠습니다. 문제1 - 팩토리얼 문제 링크 : https://www.acmicpc.net/problem/10872 풀이 팩토리얼 알고리즘은 주어진 정수의 모든 원소를 곱한 값을 출력하는 문제입니다. 주어진 정수...
29 December 2019
자바 NIO 의 ByteBuffer 의 사용을 편리하게 사용 할 수 있도록 기능을 제공하는 API 가 바로 네티의 데이터 컨테이너인 ByteBuf 입니다. ByteBuf 의 기능을 살펴 보고 사용하는 방법에 대해서 살펴 보겠습니다. ByteBuf 의 장점은? ByteBuf 는 순차적인 두가지 포인트 변수(readerIndex, WriterIndex)를 제공 하여 읽기 쓰기 전환 없이 사용이 가능 합니다....
29 December 2019
고성능 자바 서버를 만들기 위해 네티 학습 두번째 포스팅 입니다. 이번 포스팅에서는 네티의 핵심 인터페이스에 대해서 정리 해보겠습니다. 네티의 핵심 인터페이스(Channel, EventLoop, ChannelFuture, ChannelHandler, ChannelPipeline) Channel Channel 인터페이스는 네티의 소켓이나 I/O 의 처리가 가능한 읽기, 쓰기, 연결하기, 바인딩 과 같은 기능을 제공하는 인터페이스 입니다. Channel 은 아래의 기능을 제공 합니다....
22 December 2019
자바 네트워크 프로그래밍에서 매우 유명한 프레임워크인 Netty 를 이용 해서 서버 & 클라이언트 프로그래밍을 하는 방법을 알아보는 첫번째 포스팅 입니다. 서버 어플리케이션 개발을 하면서 Netty는 알고 있었지만 대부분의 서버 어플리케이션이 Java.Nio API 로 개발이 되어 있어 Netty를 사용해 보지 못하였기 때문에 “네티 인 액션” 도서를 학습하면서 정리 해보겠습니다. 네티란?? 네티는...
25 November 2019
OAuth2 토큰 발급 이전 포스팅에서 SpringBoot OAuth2 를 이용하여 소셜 에서 인증을 받아서 나의 사이트에 로그인을 하는 기능을 살펴 보았습니다. 이번에는 third party 앱에서 나의 사이트에 접속하여 토큰을 발급 받고 인증을 할 수 있는 서버 기능을 추가 해보겠습니다. 환경 구성 기본 환경 Spring-boot 2.2.1.RELEASE JDK 1.8 이상 Maven 사용 가능한...
19 November 2019
OAuth2 ?? OAuth2 란 Open Authorization , Open Authentication 를 뜻하는 것으로 Third party 에게 자원을 공유하거나 인증을 처리 해주는 표준 프로토콜 입니다. OAUth2에는 크게 토큰을 발급 할수 있는 서버 기능과 토큰을 이용한 인증 기능을 하는 기능으로 나뉘게 됩니다. 이번 시간에는 앞서 스프링 시큐리티에서 로그인 기능을 구현 하였기 때문에 해당...
19 November 2019
스프링 시큐리티?? 스프링 시큐리티는 어플리케이션의 보안을 위해 권한(Authorization)과 인증(Authentication) 에 대한 기능을 제공 합니다. 권한(Authorization)은 URL을 사용할 수 있는 권한을 말하며 인증(Authentication) 은 어플리케이션에 로그인 할 수 있는 기능을 말합니다. 허용되지 않은 페이지에 사용자가 접근 할 경우 스프링 시큐리티는 페이지 호출 전에 인증이 되어있는 지를 체크 하고 페이지에 접근 할...
18 November 2019
이번에는 스프링을 이용해서 예약 작업을 만드는 방법에 대해서 정리 해보겠습니다. 예약 작업은 특정 시간이나 반복되는 시간에 업무를 처리하는 어플리케이션입니다. 스프링에서는 예약 작업 기능을 제공함으로서 예약 작업을 편리하게 만들 수 있습니다. 환경 구성 기본 환경 Spring-boot 2.2.1.RELEASE JDK 1.8 이상 Maven 사용 가능한 IDE H2 Database 예제 소스 : https://github.com/ParkHyeokJin/SpringRepo/tree/master/Spring-Scheduler 기능...
17 November 2019
오늘은 매우 쉽고 간단한 스프링 배치 어플리케이션을 만들어 보겠습니다. 배치는 매우 중요한 서비스 입니다. 실시간으로 처리 하지 못하는 대량의 업무를 배치로 처리를 하고 있기 때문에 배치 개발을 알아 두는 것은 필수입니다. 환경 구성 기본 환경 Spring-boot 2.2.1.RELEASE JDK 1.8 이상 Maven 사용 가능한 IDE H2 Database 예제 소스 : https://github.com/ParkHyeokJin/SpringRepo/tree/master/JPA-Exam12-Batch...
13 November 2019
스프링 RestAPI를 통하여 회원 가입, 확인, 삭제 기능을 웹서비스를 만들어서 스프링 RestAPI 에 대한 사용 방법을 배워 보겠습니다. 스프링부트 웹서비스 만들기(RestAPI) 기본 환경 Spring-boot 2.2.1.RELEASE JDK 1.8 이상 Maven 사용 가능한 IDE 예제 소스 : https://github.com/ParkHyeokJin/SpringRepo/tree/master/JPA-Exam11-RestApi 기능 정의 회원 등록 기능(PUT) 회원 확인 기능(GET) 회원 삭제 기능(DELETE) pom.xml <dependencies> <dependency>...
13 November 2019
이번에는 앞서 공부 했던 JPA 와 스프링부트를 이용해서 웹사이트 로그인 부분을 만들어 보도록 하겠습니다. 매우 기본 적인 기능으로 로그인과 회원 가입 기능을 JPA 를 이용해서 사용 해보도록 하겠습니다. 스프링부트 + JPA 웹사이트 로그인 만들기 기본 환경 기본 환경은 앞선 포스팅 참조 : https://parkhyeokjin.github.io/jpa/2019/11/08/JPA-chap11.html 예제 소스 : https://github.com/ParkHyeokJin/SpringRepo/tree/master/JPA-Exam10 기능 정의 로그인...
08 November 2019
이번에는 스프링 프레임워크에서 JPA를 사용 하는 방법에 대해서 정리 해보겠습니다. 스프링 프레임워크 프로젝트에서 스프링 데이터 JPA를 얼마나 효율적이고 간단하게 사용이 가능 한지 기능 별로 살펴 보겠습니다. 스프링 데이터 JPA 개발 환경 구성 환경 Spring-boot 2.2.1.RELEASE JDK 1.8 Maven Eclipse IDE 라이브러리 설정 pom.xml 의존성 추가 <!-- h2 database --> <dependency>...
08 November 2019
JPA 의 EntityManager.find() 기능으로 내가 원하는 검색을 하기에는 어려운 점이 많습니다. 다양한 조회 조건으로 검색을 해야 원하는 결과를 얻을 수 있습니다. 이럴 경우 엔티티 객체를 대상으로 검색을 할 수 있도록 하는 방법이 JPQL(Java persistence Query Language) 입니다. JPQL은 아래와 같은 방법으로 작성 할 수 있습니다. 기능 설명 JPQL Criteria...
07 November 2019
값타입 JPA 값 타입에는 JAVA 의 기본 값타입 (int, String)이 있고 사용자가 직접 정의한 임베디드(embedded type) 값 타입과 컬렉션(collection) 값 타입이 있습니다. 오늘은 이 값 타입에 대해서 정리 해보겠습니다. 임베디드(embedded type) 값 타입 임베디드 값 타입 사용(@Embedded) 사용자가 직업 정의한 값 타입을 임베디드(embedded type) 값 타입 이라고 합니다. 회원 정보...
06 November 2019
영속성 전이 (CASCADE) 란? 영속성 전이 (CASCADE) 란 특정 엔티티를 영속성 상태로 만들때 연관되어진 엔티티도 함께 영속성 상태로 변경 하는 것을 말합니다. 아래 예를 살펴 보겠습니다. Shop shop = new Shop(); shop.setName("JPA마켓"); em.persist(shop); //영속성 상태변경 Shop_Payments payment = new Shop_Payments(); payment.setName("JPA간편페이"); payment.setShop(shop); em.persist(payment); //영속성 상태변경 Shop_Order order = new Shop_Order();...
05 November 2019
JPA 프록시(Proxy) 란? JPA 에서는 find() 명령어를 사용하여 조회 할때 항상 데이터베이스를 조회하는 것은 아닙니다. 아래 case1 과 case2를 살펴 보겠습니다. case1 public void findMemberAndTeacher(String id){ Member member = em.find(Member.class, id); Teacher teacher = member.getTeacher(); System.out.println("회원의 강사 : " + teacher.getName()); } case2 public void findMemberAndTeacher(String id){ Member member =...
05 November 2019
문제 문제 링크 : https://www.acmicpc.net/problem/5430 풀이 이 문제는 앞뒤로 입출력이 가능한 자료 구조인 덱(deque) 을 활용 하여 풀이하면 쉽게 풀 수 있다. R : 방향을 변경할때 배열을 돌리려고 하면 시간초과가 뜨기 때문에 변수(dir)를 선언 하여 방향을 저장 한다. D : 방향(dir) 에 따라서 firstPoll(), LastPoll() 을 활용하여 앞 뒤로 큐를...
04 November 2019
문제 문제 링크 : https://www.acmicpc.net/problem/1966 풀이 Queue의 어떤 위치에 있는지를 알려주는 M(0이상 N미만) 이 무엇을 의미 하는지 이해하는데 한참이 걸렸다. M 은 예제로 주어진 우선순위 문서의 위치 값을 나타낸다. 예) 1 1 9 1 1 1 우선순의에서 M : 0 을 주었때에 가장 첫번째 있는 1을 말하는 것이다. 입력 :...
03 November 2019
문제 문제 링크 : https://www.acmicpc.net/problem/11866 풀이 두개의 큐를 생성하여 풀이 진행 K 번째 의 수를 queue에서 빼서 rQueue 로 이동 시키면서 반복 처리. 소스 조세퍼스(11866) public class Baekjoon_11866 { public static Queue<Integer> queue = new LinkedList<>(); public static Queue<Integer> rQueue = new LinkedList<>(); public static void main(String[] args) throws IOException...
03 November 2019
문제 1 문제 링크 : https://www.acmicpc.net/problem/2164 풀이 큐를 이용해서 쉽게 풀이가 가능 소스 카드2(2164) public class Baekjoon_2164 { public static Queue<Integer> queue = new LinkedList<>(); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int N = scanner.nextInt(); for(int i = 1; i <= N; i++) { queue.add(i);...
28 October 2019
조인 테이블 데이터베이스 테이블의 연관관계를 설계 하는 방법은 크게 두가지 입니다. 첫 번째는 앞서 복합키 매핑에서 살펴 보았듯이 외래키를 가지고 연관관계를 설계 하는 조인 컬럼 방법과 테이블과 테이블 사이에 별도의 조인 테이블을 만들어 양 테이블간의 연관관계를 설정 하는 방법이 있습니다. 이번 시간에는 조인테이블을 만들어서 테이블간의 연관 관계를 설정하는 방법에 대해서...
28 October 2019
복합키 매핑 데이터베이스의 테이블을 설계 할때에는 식별관계와 비식별관계 두가지 방법으로 설계를 할 수 있습니다. 식별 관계와 비식별 관계에 대해서 정리 해보도록 하겠습니다. 식별관계와 비식별관계 식별관계 식별관계 매핑은 부모테이블의 키를 자식테이블이 내려 받아서 기본키 + 외래키 형태로 사용 하는 매핑 방식 입니다. 부모의 키가 자식 테이블로 상속 되면서 테이블의 키가 많아지는...
23 October 2019
상속관계 매핑 전략 이번시간 에는 JPA 연관관계 매핑의 상속관계 매핑 전략 대해서 정리 해보도록 하겠습니다. @Inheritance : JPA 연관관계 매핑의 상속 관계에서 전략을 지정하는 어노테이션입니다.. @Inheritance 전략 옵션 정보 Enum TYPE 전략 정보 InheritanceType.JOINED 조인전략 자식 테이블이 부모의 키를 받아서 외래키로 사용하는 전략 InheritanceType.SINGLE_TABLE 단일테이블전략 단일 테이블에 부모 자식 데이터가...
23 October 2019
JPA 연관관계 매핑 JPA 연관관계 매핑 - 단방향매핑 에서 JPA의 방향성에 대해서 알아보았다. 이번에는 회원관리 엔티티를 이용 하여 양방향 매핑에 대해서 알아보자. 양방향 매핑 회원 엔티티의 속성은 아래와 같다. 회원은 한명의 강사에 소속되어 있다. 회원과 강사는 다대일(N:1) 관계이다. 강사 엔티티의 속성은 아래와 같다. 강사는 여러명의 회원이 등록 되어 있다. 강사와...
22 October 2019
JPA 연관관계 매핑 엔티티들은 어떠한 키를 기준으로 여러 엔티티와 연관 관계를 가지고 있다. JPA 의 객체 관계 매핑은 이해 하지 못하면 매우 어렵다. JPA 에서의 연관관계는 크게 아래와 같다. 1) 방향성(Direction) 단방향 : 회원정보 -> 강사 또는 강사 -> 회원정보 중 한 쪽만 참조되는 경우 양방향 : 회원정보 -> 강사,...
21 October 2019
문제 문제 링크 : https://www.acmicpc.net/problem/1780 풀이 앞선 쿼드 트리 문제는 배열을 반으로 계속 잘라 가며 숫자를 비교 했다면 이 문제는 배열을 1/3 로 잘라가면서 비교를 하는 방식이다. 쿼드 트리의 이해와 배열의 이해가 있으면 쉽게 풀이가 가능 하다. 종이의 갯수을 카운트 하기 위한 3개의 int 변수 선언(int minus, zero, one) 종이를...
20 October 2019
Jekyll 초안 활용 하기(drafts) Jekyll 을 이용한 블로그의 디렉토리 구조는 아래와 같다. . ├── _config.yml ├── _data | └── members.yml ├── _drafts | ├── begin-with-the-crazy-ideas.md | └── on-simplicity-in-technology.md ├── _includes | ├── footer.html | └── header.html ├── _layouts | ├── default.html | └── post.html ├── _posts | ├── 2007-10-29-why-every-programmer-should-play-nethack.md |...
20 October 2019
문제 문제 링크 : https://www.acmicpc.net/problem/1992 풀이 이 문제는 앞선 색종이 자르기https://parkhyeokjin.github.io/algorithm/2019/08/22/baekjoon-2630.html 를 풀어 보았다면 쿼드 트리를 이용해서 쉽게 해결 할 수 있다. 쿼드 트리는 4개의 자식 노드를 가지는 트리 구조이다. 영상 입력 처리 readData(reader, N) 재귀 함수(cut()) 를 이용 하여 4부분으로 반복적으로 자른다. 잘려진 영역의 문자열이 동일할 경우 압축 한다....
20 October 2019
JPA 영속성(persistence context) 영속성 컨텍스트는 엔티티를 영구적으로 저장하는 환경이라는 뜻으로 엔티티 매니저는 엔티티를 저장하거나 조회 할때 이 영속성 컨텍스트에 엔티티를 보관하고 관리한다. 영속성 컨텍스트는 논리적인 개념이기 때문에 해당 부분을 이해하지 않으면 데이터를 저장을 했는데 저장이 안되거나 하는 경험을 하게 된다. 영속성 컨텍스트에 대해 하나씩 알아보자. 1. 엔티티 매니저 팩토리(EntityManagerFactory)와 엔티티...
17 October 2019
Eclipse, H2 DataBase 설치 JPA 테스트를 하기 위해서 이클립스와 H2 database 를 설치 하자. Eclipse 설치(or intellij) 다운로드 경로 : https://www.eclipse.org/downloads/ H2 DataBase H2 Database 는 자바로 작성되어 별도의 설치 과정이 없고 2M 이하의 매우 가벼운 데이터 베이스이기 때문에 간단한 프로젝트를 개발 할때 매우 유용하다. 다운로드 경로 : https://www.h2database.com/html/download.html 설치...
17 October 2019
JPA (Java Persistent API)란? 자바 어플리케이션을 개발을 하면서 JDBC + myBatis 를 이용한 개발을 주로 다루었다. xml 에 쿼리를 작성 하고 entity 로 맵핑을 하고 메서드에서 객체를 가지고 로직을 구현 하는 것에 대부분의 개발 시간을 소요 하게 되었고 테이블이나 쿼리에 수정사항이 발생하면 xml에서 부터 메서드 까지 모든 부분을 수정 해야...
15 October 2019
문제 문제 링크 : 이분탐색-K번째 수 https://www.acmicpc.net/problem/1300 풀이 이 문제는 어떻게 이분 탐색으로 접근을 해야 할지 아무리 머리를 굴려도 모르겠어서 문제 풀이를 좀 살펴 보고 이해를 해야 했다. 배열을 정렬 해서 K 번째 배열 값을 출력 하면 될 문제인데 … 이 문제가 어떻게 이분 탐색으로 되지??? 풀이 시작 첫번째. 배열의...
15 October 2019
저는 현재 개발운영파트(?)에 소속 되어있다 보니 개발도 하고 운영도 하고 있습니다. 매일 아침 출근 해서 처음 하는 일이 각 운영 서버에 접속 해서 간밤에 별일이 없었는지 서버별로 체크를 하는 반복적인 작업을 하는 것으로 하루 일과를 시작합니다. 서버 로그를 감지하는 솔루션이 있지만 운영팀의 숙명(?)인지 아직 사람 눈으로 매번 체크를 해야 합니다.(부장님이...
14 October 2019
젠킨스 파이프라인 젠킨스 파이프라인은 연속된 작업을 연결 해놓은 젠킨스의 자동화 된 프로세스를 표현 하는 말입니다. 이전 Jenkins + Git + Maven 환경 구성 해서 작업 생성 해보기 에서 젠킨스 환경을 구성 해서 젠킨스 파이프라인을 통해서 빌드 하는 환경을 맛보기 해보았습니다. 젠킨스 파이프라인은 Groovy 문법을 사용 하기 때문에 디테일한 부분은 따로...
13 October 2019
문제 문제 링크 : 이분탐색-공유기 설치 https://www.acmicpc.net/problem/2110 풀이 이 문제는 어떻게 이분 탐색으로 접근을 해야 할지 한참을 생각 해야 했다. 첫번째로 주어진 갯수 만큼 공유기를 설치해야 하고. 두번째로 공유기가 설치 된 집간의 거리를 구해서 거리를 측정해야한다… 문제를 해결 할 수 있었던 방법은 이분탐색의 mid 값을 집간의 거리 로 생각 하고...
10 October 2019
문제 문제 링크 : 이분탐색-나무 자르기 https://www.acmicpc.net/problem/2805 풀이 이 문제는 랜선자르기(https://parkhyeokjin.github.io/algorithm/2019/10/09/baekjoon-1654.html) 에서 고민을 많이 한 덕에 조금 쉽게 접근을 하였으나 문제를 정확히 분석 하지 못한 탓에 수자례 실패를 맛봐야 했다. 실수1. 상근이는 항상 나무를 가져갈 수 있다. 필요한 나무가 M 이지만 더 많이 가져 갈 수 있고 딱 맞게 가져갈...
09 October 2019
문제 문제 링크 : 이분탐색-랜선 자르기 https://www.acmicpc.net/problem/1654 풀이 이 문제는 정말정말 매우 어려웠다. 두가지 문제점때문에 몇번을 틀리고 시간을 소모 했다. 첫번째 int 선언 -> 랜선의 최대 길이가 N <= 2³¹-1 이므로 전체 길이를 더했을 때 int 최대 범위를 벗어 날 수 있음. 두번째 문제에서 주어진 n 개만큼만 구하면 되는줄 알고...
07 October 2019
젠킨스 오프라인 설치 스토리 나의 업무 환경은 인터넷망과 업무망이 구분 되어있고 서버의 경우 인아웃바운드의 차단 정책이 매우매우매우 폐쇄적이다. 젠킨스는 커녕 메이븐 레파지토리는 물론 깃허브는 …… 어쨋든 다행이 몇몇 기능을 빼고는 오프라인 구성이 가능 하기때문에 오프라인 구성을 하는 방법을 정리 해본다. 젠킨스 설치 젠킨스 설치는 아래 경로에서 해당 OS에 맞는 버전을...
06 October 2019
문제 문제 링크 : 이분탐색-숫자 카드2 https://www.acmicpc.net/problem/10816 풀이 첫번째. 입력 데이터를 배열 처리 두번째. 이분 탐색을 위해 카드뭉치 정렬(Arrays.sort(cards)) 세번째. 정렬된 카드 뭉치(cards) 에서 찾고자 하는 숫자(num)가 시작 되는 배열의 index를 찾는다(findLeft()) 네번째. 정렬된 카드 뭉치(cards) 에서 찾고자 하는 숫자(num) 보다 처음 큰수가 나오는 index를 찾는다(findRight()) 다섯째. findRight - findLeft...
01 October 2019
문제 문제 링크 : 이분탐색-수 찾기 https://www.acmicpc.net/problem/1920 풀이 이 문제를 풀기 전에 이분탐색에 대해서 알아보자. 이분 탐색 설명 : https://parkhyeokjin.github.io/algorithm/2019/10/01/binarySearchAlgorithm.html 이 문제는 이분 탐색을 알면 쉽게 풀 수 있다. 숫자들의 집합 (aLen) 찾아야 되는 숫자의 집합 (bLen) 이분탐색은 정렬되어있는 배열 에서 찾는 탐색 방법으로 aLen을 오름 차순으로 정렬한다. bLen 의...
01 October 2019
1. 이진 검색 알고리즘(Binary Search Algorithm) 이진 검색 알고리즘은 이미 정렬 되어 있는 배열에서 특정한 값의 위치를 찾는 알고리즘 이다. 탐색 방법 예) int[] arr = new int[] {9, 7, 2, 1, 5, 8, 3, 6, 4} 탐색 조건 : 3번 숫자 찾기 1) 배열을 오름 차순으로 정렬한다. 2) 정렬된...
01 October 2019
Jenkins 신규 프로젝트 서버를 신규 구축 할 일이 생겨서 간단하게 설치 부터 기초 파이프라인 실행 까지의 작업을 정리해보았습니다. 1. Jenkins, Git, Maven 설치 하기 설치 환경 필수 정보 256 MB of RAM, although more than 512MB is recommended 10 GB of drive space (for Jenkins and your Docker image) Java...
26 September 2019
ELK 란? ELK 란 Elastic Search, Kibana, Logstash 를 말한다. ELK Stack 이란? ELK 기능에 Beats가 더해져서 Stack 이라고 말한다. Beats : 데이터 수집기로 로그 파일, 네트워크 데이터, 이벤트 로그, 감사데이터 등등을 수집하여 Elastaic Search 나 Logstash로 전송 한다. Elastic Search 란? 분산 검색 엔진으로 Logstash 로 부터 수집된 데이터를...
26 September 2019
우아한 스프링 배치 테크 세미나 소식에 고민 1도 없이 신청서를 작성 해서 신청 했는데 운좋게 참석 할 수 있어서 다녀 왔다. 개발 하면서 매우 도움을 많이 받았던 블로그의 주인인 jojoldu 님 께서 발표를 해주셨고 기본편 & 활용편으로 나누어 진행 되었다. 잊어버리기 전에 빨리 기록을 남긴다. 전반전 : 기본편 배치 어플리케이션이란?...
24 September 2019
문제 문제 링크 : (가운데를 말해요) https://www.acmicpc.net/problem/1655 수빈이는 동생에게 “가운데를 말해요” 게임을 가르쳐주고 있다. 수빈이가 정수를 하나씩 외칠때마다 동생은 지금까지 수빈이가 말한 수 중에서 중간값을 말해야 한다. 만약, 그동안 수빈이가 외친 수의 개수가 짝수개라면 중간에 있는 두 수 중에서 작은 수를 말해야 한다. 예를 들어 수빈이가 동생에게 1, 5, 2,...
23 September 2019
문제 문제 링크 : (절대값 힙) https://www.acmicpc.net/problem/11286 절댓값 힙은 다음과 같은 연산을 지원하는 자료구조이다. 배열에 정수 x (x ≠ 0)를 넣는다. 배열에서 절댓값이 가장 작은 값을 출력하고, 그 값을 배열에서 제거한다. 절댓값이 가장 작은 값이 여러개일 때는, 가장 작은 수를 출력하고, 그 값을 배열에서 제거한다. 프로그램은 처음에 비어있는 배열에서 시작하게...
22 September 2019
Maven을 이용한 프로젝트 배포시 War의 경우는 자동으로 WEB-INF/lib 에 Dependency 라이브러리들이 복사가 되지만 Jar Package 할 경우에는 Class & Resoueces 만 패키징 된다. 이 경우 Dependency Lib 를 관리 하는데 두가지 방법이 있다. 1. 특정 디렉토리에 Dependency Lib 파일 복사 Maven Dependency Plugin에 아래 명령어를 추가 하면 지정된 디렉토리에 Dependency...
18 September 2019
문제 문제 링크 최대힙 : https://www.acmicpc.net/problem/11279 최소힙 : https://www.acmicpc.net/problem/1927 풀이 풀이) 이번 문제는 여러 가지로 도전을 하였으나 속도 제한에 걸려서 조금 고민을 하였다. 정렬을 하는 부분에 있어서 힙정렬 퀵정렬을 메소드 등을 이용하여 정렬을 해서 처리하려고 했으나 결국에는 PriorityQueue 자료 구조를 이용해서 처리를 해서 성공을 하였다. 소스 최대힙 import java.io.BufferedReader; import...
18 September 2019
브루트포스(brute-force) 브루트포스란? brute는 “짐승같은, 난폭한”이라는 뜻이고, brute-force는 “난폭한 힘, 폭력”이라는 뜻이다. 암호학 용어로는 brute-force attack 또는 exhaustive key search, 우리말로는 노가다 또는 무차별 대입 공격이라 부른다. 주로 암호학에서도 쓰이는 방법이긴 하지만, 굳이 암호학만의 문제는 아니고 다른 알고리즘 분야에서도 사용되고 있다. 간단하게 말하자면 노가다와 다굴을 논리적이고 과학적으로 하는 방식. 특징 조합...
17 September 2019
브루트포스(brute-force) 브루트포스란? brute는 “짐승같은, 난폭한”이라는 뜻이고, brute-force는 “난폭한 힘, 폭력”이라는 뜻이다. 암호학 용어로는 brute-force attack 또는 exhaustive key search, 우리말로는 노가다 또는 무차별 대입 공격이라 부른다. 주로 암호학에서도 쓰이는 방법이긴 하지만, 굳이 암호학만의 문제는 아니고 다른 알고리즘 분야에서도 사용되고 있다. 간단하게 말하자면 노가다와 다굴을 논리적이고 과학적으로 하는 방식. 특징 조합...
09 September 2019
브루트포스(brute-force) 브루트포스란? brute는 “짐승같은, 난폭한”이라는 뜻이고, brute-force는 “난폭한 힘, 폭력”이라는 뜻이다. 암호학 용어로는 brute-force attack 또는 exhaustive key search, 우리말로는 노가다 또는 무차별 대입 공격이라 부른다. 주로 암호학에서도 쓰이는 방법이긴 하지만, 굳이 암호학만의 문제는 아니고 다른 알고리즘 분야에서도 사용되고 있다. 간단하게 말하자면 노가다와 다굴을 논리적이고 과학적으로 하는 방식. 특징 조합...
08 September 2019
브루트포스(brute-force) 브루트포스란? brute는 “짐승같은, 난폭한”이라는 뜻이고, brute-force는 “난폭한 힘, 폭력”이라는 뜻이다. 암호학 용어로는 brute-force attack 또는 exhaustive key search, 우리말로는 노가다 또는 무차별 대입 공격이라 부른다. 주로 암호학에서도 쓰이는 방법이긴 하지만, 굳이 암호학만의 문제는 아니고 다른 알고리즘 분야에서도 사용되고 있다. 간단하게 말하자면 노가다와 다굴을 논리적이고 과학적으로 하는 방식. 특징 조합...
05 September 2019
브루트포스(brute-force) 브루트포스란? brute는 “짐승같은, 난폭한”이라는 뜻이고, brute-force는 “난폭한 힘, 폭력”이라는 뜻이다. 암호학 용어로는 brute-force attack 또는 exhaustive key search, 우리말로는 노가다 또는 무차별 대입 공격이라 부른다. 주로 암호학에서도 쓰이는 방법이긴 하지만, 굳이 암호학만의 문제는 아니고 다른 알고리즘 분야에서도 사용되고 있다. 간단하게 말하자면 노가다와 다굴을 논리적이고 과학적으로 하는 방식. 특징 조합...
22 August 2019
백준 알고리즘_2630(색종이 만들기) 문제 링크 : https://www.acmicpc.net/problem/2630 주어진 네모 배열을 재귀함수를 활용 하여 반복적으로 잘라서 동일한 색깔의 종이가 나올때까지 반복 수행 하는 문제 이다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Baekjoon_2630 { private static int whiteCnt = 0; private static int blueCnt = 0; public static void main(String[]...
20 August 2019
1. 계수 정렬 알고리즘(Counting Sort) 현재까지 개발이 된 정렬 알고리즘은 O(n log n) 의 속도를 가지고 있는 퀵정렬, 힙정렬, 병합 정렬이 가장 빠르다. 하지만 어떠한 특정한 조건 이 된다면 O(n) 의 속도를 보이는 정렬이 바로 계수정렬이다. 어떠한 조건에 의해 정렬이 되는지 알아보자. 정렬 방법 이전의 정렬 방법들은 전부 위치를 교환...
19 August 2019
1. 병합 정렬 알고리즘(Merge Sort) 병합정렬은 분할 정복 알고리즘이다. 병합 정렬 알고리즘은 정확히 반씩 나누어 계산을 하기 때문에 최악의 경우에도 O(n log n)의 동일한 속도를 보장 한다. 정렬 순서 예1) 3,5,1,2,4,8,6,9,7,10 배열을 오름차순으로 정렬 하려고 할 경우 1) 병합 정렬은 항상 반으로 쪼개어 정렬을 수행 한다. (2의 배수) 0 1...
16 August 2019
1. 힙정렬 알고리즘(Quick Sort) 우선 힙정렬을 이해하기 위해서는 이진트리 구조를 이해해야 한다. 이진트리 이진트리란 루트(root) 노드 부터 시작해서 최대 두개의 자식 노드를 가지는 트리 구조를 말한다. 힙(Heap) 이란 최소값이나 최대값을 빠르게 찾아내기위한 완전 이진트리를 기반으로 하는 트리입니다. 힙에는 최대 합과 최소합이 존재하는대 최대 합은 부모노드가 자식노드보다 큰합이라고 할 수 있습니다....
14 August 2019
1. 퀵정렬 알고리즘(Quick Sort) 퀵 정렬(Quicksort)은 찰스 앤터니 리처드 호어가 개발한 정렬 알고리즘이다. 다른 원소와의 비교만으로 정렬을 수행하는 비교 정렬에 속한다. 일반적인 상황에서 최고의 정렬 성능을 보인다. 프로그래밍에 가장 많이 구현된 정렬 알고리즘 중 하나이다. 퀵 정렬은 분할 정복(divide and conquer) 방법을 통해 리스트를 정렬한다. 정렬 순서는 아래와 같다. 리스트...
13 August 2019
1. 선택정렬 알고리즘(Selection Sort) 선택 정렬 알고리즘은 제자리 정렬 알고리즘의 하나로, 선택한 수를 가장 작은 수와 자리를 교체 하는 방법으로 정렬을 한다. 선택 정렬 알고리즘은 다음의 순서로 이루어진다. 예) 3,5,1,2,4,8,6,9,7 배열을 오름차순으로 정렬 하려고 할 경우 1) 3 5 1 2 4 8 6 9 7 3─1─────┤ 3을 선택 하여...
09 August 2019
[MyBatis] org.apache.ibatis.reflection.ReflectionException Exception 기록을 위한 채널입니다. error:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Error instantiating class 클래스명 with invalid types () or values (). Cause: java.lang.NoSuchMethodException: 클래스명() 해결 MyBatis 연동 도중 위와 같은 Exception 발생 해당 오류는 Default Constructor 가 없어 발생 하는 오류로 확인. public class TestBean{ private long seq; private...
06 August 2019
JDK 12 features (Switch Expressions) JEP 325 : Switch Expressions (Preview) 자바의 오래된 스위치 식은 여러 가지 문제점을 가지고 있습니다. 장황한 break 문, 시각적인 노이즈 발생, 디버깅의 어려운점을 예로 들 수 있습니다. JDK 12 에서는 이러한 전통적인 스위치 식을 개선하여 개발자의 코딩을 향상 시킵니다. 어떤 부분이 향상 되었는지 알아보도록 하겠습니다....
01 August 2019
Effective Java E/3 학습을 하며 정리 하는 글입니다. 지역변수를 최소화 하라. 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 지역변수의 볌위를 줄이는 방법 가장 처음 쓰일 때 선언 하라. 선언과 동시에 초기화 하라. 메서드를 작게 유지하고 한 가지 기능에 집중 하라. 전통적인 for 문보다 for-each 문을...
24 July 2019
프로젝트를 전달 받았는데 프로젝트관리도구도 없고…배포도 수작업으로 말아서 하고 있고 라이브러리도 /project/libs 폴더에 버전별로 마구잡이로 들어있었다. 맙소사….. 버전관리는 SVN으로 관리 하고는 있다. 하지만 Commit history를 제대로 기입 해놓지 않았다….. 일단 이클립스에 셋팅을 위해 SVN에서 소스를 받았다. 오류가 마구 발생한다. 컴파일 버전은 몇 버전이지.. 일단 라이브러리 폴더에서 라이브러리들을 참조 한다. 아….라이브러리가 버전별로...
18 July 2019
StringJoining.class and String.join() 여러 문자열 리터럴 또는 객체를 연결 하는 것은 프로그래밍에서 일반적인 요구 사항이다. 오랫동안 JDK API에서는 여러 문자열 리터럴 또는 객체를 연결 하는 방법이 없었기 때문에 별도로 개발을 해야 했다. 아래와 같은 요건이 주어졌을 경우를 생각해보자. 요건 1 : {“hello”, “java”, “World”}의 문자열 배열이 있다. 이 문자열 배열을...
12 July 2019
Effective Java E/3 학습을 하며 정리 하는 글입니다. 생성자를 관리 하는 여러가지 방법 private 생성자나 열거 타입으로 싱글턴임을 보증하라. 인스턴스를 오직 하나만 생성 할 경우 싱글턴 을 많이 사용 한다. 여러가지 싱글턴 생성 방식을 살펴보자. 예1) public static final 방식의 싱글턴 public class SingletonClass { public static final SingletonClass INSTANCE...
10 July 2019
Effective Java E/3 학습을 하며 정리 하는 글입니다. 생성자에 매개변수가 많다면 빌더를 고려하라. 생성자에 매개 변수가 많을 경우 어떻게 하는가? 아래와 같이 점층적 생성자를 통해 생성 할 수 있다. public class MoonbucksCoffee { private String size; //필수 private int shot; //필수 private int water; //필수 private boolean syrup; //선택 private...
09 July 2019
Effective Java E/3 학습을 하며 정리 하는 글입니다. 생성자 대신 정적 팩터리 메서드를 고려하라. Effective Java 에서는 생성자 대신 정적 팩터리 메서드를 고려 하라고 설명한다. 정적 팩터리 메서드가 무엇인지 알아보자. 일반적으로 클라이언트가 클래스의 인스턴스를 생성 하기 위해서는 아래와 같은 방법으로 얻을 수 있다. SomeClass sc = new SomeClass(); .... 하지만...
29 June 2019
Hello World 스터디 환경 IDE : IntelliJ OS : Windows10 JVM : JDK1.8 프로젝트 생성 File -> new Project -> Kotlin/JVM Hello World src -> new File -> Kotlin file / class app.kt package org.kotlinlang.play // 1 fun main() { // 2 println("Hello, World!") // 3 } package org.kotlinlang.play //...
28 June 2019
이 글은 Eclipse 와 IntelliJ의 Refactor 단축키에 대해 정리 하는 글입니다. 동작 Eclipse 단축키 Intellij 단축키 Refactor Menu Alt + Shift + T Ctrl + Shift + A(Action Search) Copy 없음 F5 Move Alt + Shift + V F6 Rename Alt + Shift + R Shift + F6 Safe Delete...
18 June 2019
디자인 패턴이란? 디자인 패턴이란 프로그래밍 할때 문제를 해결하고자 코드의 구조들을 일정한 형태로 만들어 재이용 하기 편리하게 만든 일정한 패턴이다. 이 용어를 소프트웨어 개발 영역에서 구체적으로 처음 제시한 곳은, GoF(Gang of Four)라 불리는 네명의 컴퓨터 과학 연구자들이 쓴 서적 ‘Design Patterns : Elements of Reusable Object-Oriented Software’ (재이용이 가능한 객체지향 소프트웨어의...
18 June 2019
자바 Quartz 오픈 소스 예제 자바 어플리케이션에서 사용할 수 있는 유명한 오픈 소스 작업 스케쥴링 라이브러리인 Quartz 의 기본 설정 및 사용 방법에 대해 알아보자. 1. 프로젝트 환경 Java8 Quartz 2.3.0 SLF4J 1.7.7 Maven 3.3.3 Eclipse 4.10.0 2. Quartz 다운로드 Quartz Team github : Quartz GitHub Link 3. Maven 의존성...
18 June 2019
이글은 백명석님의 강의를 학습하면서 정리 된 자료 입니다. 개요 볼링 게임 점수 계산을 하는 프로그램을 TDD로 작성 해보자. 볼링 게임 예제 소스 : (https://github.com/ParkHyeokJin/BowlingGame-Example.git) 규칙 볼링 게임은 10개의 프레임으로 구성된다. 각프레임은 대개 2 룰을 갖는다(10개의 핀을 쓰러뜨리기 위해 2번의 기회를 갖는다) Spare: 10 + next first roll 에서 쓰러 뜨린...
31 May 2019
Java11의 새로운 기능 JAVA11 발표 및 라이센스 변경 오라클은 6개월마다 새로운 버전을 제공 한다고 발표를 했습니다. 그리고 라이센스 및 지원 모델을 변경 했습니다. Java11 은 더이상 상업용도로 무료가 아닙니다. 개발에서 사용 하는 것은 가능 하지만 상업적으로 사용 하려면 라이센스를 구매 해야 합니다. 2019년 1월 부터 Java8 지원을 중단 하고 추가...
29 May 2019
자바 람다식 소개 이 포스팅에서는 Java Lambda Express 에 대해 소개 합니다. Lambda 기능은 Java8에서 소개 되었는데 Functional Programming 을 하기 위한 첫번째 단계로 볼 수 있습니다. 클래스 없이 함수를 만들 수 있고 매개변수로 전달도 가능 하며 필요에 따라 언제든지 실행 할 수 있습니다. Java Lambda expressions 는 전달할 수...
20 May 2019
jekyll을 이용하여 나만의 git blog 만들기 jekyll 을 이용해서 나만의 블로그를 만들어 보자. 이 포스트에서는 빠르게 jekyll을 이용하여 사이트를 생성 할 수 있도록 정리 하였다. 자세한 사항은 jekyll 공식 사이트에서 확인 하기 바란다.jekyll 공식사이트 이동하기 jekyll? jekyll은 아주 심플하고 블로그 지향 적인 사이트 생성기이다. 텍스트(마크다운) 파일로 컨텐츠를 작성하고 폴더로 관리한다....
15 May 2019
Header 표현 <h1> ~ <h6> 까지 표현 # Header 1 ## Header 2 ### Header 3 #### Header 4 ##### Header 5 ###### Header 6 Header 1 Header 2 Header 3 Header 4 Header 5 Header 6 <h1> , <h2> 는 다음과 같이 표현 가능 제목 1 ====== 제목 2...
07 November 2018
DB ERD 관계선 관계 선 실선 : 식별 관계 부모 자식 관계에서 자식이 부모의 키를 외래키로 참조 점선 : 비식별 관계 부모 자식 관계에서 자식이 부모의 키를 일반 속성으로 참조 관계의 종류 (1 : 1) 관계 : 부모는 하나의 자식이 있다. (1 : N) 관계 : 부모는 하나 이상의 자식이...
11 January 2016
Java8의 8가지 새로운 기능 2014년 JDK 8 (Java SE 8, JDK 8, JRE 8) 발표 2014년 JDK 8 Lambda 추가 2011년 JDK 1.7이 나온 이후로 3년이 업데이트에 3년이 걸렸습니다. 하지만 1.7에서 구현하지 못했던 많은 변화들이 1.8에 담기게 됩니다. 변화된 기능 1) Lambda Expression 기본 구분 (argtype arg...) -> { return...
11 January 2014
Java7의 10가지 새로운 기능 2011년 JDK 7 (Java SE 7, JDK 7, JRE 7) 발표 JDK 1.0에서 JDK 6까지 2년마다 업데이트가 되었지만 JDK 7은 5년만에 업데이트 되었습니다. JDK 7의코드 네임은 Dolphin입니다. 제품명은 아래와 같습니다. Java™ Platform Standard Edition 7 (Java™ SE 7) Java™ SE Development Kit 7 (JDK™ 7) Java™...