무중단 배포를 위한 여정
·
DevOps/nginx
무중단 배포를 적용하기 위해 프록시 서버로 nginx를 사용했다.(nginx : https://kimdozzi.tistory.com/256) 배포 플로우  Blue-Green 방식가장 흔히 알려진 방식으로 롤링 배포 방식이 있다. 다른 배포 방식이 궁금하다면 https://hudi.blog/zero-downtime-deployment/ 를 참고하자. 해당 방식은 두 대의 서버를 사용한다. 하지만, 나는 EC2 한 대에 도커 컨테이너 두 개를 구축하고, 새 버전의 이미지가 올라올 때만 띄워서 교체하는 방식으로 선택했다. 이전에 선택한 방법은 AWS EC2에서 2개의 Springoot Jar 파일을 포트번호만 달리하여 띄우는 방식이었다. 하지만, 내부적으로 문제가 발생함과 동시에 해당 방식은 무중단 배포가 ..
[BOJ] 17276 배열 돌리기
·
Problem Solving/삼성 유형
출처: https://www.acmicpc.net/problem/17276  문제 설명 크기가 n * n인 2차원 정수 배열 X가 있다. (n은 홀수) X를 45도만큼 시계방향 또는 반시계방향으로 돌리는 문제이다. 이때, 네 가지 경우 모두 원소의 기존 순서는 유지 되어야 하고, 회전하지 않는 원소들의 위치는 변하지 않는다. Input:T | int : 테스트 케이스의 수 (1  board | int[][] : n * n인 2차원 정수 배열 (1  D | int : 회전할 각도, 45의 배수 (0  tempBoard | int[][] : 회전시킨 배열을 담을 임시 2차원 배열     실수 목록40분이나 걸렸다. 실수다.   내 코드5000msimport java.io.BufferedReader;impor..
[Spring Security] PasswordEncoder
·
Backend/Spring Security
일반적인 Spring Security 내부 흐름입니다. 우리는 InMemoryUserDetailsManager를 사용하는 대신에 직접 loadByUsername()을 오버라이딩하여 사용해보도록 하겠습니다.   실습 - User 정보를 SQL 스크립트를 활용하여 수동 입력Config - SecurityConfig@Configurationpublic class ProjectSecurityConfig { @Bean SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests((requests) -> requests.requ..
[Spring Security] 유저 정의와 관리
·
Backend/Spring Security
UserDetailsService, UserDetailsManagerloadUserByUsername인터페이스 내부에 loadUserByUsername이라는 추상 메소드가 존재합니다. 보편적인 인증 작업을 생각해보면 가장 먼저 데이터베이스에 저장되어 있는 유저 세부 정보 및 브라우저에 입력된 유저의 세부 정보를 불러오는 것입니다. 이를 위해 loadUserByusername이라는 추상 메서드가 존재합니다. 여기서 우리는 의문을 가질 수 있습니다.왜 데이터베이스에서 유저 이름만 불러오는가?유저 이름과 비밀번호를 둘 다 비교하는 것이 좋지 않은가?이유는 바로, 비밀번호를 불필요하게 네트워크로 전송하면 안되기 때문입니다. 보안 문제에 취약하므로, 먼저 유저 이름을 사용하여 유저 세부 정보를 로드하고, 나중에 ..
Next Permutation
·
Computer Science/Algorithms
Next Permutation ? 다음 순열이란, 말 그래도 해당 숫자의 다음에 올 순열의 수를 의미한다. 123 -> 132, 132 -> 213, 213 -> 231 ... 와 같다. 그렇다면 우리는 123의 다음 순열인 132를 구하는 과정을 살펴보겠다. 1. 해당 수의 맨 오른쪽부터 왼쪽으로 차례대로 $ i $ > $  i -1 $  이고, $ A_{i} $ > $ A_{i-1} $인 수를 찾는다.$ ( $$ i $는 인덱스 번호, $ A_{i} $는 해당 자리의 값$ ) $  2. 두 수 분리하기. 찾은 두 수를 막대를 하나 긋고, 임의로 왼쪽, 오른쪽으로 분리시킨다. 3. 왼쪽 공간의 가장 오른쪽 숫자에 대하여 오른쪽 공간의 우측 끝 부분 부터 왼쪽으로 탐색하면서, 더 큰 수를 찾는다.  4...
TCP 3, 4 way handshake
·
Computer Science/Network
TCP와 UDP가 무엇인지(https://kimdozzi.tistory.com/271), 3, 4 way handshake(https://kimdozzi.tistory.com/270)가 왜 필요한 것인지 잘 모르다면, 해당 링크들을 읽고 오길 바란다. 이전에는 이론을 통해 SYN, ACK를 주고 받는 과정을 확인하였다면, 이번에는 실습을 통해 확인해보겠다. 인터넷 연결이 가능한 환경, 와이어샤크만 있으면 된다. 아래 링크에서 다운 받고 오자. 와이어샤크를 설치하다 보면, Npcap이라는 것도 같이 다운을 권장하는 창이 뜨게 되는데, 필요한 것인 같이 다운받아 주자. 와이어샤크를 실행하게 되면 지금 쓰고 있는 인터넷 수단을 찾아서 클릭해줘야 한다. 아마 Npcap이 없으면 이 부분이 실행이 안될 것이다....
TCP와 UDP 차이
·
Computer Science/Network
TCP - 전송 제어 프로토콜IP가 인터넷 프로토콜로서 복잡한 인터넷 망 속에서 클라이언트와 서버 간에 통신할 수 있게 IP 주소와 패킷과 같은 규칙을 통해 통신을 하게 하는 것이라면, TCP는 IP규칙으로만 통신하기에 부족하거나 불안정하던 여러 단점들(패킷 순서가 이상하거나 패킷이 유실)을 커버해, 패킷 전송을 제어하여 신뢰성을 보증하는 프로토콜로 보면 된다.IP 규칙에 써있는대로 목적지에 다다랐으면, TCP 규칙에 써있는대로 올바르게 도착했는지 정확히 누구에게 전달되야하는지 하나하나 따진다고 생각하면 된다. 그래서 은행 업무나 메일과 같은 반드시 수신자가 정보를 받아야 하는 신뢰성 있는 통신이 필요할 때 사용된다.전송 데이터가 포장되는 과정을 나열해보면 다음과 같다.전송 데이터를 TCP 포장한다.포장..
브라우저에 www.google.com을 일어나는 일
·
Computer Science/Network
1. 브라우저에 www.google.com 입력2. 캐시 체크먼저 브라우저 캐시가 있는데 기존에 google.com을 방문했다면, 방문한 기록이 남아 있어서 빠르게 접근할 수 있습니다.google.com에 방문한 적이 없다면, OS캐시를 찾아보게 됩니다. 말 그래도 운영체제 안에 있는 캐시로 systemcall을 통해 그 내용에 접근할 수 있습니다.세번째는 라우터 캐시를 확인합니다. 라우터는 집에서 사용하는 공유기를 생각하면 됩니다. 거기서도 DNS내용을 저장합니다.마지막으로 한국에서 인터넷을 제공하는 ISP(Internet Service Provider) 캐시입니다.  3. 요청한 URL이 캐시에 없으면 DNS로 IP주소 획득ISP 캐시에서까지 그 IP주소를 찾을 수 없었다면, 이제 ISP의 DNS S..
1, 2차원에서 구간 합 구하기 - 1
·
Computer Science/Algorithms
이 글은 https://movingbean.tistory.com/17 의 블로그에서 작성된 내용을 바탕으로 정리 + @한 글입니다. 누적 합에 대한 내용이 너무 잘 정리되어 있습니다!!!!!! 꼭 보시길 바랍니다. 1차원 공간 vs 2차원 공간점 업데이트 vs 구간 업데이트 점 쿼리 vs 구간 쿼리 (특정 위치에 대한 개수만을 묻는가? vs 어떤 구간의 총합을 묻는가?)오프라인 쿼리 vs 온라인 쿼리 (질문을 업데이트가 모두 끝나고 하는가? vs 업데이트 도중에 질문을 하는가?1. 1차원 공간, 점 업데이트, 오프라인 쿼리점 업데이트라는 것은 초기 값만 세팅하는 경우도 점 오프라인으로 볼 수 있다고 한다. 가장 기본적으로 누적 합(PrefixSum)을 구하는 것을 떠올릴 수 있다.  시간 복잡도는 누적 ..
Nginx? 무중단 배포?
·
DevOps/nginx
무중단 배포?서비스가 중단되지 않은 상태에서 새로운 버전을 배포하는 것 무중단 배포가 필요한 이유?실제 서비스에서 한 대의 서버를 운영한다고 가정하자. 현재 사용중인 서비스의 Version은 application-V1을 배포한 서비스이다. 그런데 기능이 업데이트 되어 application-V2를 배포하려 한다. 이 새로운 버전 V2를 배포하기 위해서는 V2 버전의 빌드 파일을 서버에 배포해야 한다. V1와 V2는 서로 같은 포트를 사용하기 때문에 V2를 배포하기 위해서는 V1버전을 통해 실행하고 있는 서비스를 종료해야만 한다. 이러한 경우, V1이 종료되고 V2 버전이 실행되는 사이 유저가 서비스를 이용할 수 없는 시간이 생기는데, 이를 “다운타임” 이라고 한다.  NginxNginx란 트래픽이 많은 웹..
Github Actions, Slack Webhook 설정
·
DevOps/Git, Github
1. slack api에서 설명하는 3번 과정까지 진행한다.  https://api.slack.com/messaging/webhooks 2. 생성된 slack webhook url을 Secrets 환경 변수에 등록한다.  3. .github/workflows/{파일명}.yml 파일에 아래 내용을 작성한다.  # Slack Webhook 설정 - name: action-slack uses: 8398a7/action-slack@v3 with: status: ${{ job.status }} author_name: Backend fields: repo,commit,message,author mention..
AWS S3 403 에러 해결하기
·
DevOps/AWS
프로젝트를 배포하고, 운영환경에서 여러가지 통합 테스트를 진행하던 과정에서 아래와 같은 에러와 마주하였다. 자세히 살펴보니 AWS S3 burket 에서 문제가 발생한 것으로 보였다. 개발도 힘들지만, 운영 환경을 유지하는 것도 참 어렵다는 것을 깨닫고 있는 요즈음이다. 그래도 좋은 팀원들과 함께 성장하고 있어서 힘들지 않다. (아니 힘들어) ERROR : java.io.IOException: Server returned HTTP response code: 403 for URL; https://{AWS S3 bucket 주소}  해결 방법AWS 로그인 - AWS S3 - 사용중인 bucket 접속 - 권한  1. 버킷 정책 설정{ "Version": "2012-10-17", "Id": "Pol..