개발 일지 168

[Cloud] Amazon EC2

EC2(Elastic Computer Cloud)란 아마존 웹 서비스에서 제공하는 클라우드 컴퓨팅 서비스로, AWS에서 원격으로 제어할 수 있는 가상의 컴퓨터를 한 대 빌리는 것과 같다. EC2의 서비스는 PC방과 같이 사용한 만큼의 비용을 지불하기 때문에 '탄력적인'이라는 의미의 Elastic이 붙어 있고, 이는 비용적인 부분 외에도 필요에 따라 성능, 용량을 자유롭게 조절할 수 있다는 의미를 갖고 있다. EC2 인스턴스는 가상 서버 즉, 1대의 컴퓨터를 의미하는 단위이고 AWS에서 컴퓨터를 빌리는 것을 인스턴스를 생성한다고 한다. 인스턴스당 하나 이상의 CPU, 메모리, 스토리지, 네트워크 등의 리소스를 할당받는다. 이러한 인스턴스는 사용자가 원하는 운영체제와 애플리케이션을 실행할 수 있으며, 필요에..

개발 일지/CS 2023.03.31

[Cloud] Deploy

Deploy란 개발에서 '배포'라는 의미를 갖는다. 클라우드 컴퓨팅에서의 deploy(배포)는 소프트웨어 애플리케이션을 개발자가 작성한 코드와 필요한 리소스를 클라우드 환경에 전달하여 실행 가능한 상태로 만드는 것을 말한다. 배포는 애플리케이션의 새로운 버전이나 업데이트가 있을 때, 이를 클라우드 환경에 배치하여 사용자가 새로운 버전의 애플리케이션을 사용할 수 있도록 하는 과정이다. 배포는 일반적으로 자동화되어 있으며, 클라우드 제공업체에서 제공하는 배포 도구를 사용하거나 개발자가 직접 배포 스크립트를 작성하여 배포를 수행할 수 있다. 이를 통해, 애플리케이션의 배포 과정을 단순화하고 인력 및 비용을 절감할 수 있다. 순서 배포는 회사마다 추가적인 과정이 있을 수 있지만, 일반적으로 다음과 같은 순서로 ..

개발 일지/CS 2023.03.30

[Cloud] Cloud Computing

클라우드가 등장하기 이전에는 전산실 등에 컴퓨터를 배치하고 인터넷을 연결하여 서비스를 제공했었다. 서버가 요청에 대한 수용 능력이 한계에 도달한 경우, 같은 공간에 더 많은 컴퓨터를 제공하거나 컴퓨터의 성능을 높이는 방식을 사용했지만, 이런 방식은 주기적인 관리가 필요하고 인력, 공간 및 비용의 문제가 발생했다. 이런 상황에서 추가적인 서버 증설이 어렵게 되면서 데이터 센터의 유휴 자원을 대여하는 서비스, 바로 클라우드 컴퓨팅 기술이 등장하기 시작했다. 클라우드 컴퓨팅(Cloud Computing)은 인터넷을 통해 컴퓨팅 자원(하드웨어, 소프트웨어, 데이터 저장 등)을 제공하는 서비스다. 따라서 클라우트 컴퓨팅 서비스를 통해 기존에 사용되던 서버, 스토리지 등의 IT 인프라를 대체할 수 있으며, 이러한 ..

개발 일지/CS 2023.03.29

[Spring WebFlux] Reactive Programming

리액티브 프로그래밍(Reactive Programming)은 비동기적인 데이터 스트림을 다루는 프로그래밍 패러다임 중 하나로, 이벤트 기반(event-driven) 또는 데이터 흐름(data-flow) 프로그래밍 모델에서 사용된다. 데이터의 처리 및 변환을 이벤트 기반으로 수행하며, 데이터의 상태 변화에 따라 비동기적으로 반응(react)한다. 리액티브 프로그래밍에서는 데이터가 지속적으로 발생하는 것 자체를 데이터에 어떤 변경이 발생함을 의미하며, 이 변경 자체를 이벤트로 간주하고 이벤트가 발생할 때마다 데이터를 계속해서 전달한다. 리액티브 프로그래밍은 높은 성능과 확장성을 갖는 시스템을 구현하기 위해 사용되며, 모바일 애플리케이션, IoT 기기, 클라우드 네이티브 애플리케이션 등 다양한 분야에서 사용되..

Port 8080 was already in use

