본문 바로가기

전체 글141

[4] 스프링 프레임워크 핵심 - IOC 컨테이너와 Bean 스프링의 디자인 철학 - 모든 선택은 개발자의 몫이다 (특정 기술을 강요하지 않는다) - 다양한 관점을 지향한다 (유연성) - 하위 호환성을 지킨다 (노력) - API를 신중하게 설계 한다 - 높은 수준의 코드를 지향한다 IoC 컨테이너 IoC 컨테이너를 사용하는 이유를 여럿 찾아봤는데 stackoverflow.com/questions/871405/why-do-i-need-an-ioc-container-as-opposed-to-straightforward-di-code 이 글에서 대화를 나눈게 가장 적합한 대답이 아닐까 생각됩니다. 스프링에서는 어노테이션 기반의 DI가 수행되는데요 google guice에서 처음 선보인 거라고 하네요 (역시 구글) BeanFactory IoC 컨테이너의 최상위 인터페이스.. 2020. 11. 30.
[3] 간략한 스프링 개요 - PSA 1. PSA PSA란 Portable Service Abstraction 이라고 합니다 자바 스프링은 서블릿 어플리케이션을 만듦에도 불구하고 서브릿을 직접 프로그래밍하지 않습니다. 일반적으로 하나의 엔드포인트에 여러 메소드를 대응시키기 위해 java에 구현된 HttpServlet 을 상속받아 해당 HttpServlet의 doGet, doPost 메소드를 오버라이딩하여 비즈니스 로직을 작성하게 됩니다. public class OwnerCreateServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException .. 2020. 11. 30.
[2] 간략한 스프링 개요 - AOP 1. AOP 반복되어 사용되는 로직을 분리하여 한 곳에서 보관하고 어디서든 적용할 수 있게 구성하는 것입니다. @Transactional 이 AOP 로 구성되어 있는 어노테이션 중 하나입니다. AOP를 구현할 수 있는 방법은 3가지가 있습니다. 1. 컴파일 시간에 class file을 생성하는 중에 넣어준다 (AspectJ) 2. class file을 실행시는 중에 classLoader가 클래스를 로딩하는 시점에 넣어준다 (AspectJ) 3. 프록시 패턴 - Spring AOP가 사용하는 방식 (디자인 패턴) 2. Proxy Pattern 이 부분은 HFDP 에서도 따로 정리할 계획입니다. refactoring.guru/design-patterns/proxy 프록시 패턴은 말 그대로 "프록시"를 해주는.. 2020. 11. 28.
[1] 간략한 스프링 개요 - IoC 이 레포 를 기반으로 학습합니다. 1. Petclinic 프로젝트 실행 - 해당 레포를 클론 한 후 Intellij를 해당 폴더를 basedir 로 엽니다. - Intellij가 자동적으로 dependency와 plugin들을 설치해줍니다. - Cli에 ./mvnw package를 통해 패키지를 빌드해 줍니다 - maven에 packaging 옵션이 없어서 기본적으로 jar 패키지가 되므로, 빌드하여 생성된 jar 파일을 java로 실행하면 동작합니다. 2. Properties 변경을 통한 환경 설정 src > main > resource 의 application.properties 에서 spring 관련 옵션을 지정해줍니다. # database init, supports mysql too databas.. 2020. 11. 26.
[3] Intellij 에서 기본 maven 프로젝트 시작하기 처음 인텔리제이를 시작하면 다음과 같은 화면이 등장합니다. 오른쪽의 New Project 를 눌러 희망하는 디렉토리에 프로젝트를 생성해봅시다. 만약 원하는 버전의 Java SDK가 없는 경우엔 다음과 같이 SDK를 선택하여 설치해줍니다. 그 후 빌드 도구로 Maven 을 선택한 후 Next 를 눌러줍니다. 여기서 Gradle을 누르면 빌드 툴로 Gradle을 사용하는 것이 됩닌다. 프로젝트의 이름을 지정해주고 프로젝트의 위치를 설정한 후 Finish 를 눌러줍니다. 그럼 다음과 같이 초기 프로젝트가 생성됩니다. 비어있는 src/main/java 폴더에 main 함수를 추가해줍니다. 이제 메인 함수도 만들었겠다, 위 사진의 main 함수 옆의 초록색 실행 버튼을 누르면 당연히 실행이 되겠죠? 라고 생각하는.. 2020. 11. 24.
[5] 백준 13610 Volta 문제 모터 스포츠에서는 특정 순간에 레이스의 리더가 마지막 순위를 초과하는 것이 일반적입니다. 이 순간 리더는 마지막 순위보다 한 바퀴 앞서 있으므로 후발자가 됩니다. 이 문제에서 가장 빠른 드라이버와 가장 느린 드라이버가 랩을 완료하는 데 걸리는 시간을 감안할 때 마지막으로 배치 된 랩이 후발자가 될 랩, 즉 리더가 추월 할 랩을 결정해야합니다. 처음에는 서킷의 출발 선에서, 둘 다 랩 넘버 1 (레이스의 첫 랩)의 시작 부분에 나란히 배치되어 있음을 고려해야합니다. 새로운 라운드는 항상 리더가 출발 선을 통과 한 후에 시작됩니다. 입력 단일 입력 행에는 두 개의 정수 X 및 Y (1 ≤ X > a >> b; int lab = 1; int cur = a; lab += (cur % (b-a) == 0) .. 2020. 11. 16.
[4] 백준 13597 Tri-du 문제 Tri-du는 Truco의 인기 게임에서 파생 된 카드 게임입니다. 이 게임은 표준 52 장의 카드 덱을 사용하며 각 슈트의 카드는 13 장이지만 슈트는 무시됩니다. 1에서 13까지의 정수로 간주되는 카드의 값만 사용됩니다. 게임에서 각 플레이어는 세 장의 카드를받습니다. 규칙은 간단합니다. 트리오 (같은 순위의 카드 3 장)가 한 쌍 (같은 순위의 카드 2 장)을 이깁니다. 더 높은 가치의 카드 트리오가 더 낮은 가치의 카드 트리오보다 승리합니다. 더 높은 가치의 카드로 구성된 쌍이 더 낮은 가치의 카드로 구성된 쌍보다 승리합니다. 많은 상황에서 게임에 승자가 없을 수도 있습니다. 이 경우, 나눠진 카드는 덱으로 돌아가서 셔플되고 새로운 게임이 시작됩니다. 플레이어는 반드시 받아야하는 카드 두 장.. 2020. 11. 16.
[3] 백준 11466 Alex Origami Squares 문제 Alex는 종이 접기를 좋아합니다. 종이 접기의 일본 예술입니다. 대부분의 종이 접기 디자인은 정사각형 종이로 시작합니다. Alex가 어머니를 위해 선물을 할 것입니다. Present의 디자인에는 3 개의 동일한 정사각형 용지가 필요하지만 Alex는 직사각형 시트가 하나뿐입니다. 그는이 시트의 정사각형을 자를 수 있지만 그 측면은 시트의 측면과 평행해야합니다. Alex가 잘라낼 수있는 종이 사각형의 가능한 최대 크기를 결정하도록 도와주세요. 입력 입력 파일의 한 줄에는 두 개의 정수 h와 w가 포함됩니다. 즉, 용지의 높이와 너비 (1 ≤ h, w ≤ 1000)입니다. 출력 하나의 실수 (정사각형 변의 최대 길이)를 출력합니다. 이러한 정사각형의 h × w 용지 세 개를 잘라 내면 측면이 시트의 측.. 2020. 11. 16.
[2] 백준 8716 Pole 문제 측면이 좌표축과 평행 한 두 직사각형의 좌표를 지정하여 이러한 직사각형의 교차 영역을 계산하는 프로그램을 작성하십시오. 입력 입력의 첫 번째 줄에는 4 개의 정수가 있습니다. x1, y1, x2, y2는 각각 왼쪽 상단 모서리의 x 및 y 좌표와 첫 번째 직사각형의 오른쪽 하단 모서리의 x 및 y 좌표를 나타냅니다. 입력의 두 번째 줄에는 4 개의 정수가 있습니다 : x3, y3, x4, y4, 각각 왼쪽 상단 모서리의 x 및 y 좌표와 두 번째 직사각형의 오른쪽 하단 모서리의 x 및 y 좌표를 나타냅니다. 모든 좌표는 0 이상 1,000,000 이하입니다. 출력 출력의 첫 번째 줄과 유일한 줄에는 두 직사각형의 교차 영역 값과 동일한 정수 하나가 포함되어야합니다. 풀이 import java.uti.. 2020. 11. 15.
[1] 백준 8710 Koszykarz 문제 해설 Kozik는 농구 선수가되고 싶어합니다. 코치와 이야기를 나눈 후 그가 너무 작다는 것이 밝혀졌습니다. 그러나 Kozik은 치트로 판명 되더라도 코치의 요구 사항을 충족하기를 원할 정도로 결심했습니다. 그래서 그는 키가 커질 때까지 머리에 부딪히는 기발한 아이디어를 가졌습니다. 그는 타격을받을 때마다 종양이 1cm 씩 커지는 것을 발견했습니다. Kozik은 자신을 때려야 할 최소한의 수를 궁금해합니다. 입력 항목의 첫 번째 줄에서 3 개의 정수 : k, w, m (1 ≤ k ≤ 200, 1 ≤ w, m ≤ 109), 각각 Kozik의 키, 트레이너가 요구하는 높이 및 각 뇌졸중 후 종양 성장 값을 나타냅니다. 출력 첫 번째이자 유일한 출력 줄에는 Kozik이 만들어야하는 최소 스트로크 수와 동.. 2020. 11. 15.
[1] 기분 좋은 날 어제는 우중충한 날씨에 비도 내려서, 집에만 콕 박혀 있었더니 온몸이 다 쑤셨는데 비가 그치고 나니 해도 쨍쨍하고 날씨도 선선하니 기분이 너무 좋았다. 오늘 날씨와 기분을 자바스크립트를 통해 반영해보자. 문제 index.html ⛈️ 😞 index.js 의 파일을 수정하여 ⛈️ 를 ☀️로, 😞를 😊로 바꾸어보아요! 주의 ) HTML 코드를 수정하시면 안됩니다! 공부할 자료 [1] DOM 트리 [2] DOM 탐색하기 [3] getElement*, querySelector*로 요소 검색하기 2020. 11. 15.
[6] 싱글턴 패턴 싱글턴 패턴은 인스턴스가 하나 뿐인 특별한 객체를 만들고, 어디서든 접근할 수 있게 하기 위한 패턴입니다. 유일무이한 객체 객체중에는 하나만 있으면 되는 것이 있습니다. 예를 들면 - 쓰레드 풀, 캐시, 디바이스 드라이버 - 대화 상자, 로그 기록용 객체 - 사용자 설정, 레지스트리 설정 등.. 2개 이상인 경우 올바르게 동작하지 않거나 자원을 불필요하게 잡아먹게 되는 경우 객체를 2개 이상을 만들 수 없게끔 설정해주는 패턴이 필요합니다. 싱글턴 패턴은 전역 변수처럼 어디서든 액세스 할 수 있으면서도 필요할 때만 객체를 생성하므로, 항상 상주하는 전역변수보다 더욱 좋은 패턴입니다. 어떻게 만드나요? 아주 간단한 싱글턴을 만들어봅시다. export default class Singleton { privat.. 2020. 11. 5.
[4] 인덱스 확장기능 사용법 이 글은 [친절한 SQL 튜닝] 을 학습하고 정리한 글입니다. 3번 게시물까지는 Index Range Scan 중심으로 다루었는데 Index Full Scan, Index Unique Scan, Index Skip Scan, Index Fast Full Scan 등 인덱스 스캔 방식은 다양합니다. 하나하나 알아보겠습니다. Index Range Scan B* Tree의 가장 일반적인 액세스 방식인데요 인덱스 Root에서 Leaf 까지 값을 비교하며 수직적으로 탐색한 후에 Leaf에서부턴 필요한 범위만 스캔합니다. 인덱스를 Range Scan 하려면 선두 컬럼을 가공하지 않은 상태로 조건절에서 사용해야 합니다. 중요한 점은 인덱스 스캔범위와 테이블 액세스 횟수를 얼마나 줄일 수 있냐로 결정됩니다. selec.. 2020. 11. 2.
[3] 인덱스 기본 사용법 이 글은 [친절한 SQL 튜닝] 을 학습하고 정리한 글입니다. 인덱스 사용의 기본은 Index Range Scan 하는 방법을 이해하는 것인데요. 리프 블록에서 스캔 시작점을 찾아 거기서부터 스캔하다가 중간에 멈추는 것을 의미합니다. 인덱스 컬럼을 가공하면 인덱스를 이용한 Range Scan을 할 수 없게 됩니다. 인덱스 컬럼을 가공한다는 것은, 인덱스 컬럼이 제공하는 데이터의 일부 혹은 변형된 값을 사용하여 쿼리를 하는 것을 의미합니다. 예를 들어, "날짜" 에 대해서 index가 구성되어 있었다고 가정을 하면 날짜가 2007년 6월 1일 ~ 2007년 6월 31일에 발생한 이벤트에 대해 쿼리를 날리면 2007년 6월 1일을 인덱스로 탐색을 시켜서 Leaf 노드를 찾을 수 있습니다. 그런데 만약 년도에.. 2020. 10. 30.
[2] 인덱스 구조 이 글은 [친절한 SQL 튜닝] 을 학습하고 정리한 글입니다. 인덱스 튜닝에 대해 살펴보기 이전에, 인덱스 구조를 통해 핵심 원리를 짚고 넘어갑시다. 인덱스는, 해당 자료를 찾기 편하게끔 데이터와 개별된 구조를 만들어 놓은 것입니다. 데이터베이스 테이블에서 데이터를 찾는 방법은 1. 테이블 전체를 스캔하거나 2. 인덱스를 이용하는 방법 위 두가지밖에 없기 때문에, 인덱스는 SQL 튜닝에서 가장 먼저 학습해야 할 부분입니다. 인덱스 튜닝의 핵심 요소 인덱스는 큰 테이블에서 소량 데이터를 검색할 때 사용합니다. 일반적인 Online Transaction Processing 시스템에서는 소량 데이터를 주로 검색하므로 인덱스 튜닝이 매우 중요합니다. 인덱스 튜닝의 핵심은 크게 두가지로 나뉘는데 첫번째는 인덱스 .. 2020. 10. 30.
[5] 팩토리 메소드 패턴 팩토리 메서드 패턴을 이용하여 불필요한 의존성을 없애는 방법에 대해 알아봅시다. 디자인 원칙중 하나가, 구현이 아닌 인터페이스를 바탕으로 개발하라는 것이였는데요 new를 이용해서 객체를 생성하는 것을 돌아보면 결국 특정 구현을 바탕으로 프로그래밍 하는 것이 됩니다. 어떤 객체를 생성할 때 조건이 붙게 되는 경우가 있을 것입니다. if(picnic){ duck = new MallardDuck(); } else if(hunting){ duck = new DecoyDuck(); } 위와 같이 특정 조건에 대해 서로 다른 구현체를 인터페이스에 대입하려면 저런 식의 조건문이 필요한데요 이런 코드가 있다는 건 결국 변경 혹은 확장할 때 동일한 코드를 다시 확인하고 추가/제거 해야한다는 뜻이 됩니다. 코드에서 구상 .. 2020. 10. 29.
[6] Heap 이 글에서는 힙 자료구조에 대해서 알아보도록 하겠습니다. Heap은 최댓값 및 최솟값을 빠르게 찾아내기 위해 고안되었고 완전이진트리를 기본으로 한 자료구조입니다. 우선 완전 이진트리 (complete binary tree)의 속성을 모두 충족합니다. 완전 이진트리란 트리의 왼쪽부터 비는 곳 없이 채워져 있게 됩니다. 위 이미지에서 complete 에 해당하는 구조가 완전 이진트리인데요 (물론 Perfect Binary Tree도 complete에 포함됩니다) 왼쪽부터 노드가 채워지고 중간에 비는 구조가 없는 것을 확인할 수 있습니다. 이런 완전이진 트리의 특성에 하나의 제약 조건을 추가하여 heap 자료구조가 구성됩니다. 그 특성은 바로 모든 Parent는 자신의 Child보다 크거나 작다는 특성입니다... 2020. 10. 28.
[5] 이진 탐색 트리 오늘은 이진 탐색 트리(Binary Search Tree)에 대해 다루어 보도록 하겠습니다. 이진 탐색 트리는 트리 구조에서 자식이 항상 2개 이하인 Binary Tree 의 특성을 그대로 물려 받고 거기에 "탐색" 이라는 키워드가 추가되었다고 생각하시면 되겠습니다. 탐색을 용이하기 위해 한가지 규칙이 더 추가되었는데요 자식을 입력할 때 왼쪽 자식엔 현재 노드보다 작은 값을, 오른쪽 자식엔 현재 노드보다 큰 값을 넣는 규칙입니다. 그런 규칙을 갖게 되면, 현재 갖고있는 key를 찾을 때 개별 node에서 크기를 비교해서 왼쪽 child로 탐색할 지 오른쪽 child로 탐색할지를 파악할 수 있어 경로를 찾기에 매우 용이합니다. Binary Search Tree의 예시인데요 Root node 인 8부터 살펴.. 2020. 10. 28.
[1] 티스토리 리스트 줄 바꿈 오류 해결하기 기존에 썼던 글을 돌아보니 줄 바꿈 부분에서 문제가 있는 걸 발견했습니다. 편집기에서는 이렇게 잘 나오는데 실제로 게시물에서 나타난 것을 보면 위와 같이 엔터가 쳐져있는 것을 확인할 수 있었습니다. 그래서 HTML 구조가 어떻게 구성되어있는지를 살펴보았습니다. p 태그로 감싸진 컨텐츠와 ::marker간 줄바꿈이 이루어져서 올바르게 보이지 않는 것을 확인할 수 있습니다. p 태그는 기본적으로 display가 block 이기 때문에 개별 css를 적용하지 않으면 줄 바꿈이 이루어집니다. 고로 이를 수정하기 위해 관리 > 꾸미기 > 스킨 편집으로 들어갑니다. 스킨 편집 페이지의 오른쪽 상단의 html 편집을 눌러줍니다. 그 후 CSS 버튼을 클릭하면, 해당 스킨에 적용된 CSS를 확인하실 수 있습니다. 맨 .. 2020. 10. 28.
[4] Decorator Pattern 오늘은 데코레이터 패턴에 대해서 간략하게 알아보고 예시를 통해 적용 방식에 대해서 확실히 이해해보는 시간을 가져보겠습니다. 데코레이터 패턴이란, 상속을 피하고 프로그램의 실행중에 동적으로 클래스를 "꾸며" 서로 다른 기능을 만들어내는 패턴입니다. 이 패턴을 알고 나면, 원래 클래스의 코드를 전혀 바꾸지 않아도 해당 객체에 새로운 임무를 부여할 수 있습니다. 문제 상황에 대한 이해 예시 문제 상황은 이렇습니다. 스타벅스 내부 시스템을 만든다고 가정을 하고, 판매하는 음료의 가격을 매기는 시스템을 구성해 봅시다. 음료에 대해 표현하기 위해서, Beverage 라는 클래스를 만들고 Beverage에 들어가는 요소들을 반영하기 위해 Beverage 클래스의 Property로 그 재료를 넣었습니다. 그리고 나서,.. 2020. 10. 28.
[4] 큐 Queue는 자료구조 중의 하나로, 먼저 입력되는 정보가 먼저 나오는 형태의 구조를 지닙니다. 이를 First in First Out 이라 하고, 앞 글자를 따서 FIFO 라 부릅니다. 자료구조로서의 정의가 있기 전에, queue 라는 단어는 "줄 지어 서있는" 것을 의미하는데요 위 사진 처럼 인기 있는 레스토랑에서 식사를 하려고 줄을 서면, 먼저 온 사람이 먼저 식당에 들어가게 됩니다. 자료구조로서의 큐는 그런 특성을 본따서 지은 이름이 아닐까 생각되네요. 큐가 지원하는 메소드는 다음과 같습니다. Enqueue : Queue의 front(맨 앞)에 값을 넣는 것을 의미합니다. Dequeue : Queue의 Back(맨 뒤)에서 값을 빼는 것을 의미합니다. 큐도 스택과 같이 Array와 LL으로 구현할 .. 2020. 10. 25.
[3] Strategy Pattern Strategy Pattern은 "변화하는 로직"을 분리하여 구성하는 방식 중 하나입니다. 이 패턴의 핵심은 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킵니다. 대표적으로 다음과 같은 상황에 Strategy Pattern을 적용합니다. 1. 진짜 변한다 - 비즈니스 로직이 요구사항에 대해 변하는 경우, 이를 유연하게 대응하기 위함 2. 개별 클래스에 대해 달라야 한다 - 동일한 메소드가 개별 클래스에 대해 그 동작이 달라지고, 재사용해야 하는 경우 개별 행위를 클래스로 캡슐화하여, 동적으로 행위를 변경할 수 있게 구성하는 것이 Strategy Pattern입니다. 메소드를 담고 있는 인터페이스를 정의하고 생성자를 통해 그 구현체를 주입하거나, Setter 메소드를 이용해서 동적으로 변경할.. 2020. 10. 25.
[2] Observer Pattern 옵저버 패턴이란 "자신의 상태"가 변했을 때 다른 Observer (Listener) 들에게 notify 할 수 있는 객체(주제)를 정의합니다. 한 객체의 상태가 바뀌면, 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 "일대다" 의존성을 정의합니다. 제가 처음에 이 옵저버 패턴을 공부했을 때 어려웠던 점이 옵저버 라는 이름에 너무 집착해서 어떤 대상이 다른 대상을 Observe, 즉 관찰하고 있어야 하는 것 아닌가? 라는 생각에 구독 주제가 되는 대상이 실제로 다른 대상들에게 알리는 메소드를 가지고 있는 것이 잘 이해가 되지 않았습니다. 각 객체간 소통을 할 때 객체에 정의되어 있는 메소드를 이용하는데, 옵저버 패턴에서는 "알리는 객체" 가 "구독하는 객체"의 메소드 하나만 알.. 2020. 10. 22.
[3] 스택 스택 자료구조에 대해 알아보고, 이를 직접 구현하며 자세히 알아보겠습니다. 스택은 자료구조의 한 종류로, 나중에 입력한 정보를 가장 먼저 꺼낼 수 있는 구조를 갖는 자료구조입니다. 이러한 구조를 LIFO (Last In First Out) 라고 합니다. 항상 넣은 순서의 반대로 꺼낼 수 있게 한쪽 방향이 막혀있습니다. Stack의 의미를 생각해보면, 무언가가 쌓여있는 것을 생각하게 되는데, 쌓여있는 것의 맨 마지막 것 부터 뺄 수 없는것과 같은 이치입니다. 스택을 구현한다는 것은, 한쪽으로만 꺼낼 수 있는 구조를 만들어 주는 것이라고 볼 수 있겠습니다. 구현 구현은 Array로 해도 되고 Linked List로 해도 되지만, 이 글에선 Linked List를 이용하여 구현합니다. typedef struc.. 2020. 10. 20.
[1] SQL 처리 과정과 I/O 이 글은 [친절한 SQL 튜닝] 을 학습하고 정리한 글입니다. 1.1 SQL 파싱과 최적화 SQL은 집합적이고 선언적인 질의 언어이기 때문에, 질의를 통해 결과 집합을 얻게 됩니다. 그런 결과 집합을 얻기 위해서는 절차적인 과정이 필요한데, 이 과정을 SQL 옵티마이저가 대신해줍니다. "SQL 최적화" 란 DBMS 내부에서 프로시저를 작성하고 컴파일해서 실행 가능한 상태로 만드는 전 과정을 의미합니다. 실제 최적화 과정을 세분화 하면 다음과 같습니다 1. SQL 파싱 - SQL Parser가 파싱을 수행합니다 2. SQL 최적화 - Optimizer가 미리 수집한 시스템 및 오브젝트 통계정보를 바탕으로 다양한 실행경로를 생성한 후 비교하여 가장 효율적인 방식을 선택합니다. (데이터베이스 성능의 핵심) 3.. 2020. 10. 20.
[1] Reactor Pattern 리액터 패턴이란 동시적으로 발생하는 I/O 혹은 이벤트들을 서비스 핸들러를 통해 Demultiplexing하고 그 결과들을 각각의 할당된 Request Handler 를 통해 수행하는 패턴입니다. 우선 이 패턴에 대해서 알아보기 전에, 필요한 사전 개념들과 시나리오에 대해 이야기 해봅시다. Blocking I/O 일반적인 Blocking I/O 에서는 해당 작업이 수행될때까지 프로세스나 쓰레드가 작업을 멈추고 기다립니다. 그러다보니, Blocking I/O로 구현된 웹 서버는 여러 요청을 하나의 쓰레드에서 수행할 수 없게 됩니다. 대표적인 예로 버전 2.x Django가 있습니다. (3.0부터는 코루틴 방식으로 비동기 프로그래밍이 가능하다고 합니다) Blocking I/O를 사용한 채로 여러 요청들을 동.. 2020. 10. 19.
[3] CloudFlare를 이용해서 IP 숨기기 지금 배포하고 있는 개인 planner랑 스토리지 서비스 (cloud.riverandeye.com) 가 집에 있는 라즈베리 파이를 쓰다 보니 발급받은 IP가 그대로 노출되는 문제가 있었습니다. 이를 해소하기 위해 무료 솔루션들을 찾아보다가 Cloudflare 라는 것을 알게 되었습니다. 우선 먼저 CloudFlare 사이트에 접속하신 후 가입을 합니다. CloudFare를 사용하기 위해서 Site를 등록한 후, Plan을 선택하고, DNS 설정을 하면 등록이 완료됩니다. 아직 끝난 것은 아니고, 해당 도메인의 네임 서버를 cloudfare의 것으로 변경해주어야 합니다. 네임서버를 변경할 땐 자기가 도메인을 구매한 곳에서 변경하면 됩니다. 저 같은 경우엔 AWS에서 구매를 했기 때문에, Route53 > .. 2020. 10. 14.
[5] Systemd 를 이용한 go 어플리케이션 프로세스 관리 최근에 배포한 서비스의 서버가 자꾸 꺼지는 현상이 발생합니다. 로그에도 프로세스가 종료된 흔적이 남지 않았어요... (당황) 현재 추정하는 이유는 라즈베리가 혼자 죽는것 때문이라고 생각을 하고 있어요. 시스템 로그에 다음과 같이 저전력 상황이라는 메세지가 자꾸 떴기 때문이죠. 오래된 낡은 멀티탭을 문어발 식으로 쓰다 보니까 이런 문제가 생기는 것으로 생하고 있습니다. 전력이 낮아 서버가 죽었다가 다시 켜지면서, 자동으로 go 프로세스가 켜지지 않아서 서버가 죽는 것 처럼 보였던거죠. 좀 제대로 된 멀티탭을 사서 개선을 해야겠습니다. 당장 수많은 사용자가 쓰고 있는 서비스는 아니기 때문에 우선 서버가 껐다 켜지면 자동으로 go 프로세스가 재실행될 수 있게 구성하려고 합니다. 그래서 검색을 해보니 이런 게 .. 2020. 10. 12.
[2] 트리구조 플래너 만들기 (1) 기본 기능 원래는 Todo 앱을 Golang으로 짜보려고 어떤 프로젝트를 해볼까~ 하다가 목표를 정리하는 어플을 만들어보면 어떨까 해서 만들어보게 되었습니다. 이 주소에 배포되어 있습니다. 왼쪽에 어떤 Plan도 선택되어있지 않을때는 다음과 같은 개발자 소개가 나타납니다. 특정 Plan을 선택하면, 다음과 같이 해당 Plan에 대한 내용이 나타납니다. 선택한 Plan에 하위 계획이 있는 경우엔 오른쪽에 나타나게 됩니다. 해당 계획을 수정 또는 삭제 할 수 있습니다. --- 이걸 만들게 된 계기는, 다른 서비스에서 이런 구조를 만들지 않기 때문에 만들었습니다. 내가 노력하는 것들에 다 이유가 있는데 그런 이유들을 살다보면 잊어버리게 됩니다 그 이유를 명확하게 기록하는 좋은 도구가 될 것이라 생각합니다. 또, 가이드에.. 2020. 10. 7.
[4] Go yaml - yaml 파일을 Go로 쉽게 읽기 프로그램의 외부 시스템이 변경하게 되면 이를 적용해야 하는데, 코드에 그대로 반영할 수는 없으니 외부 설정 파일을 생성해서 이를 읽어 시스템에 반영하게 됩니다. 예를 들면, DB 서버의 ip 주소나 포트 같은 것들을 매번 코드상에서 변경해주는건 이상하니 전역으로 config 변수를 설정해서 주입해주는 것입니다. 이러한 외부 설정 파일은 ini, yaml, json 형식으로 작성되는데 자주 사용되는 yaml 형식의 파일을 Go에서 읽어서 사용하는 예시를 이 글에서 소개하겠습니다. yaml 예시 database: Type: mysql User: Riverandeye Password: hello Host: 1.2.3.4:5 Name: todo TablePrefix: todo_ server: RunMode: d.. 2020. 10. 3.