2023/09 10

[Spring] Nginx를 이용하여 http(80 Port)로 들어오는 요청을 springboot(8080 Port)로 Redirect 시키기

Nginx의 Reverse Proxy를 활용하여 80포트로 들어오는 요청을 8080포트로 redirect 시키는 실습을 해보려고 합니다. Springboot Root Directory Dockerfile Nginx Install && redirect(80 -> 8080) 설정 brew install nginx mkdir ./nginx && touch nginx/default.conf default.conf (Reverse Proxy 설정) upstream app { server spring-app:8080; # WAS 컨테이너의 이름 } server { listen 80; location / { proxy_pass http://app; 80포트로 들어온 요청을 8080포트로 전달 proxy_set_hea..

Java/Spring 2023.09.27

[Spring] 계층형 디렉터리, 도메인형 디렉터리 구조

개발을 할 때 디렉터리 구조를 설계하는 방법은 크게 두 가지로 나뉩니다. 계층형 디렉터리, 도메인형 디렉터리 2가지로 구성되는데, 저는 항상 계층형 디렉터리로 설계해 왔습니다. 각각의 디렉터리 구조에는 장, 단점이 있지만, 프로젝트 규모와 팀원들 협업 스타일에 알맞게 설계하는 것이 중요하다고 생각합니다. 이제 차근차근 알아보도록 하겠습니다. 1. 계층형 디렉토리 구조(Layered Directory Structure) 기능 또는 역할에 따라 코드를 계층별로 그룹화하는 방식을 계층형 디렉터리 구조라고 합니다. Web Layer: Client와의 요청을 받아 처리하는 역할 담당을 담당, 컨트롤러(Controller), 필터(Filter) 관련 클래스들이 위치하며, HTTP 요청을 처리하여 비즈니스 로직 수행..

Java/Spring 2023.09.27

[Nginx] Nginx에 대해서

nginx? 가벼움과 높은 성능을 목표로 하는 웹 서버 소프트웨어 이벤트 중심 아키텍처로 10000개 이상의 동시 연결을 처리할 수 있기 때문에, 백엔드 서버에 부하를 분산시키는 Reverse Proxy로도 사용되는 동시에 대부분에 사이트에서 더 나은 성능을 위해 보안 및 캐싱 제공 정적 데이터를 제공(html, image ..) Nginx의 주요 기능 : Proxy Server Proxy Server란? 대신 처리하는 서버 클라이언트와 서버 간의 중계 서버로 통신을 대리 수행하는 서버 캐시/보안/트래픽 분산 등 여러 장점을 가질 수 있습니다 일반적으로 말하는 Proxy라 하면, Forward Proxy를 의미합니다.(nginx는 Reverse Proxy Server의 역할 담당) 이 둘은 비슷한 기능을..

DevOps/Nginx 2023.09.26

[DB] MySQL Replication, Garela Cluster

오늘은 DBMS 복제 기술인 MySQL Replication, Garela Cluster에 대해서 알아보려고 합니다. MySQL Replication은 Replication(복제) 기능만 제공하지만, Garela Cluster는 Replication(복제) 기능에 더해 Clustering 기능을 제공해 줍니다. 각각의 특징과 장, 단점에 대해 설명드리겠습니다. 1. MySQL Replication Master/Slave 방식의 구성 Master(Write) / Slave(Read) 여러 개의 DB를 권한에 따라 수직적인 구조(Master/Slave)로 구축하는 방식 Master node에서 write transaction이 수행되면 Master node는 MySQL Data File이란 곳에 Data 저..

Database 2023.09.21

[DB] MariaDB, MySQL 비교

오늘은 RDBMS 중에서도 많이 사용되고 있는 mysql과 mariadb를 알아보려고 합니다. 이 둘은 서로 호환성도 좋지만, 성능적인 면에서 크게 차이가 있습니다. 우선 공통점부터 알아보겠습니다. MySQL 세계에서 가장 많이 쓰이는 오픈 소스 관계형 데이터베이스 관리 시스템 다중 스레드. 다중 사용자, 구조질의어 형식의 데이터베이스 관리 시스템으로 Oracle이 관리 및 지원하고 있습니다. SQL이라고 칭하는 구조화된 쿼리 언어를 사용하여 데이터를 정의, 조작, 제어, 쿼리할 수 있습니다. 데이터가 하나 이상의 열과 행의 테이블에 저장되어 서로 다른 데이터 구조가 어떻게 관련되어 있는지 쉽게 파악할 수 있습니다. GUI를 통해 액세스할 수 있습니다.(MySQL Workbench) MariaDB MyS..

Database 2023.09.20

[Spring] 재고 시스템으로 알아보는 동시성 이슈 해결 방법

오늘은 동시성 이슈를 해결하는 과정에 대해서 포스팅하려고 합니다. 재고 시스템을 통해 Application Level에서 문제를 해결하는 방안, Database가 제공하는 Lock을 이용해서 문제를 해결하는 방안, Redis의 Lettuce, Redisson을 활용하는 방안에 대해서 설명드리겠습니다. domain은 간단하게 재고 갯수, version 정보(Optimistic Lock을 적용하기 위함)가 담겨있고, 재고 개수를 감소시키는 decrease 메서드 Stock 클래스로 구성되어 있습니다. service는 domain에서 재고 개수를 감소시키는 decrease 메서드를 호출하는 비즈니스 로직으로 구성되어 있습니다. 이제 multi-thread 환경에서 동시에 100개의 요청을 보냈을 때의 발생하는..

Java/Spring 2023.09.19

[Docker] Dockerfile을 이용해 SpringApplication 빌드 및 실행

Dockerfile을 이용해서 image를 생성하고, SpringWebApplication을 실행해보려고 합니다. dependency는 Spring Web만 추가하면 끝입니다. 우선 여기서 build를 진행해 줘야 jar파일이 생깁니다. 이후 cd build/libs로 이동하면, 다음과 같이 jar파일이 있음을 확인하실 수 있습니다. 추가적으로 도커로 실행하기 위해 openjdk 11 images을 다운로드 받아야 합니다. (docker pull openjdk:11-jre-slim) .jar파일이 있는 곳에 Dockerfile을 작성해야 합니다. FROM : [images name]:[tag name] ARG: build 시점에만 사용되는 변수 COPY: JAR_FILE의 변수를 app.jar로 복사 E..

DevOps/Docker 2023.09.14

[Spring] 동시성 이슈 및 해결 방안

동시성 두 개 이상의 세션이 공통된 자원에 대해 읽고 쓰는 작업을 하는 경우, 발생할 수 있는 문제 동시성 문제의 2가지 현상 일관성 없는 읽기 세션 2는 동시에 실행되고 있는 세션 1 때문에, 데이터에 접근하는 시점마다 다른 값을 읽게 됩니다. 이러한 문제는 “불변성”, 복사본을 이용하여 해결, 세션2가 최초로 데이터를 조회하는 경우, 해당 데이터를 복사하고 이후에도 계속 사용하는 것입니다. 하지만, JPA에서는 영속성 컨텍스트에 데이터를 1차 캐시에 캐싱하기 때문에, 일관성 없는읽기에 대한 문제는 없습니다. 갱신 손실 세션2에 의해 세션 1의 변경 사항이 무시되는 현상 이러한 동시성 문제를 해결하기 위한 방안 Optimistic Lock(낙관적 락) 자원에 Lock을 걸지 않고 충돌이 발생했을 때, ..

Java/Spring 2023.09.12

[DB] Redis란 무엇인가?

Redis(Remote Dictionary System) "key-value" 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스기반의 비관계형 데이터베이스 관리 시스템 in-memory 데이터 저장소(RAM)로서 모든 데이터를 메모리에 올려둡니다. (caching) 평균 작업 속도가 1ms로 굉장히 빠른 편이며, 초당 수백만 건의 작업이 가능합니다.(지연시간 감소, 처리량 증가) (caching) Scale-up, Scale-out, Replication, Sharding 기능 지원 Scale-up: 동일 서버 하드웨어에 컴퓨팅 자원(CPU, Memory)을 추가(서버 성능 향상) Scale-out: 서버를 여러 대 추가하여 시스템 확장(서버 성능 향상) Replication: 동일 데이터를 다수..

Database 2023.09.08

[Docker] Docker-Compose를 사용하여 Springboot와 ELK stack 연동

ELK에 대해 간단하게 설명드리고 springboot와 elk stack을 연동해서 springboot 애플리케이션의 log를 수집하고, 검색 및 시각화하는 과정에 대해서 보여드리겠습니다. ELK Stack Logstash 다양한 소스(DB)의 로그 또는 트랜잭션 데이터를 수집, 집계, 파싱하여 ES에게 전달 ElasticSearch Logstash로부터 받은 데이터를 검색 및 집계하여 필요한 관심 있는 정보 획득 Kibana Elasticsearch의 빠른 검색을 통해 데이터를 시각화 및 모니터링 우선 elk stack을 연동하기 위해 elk 관련 image를 다운로드 받아야 합니다. (호환성을 위해 elk 버전 일치 시켰습니다) docker pull elasticsearch:8.3.3 docker p..

DevOps/Docker 2023.09.04