작업을 하다가 인텔리제이가 갑자기 닫혀버리거나 서버를 종료하지 못한 경우에 다시 서버를 실행시키면 다음과 같은 에러가 발생한다. 자주 발생하는 경우라 블로그에 정리해두고 보려고 한다. 해결 방법 1. 관리자 권한으로 cmd 실행 2. netstat -p tcp -ano 를 입력하면 아래와 같이 8080 port가 사용중이라고 나온다. 3. 위의 PID를 참고하여 taskkill /f /pid {PID} 값을 입력하면 된다. 나는 PID가 16068이라서 taskkill /f /pid 16068 을 입력했다. 이렇게 하면 해당 프로세스가 종료되므로, 다시 포트 번호를 톰캣 서버를 통해 정상적으로 사용할 수 있다. 2023.05.19 추가 EC2 환경에서 백그라운드로 서버를 실행시켰을 때 종료 방법(bash..

개발 일지/etc 2023.03.27

[Spring WebFlux] Reactive System

리액티브 시스템(Reactive System)이란, 비동기적인 시스템에서 발생하는 문제를 해결하고 확장성과 반응성을 높이기 위해 만들어진 시스템이다. 리액티브 시스템의 가장 큰 특징은 '반응성'이다. 즉, 시스템이 빠르게 요청에 응답하고 실패를 적극적으로 처리하여 사용자에게 최상의 경험을 제공하는 것이다. 이를 위해, 시스템에서 발생하는 모든 이벤트를 비동기적으로 처리하고, 이벤트에 따라 적절한 반응을 취한다. 리액티브 시스템에서는 비동기적으로 발생하는 이벤트를 처리하기 위해 다양한 기술과 패턴을 사용하는 데, 대표적으로는 스트림 처리 방식이 있다. 이는 데이터를 처리할 때 일부분씩 처리하는 것이 아니라 모든 데이터를 순차적으로 처리하면서 새로운 데이터가 추가되는 경우에도 지속적으로 처리할 수 있는 방식..

[Spring Security] 토큰 기반 인증 절차

토큰 기반 인증 절차는 크게 다음과 같은 단계로 이루어진다. 클라이언트가 ID / Password를 서버로 전송하여 로그인 요청을 한다. 서버는 ID와 Password를 검증하고, 유효한 사용자인 경우 Access Token과 Refresh Token을 발급한다. Refresh Token을 이용해 새로운 Access Token을 생성할 것이므로 두 종류의 토큰이 같은 정보를 담을 필요는 없다. 토큰을 클라이언트에게 전송하면 클라이언트는 토큰을 저장한다. 저장하는 위치는 Local Storage, Session Storage, Cookie 등이 될 수 있다. 클라이언트는 인증이 필요한 API 요청 시, HTTP Header(Authorization Header) 또는 쿠키에 이전에 발급받은 Access T..

[Spring Security] JWT

JWT(JSON Web Token)는 데이터를 안전하고 간결하게 전송하기 위해 고안된 JSON 기반의 웹 표준 인증 방식이다. 인증과 권한 부여를 위해 사용되며, URL과 HTTP 통신을 사용하는 웹 애플리케이션에서 사용된다. JWT 구조 // Header.Payload.Signature xxxx.yyyyyy.zzzz JWT는 Header, Payload, Signature로 이루어져 있다. Header에는 토큰의 타입 및 해싱 알고리즘 정보, Payload에는 서버와 클라이언트 간에 교환할 정보(사용자의 정보), Signature는 Secret Key를 이용하여 Header와 Payload의 내용이 변경되지 않았는지 확인할 수 있는 값이 담겨 있다. 각 부분은 Base64로 인코딩 되어 하나의 문자열로..

[Spring Security] 권한 부여 처리 흐름

권한 부여 처리는 Spring Security에서 가장 중요한 기능 중 하나이다. 인증에 성공했다고 해서 애플리케이션 리소스를 마음대로 이용할 수는 없기 때문이다. 따라서, 인증에 성공한다면 다음과 같이 사용자가 시스템에서 수행할 수 있는 작업을 결정하는 권한 부여(Authorization) 과정이 수행된다. Spring Security Filter Chain에서 URL을 통해 사용자의 액세스를 제한하는 권한 부여 Filter는 AuthoriztionFilter이다. AuthorizationFilter는 먼저 SecurityContextHolder로부터 Authentication을 획득한다. (Authentication 객체로부터 Principal을 추출하여 사용자의 정보를 얻을 수 있다.) Author..

[Spring MVC] Spring Security

Spring Security는 Spring MVC 기반 애플리케이션의 인증(Authentication)과 인가(Authorization) 기능을 지원하는 보안 프레임워크이다. Spring Security는 다양한 보안 기능을 제공하며, 사용자 인증, 접근 제어, 보안 이벤트 관리 등을 처리할 수 있다. 보안이라는 주제 자체가 소프트웨어 세계에서 어려운 주제 중 하나이기 때문에 직접 보안 강화를 위한 솔루션을 개발해서 구축하는 것은 쉽지 않을 것이다. 따라서, 잘 검증되어 신뢰할만한 Spring Security를 사용하는 것이 어쩌면 현명한 선택이라고 생각된다. Spring Security는 다양한 애플리케이션에서, 스프링 프레임워크의 다양한 모듈과 통합하여 사용할 수 있고 개발자가 보안 관련 기능을 쉽게..