# 프론트 코드 자동 배포 구축github에 커밋을 할 때마다 자동으로 서버에 배포되도록 설정하려고 한다.먼저 jenkins가 설치되어야 한다. 이 부분은 나중에 따로 블로깅하도록 하겠다. # Github 설정## docker 파일 추가react 폴더 아래(src폴더와 같은 위치에)에 dockerfile을 추가한다.eblog-reader└─src└─public└─Dockerfile# base image 설정(as build 로 완료된 파일을 밑에서 사용할 수 있다.)FROM node:22-alpine as build# 컨테이너 내부 작업 디렉토리 설정WORKDIR /app# app dependencies# 컨테이너 내부로 package.json 파일들을 복사COPY package*.json ./# pac..
분류 전체보기
# 사용한 이유필자는 React를 사용해본 경험이 있지만, 앱을 개발하고 싶었다.네이티브 앱으로 새로 배우는 건 시간이 오래걸리기도 하고, 빠르게 배포해서 내가 사용하는 게 목적이기에, React의 pwa 기능으로 웹앱을 구축하기로 하였다. # pwa 구축 과정## 1. PWA React 애플리케이션 생성컴파일 단계에서 에러를 잡는 안정성을 도입하기 위해 typescript로 개발 환경을 설정하였다.// typescriptnpx create-react-app pwa-react --template cra-template-pwa-typescript ## 2. service worker 등록오프라인에서 앱을 구동시킬 수 있도록 설정하는게 목표이기 때문에 service worker를 등록하였다.- index.t..
# 포워드 프록시와 리버스 프록시의 차이점포워드 프록시는 위 그림과 같이 클라이언트 측에서 사용되고, 리버스 프록시는 서버측에서 사용됩니다.차이점 요약 표구분포워드 프록시 (Forward Proxy)리버스 프록시 (Reverse Proxy)사용 위치클라이언트 측 (사용자)서버 측 (서비스 운영자)주요 목적익명성 유지, 인터넷 차단 우회서버 보호, 로드 밸런싱, 보안 강화IP 주소 노출웹사이트는 클라이언트 IP를 알 수 없음백엔드 서버는 클라이언트 IP를 알 수 있음사용 예시VPN, 특정 웹사이트 차단 우회, 익명 브라우징웹사이트 로드 밸런싱, SSL 처리 # 포워드 프록시란? 포워드 프록시는 클라이언트가 웹사이트에 접속할 때 중간에서 대신 요청을 보내주는 역할을 한다.이 과정에서 웹사이트는 클라이언트의 ..
WireGuard vs OpenVPN 차이점특징OpenVPNWireGuard속도준수하지만 WireGuard보다는 느림매우 빠르며 OpenVPN 능가하는 속도를 자랑전송 계층UDP와 TCP를 모두 지원, TCP 443 포트로 구성 가능검열이 심한 국가에서도 우회 가능UDP만 지원, TCP 443 포트 사용 불가검열 우회 어려움호환성더 많은 기기 및 운영 체제와 호환됨거의 모든 VPN이 사용ChaCha20Poly1305 암호화 알고리즘 사용전용 하드웨어 지원 제한적, 점차 개선됨키 교환TLS/SSLCurve25519암호화AES와 같은 안정적인 암호화와 최신 암호화(ChaCha20Poly1305) 모두 지원높은 유연성최신 암호화 방식 사용으로 보안성 높음다만 OpenVPN 방식만큼 오랜 검증 기간 거치지 않음..
필자는 docker로 mysql-container를 열어서 사용했다.아래의 순서대로 mysql-container에 접속한 후, 사용자 목록을 확인하고, spring boot에서 연결할 sql의 유저를 추가한다. 먼저 mysql docker 환경에 접속한후, root로 접속한다.docker exec -it mysql-container /bin/bashmysql -u root -p 그 후 mysql을 사용하고, 어떤 유저가 존재하는 지 확인한다.use mysql;select user, host from user; 사용자를 만든다. (필자는 jamjam으로 만들었다.)create user 'jamjam'@localhost identified by '${password}'; 이 후 jamjam에게 모든 data..
Service단에 @Transactional(readOnly = true)프로젝트를 진행하며 Transactional(readOnly = true)를 굳이 왜 붙이는 지 궁금해서 찾아 보았다.@Service@RequiredArgsConstructor@Transactional(readOnly = true)public class RoomService {일반적으로, 조회용 메서드에 대해서는 readOnly를 설정함으로써 성능상 이점을 얻을 수 있다.JPA - DirtyChecking와의 연관트랜잭션이 Commit 될 때, 초기 상태의 정보를 가지는 Snapshot 과 Entity의 상태를 비교하여 변경된 내용에 대해 update query를 생성해 쓰기 지연 저장소에 저장한다.그 후, 일괄적으로 쓰기 지연 저..
초기 데이터를 설정하기 위해 다음과 같이 코드를 구현한다.여기서 defer-datasource-initialization: true 를 사용해서 초기 데이터를 추가하고 구현한다.spring: config: import: - privacy.yml sql: init: mode: always datasource: url: jdbc:mysql://${test.db.host}:${test.db.port}/${test.db.database}?serverTimeZone=Asia/Seoul&characterEncoding=UTF-8 driver-class-name: com.mysql.cj.jdbc.Driver username: ${test.db.username} ..
일반적으로 단일 스레드 상황의 성공 조회수는 다음과 같다. @Test @Transactional void 성공_조회수_추가() { //given CommentRequestDto commentRequestDto = CommentRequestDto.builder().content("test").build(); //when for (int i = 0; i 하지만 일반적으로 스프링은 스레드풀을 가지고 있어, 한번에 여러 요청이 동시에 이루어 질수 있다.예를 들어 여러명이 동시에 조회수를 추가하는 경우의 테스트를 진행해보자 20개의 스레드가 동시에 조회수를 늘린다면 어떻게 될까? @Test ..
AOP를 사용하는 이유? 애플리케이션 로직은 크게 핵심 기능과 부가 기능으로 나눌 수 있다.1. 핵심 기능 : 해당 객체가 제공하는 고유의 기능2. 부가 기능 : 핵심 기능을 보조하기 위해 제공되는 기능 (ex: 로깅, 트랜잭션, 보안) 보통 기존 프로젝트에 부가 기능을 추가 하게 되면 하나의 클래스가 아닌 여러 클래스에 부가 기능을 추가하게 된다.예를 들어 프로젝트의 모든 클래스에 로그 기능을 추가한다면 하나의 부가 기능(로그 추적)을 여러 곳에 동일하게 사용하게 됩니다.이러한 부가 기능을 바로 횡단 관심사(cross-cutting concerns)라고 합니다. 만약, 여기서 모든 서비스 메소드가 호출될 때 마다 로그를 남겨야 한다고 가정하자.하드코딩을 하면 그냥 모든 메소드에 로깅 코드를 삽입하면 되..
캐싱을 한 부분의 속도를 대시보드로 확인해보기k6로 테스트 한 데이터 (시계열 매트릭 데이터) 를 influxDB라는 시계열 데이터베이스에 저장한다.그 후 그 데이터를 Grafana 라는 시각화 웹 애플리케이션을 사용해서 그래프로 속도의 변화를 보여준다.,이에 대한 이점은 다음과 같다. 1. 시계열 데이터를 관리할 수 있다.2. 시각화를 통해 데이터를 효과적으로 한눈에 보여줄 수 있다.3. 실시간으로 데이터를 확인할 수 있다. 윈도우 환경에서 세팅choco 설치k6를 다운로드 하는데 먼저 chocolatey라는 패키지 매니저를 다운로드한다.윈도우에서 사용할 수 있는 커맨드 라인 패키지 매니저이다.k6 커맨드를 사용해야 하기 때문에 choco를 사용한다.공식 문서 : https://chocolatey.or..