Spring Rest Docs + Swagger 문서화

Spring으로 개발한 API 서비스를 문서화하기 위한 도구로 Swagger와 Spring REST Docs를 주로 사용되며, 마이크로서비스 아키텍처에서 아래 그림과 같이 문서화를 진행하였다.

Jvm heap 튜닝

Spring Boot로 구현한 이미지 업로드 서비스가 사용량에 비해 Heap 메모리가 너무 많이 올라가는 현상(최대 98%까지)이 있었고 이를 해결한 과정을 기록한다.

Redis-Cli 명령어로 키 조회 삭제

keys 명령어는 Redis 서버에서 모든 키를 일치하는 패턴으로 검색하여 반환합니다. 이 명령어는 Redis 서버의 성능 문제를 유발할 수 있으므로 가능한 한 피하는 것이 좋습니다.

CentOS 7 Nginx 설치

# vim /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1

Spring JPA JPQL를 사용하면 flush되는 현상

JPQL(Java Persistence Query Languate)를 사용할 경우 1차 캐시라고 부르는 **영속성 컨텍스트(Persistent Context)**와 관계 없이 flush가 자동으로 실행 됩니다. 이렇게 자동으로 flush되는 이유는 영속성 컨텍스트가 변경된 상태에서 JPQL이 선행되면 DB와 영속성 컨텍스트의 일관성이 깨질 수 있기 때문입니다.

Vue 배포 후 캐시로 인해 변경사항이 반영 안될 때

Vue 프로젝트는 기본적으로 SPA(Single Page Application)으로 처음에 모든 컴포넌트를 로드 시킨 다음 구동하는 방식입니다. 만약 수정 또는 신규 내용을 추가한 다음 배포를 하면 캐시 문제로 사용자 브라우저에 반영되지 않는 문제가 발생할 수 있습니다.

Spring Hateoas links https 스키마 적용

Proxy Server나 Load Balancer를 통해 Restful API Service로 요청을 하면 Hateoas links의 스키마가 https가 아닌 http로 생성되는 현상이 있습니다. 이를 해결 하는 방법에 대해 알아보겠습니다.

Spring Boot 도메인 변경

최근에 예전에 만들어진 홈페이지를 Spring Boot로 변경하면서 기존에 사용하던 .do 주소를 제외하였습니다. 처음엔 아래와 같이 main 페이지만 기존 주소도 맵핑 되도록 하였습니다.

데이터베이스 트랜잭션(Transaction)

트랜잭션(Transaction)이란 데이터베이스에서 수행되는 작업들의 논리적인 단위를 말합니다. 예를 들어 회원 가입이라는 작업을 처리할 때 아래와 같은 작업이 순차적으로 수행된다고 가정해봅시다.

InnoDB(MySQL, MariaDB) Lock 매커니즘

InnoDB 잠금(Lock)에는 잠금 모드와 잠금 유형이 있습니다. 잠금모드는 읽기, 쓰기와 같은 행위를 제한하는 것을 의미하고, 잠금 유형은 행위를 제한하는 대상을 말합니다.

SQL Server Lock 매커니즘

SQL Server는 잠금 관리자라고도 부르는 쿼리 프로세서가 트랜잭션의 액세스 유형과 격리 수준에 따라 리소스에 잠금(Lock)을 설정합니다. 잠금(Lock)은 행, 페이지, 테이블 등과 같은 리소스의 잠금 유형(잠금 단위)과 제약 사항에 따라 공유(Shared), 배타적(Exclusive) 등의 잠금 모드로 구분됩니다. 그리고 잠금 관리자는 부모-자식 관계를 가지는 리소스의 계층 구조에서 잠금을 획득할 때, 요청 리소스 뿐만 아니라 부모 리소스들에도 잠금을 표시하고 관리합니다.

Oracle Lock 매커니즘

Oracle에서 제공하는 Lock은 DML Lock, DDL Lock, System Lock 이렇게 크게 3가지 종류가 있습니다. DML Lock과 DDL Lock은 특정 트랜잭션이 데이터베이스의 레코드나 스키마를 변경할 때 해당 Data Block에 잠금 정보(ITL)를 저장합니다. 이 잠금 정보는 Undo Segment의 트랜잭션 테이블에 대한 포인터이며, 이를 통해 트랜잭션 테이블에서 트랜잭션의 활성화 여부를 확인하여 잠금의 상태를 파악할 수 있습니다. 만약 동시에 여러 트랜잭션이 하나의 리소스에 잠금을 요청하면 해당 D...

데이터베이스 Lock 기본 개념

잠금(Lock)은 사용중인 리소스의 무결성을 위해 다른 트랜잭션의 접근을 제한하는 것을 말합니다. 아래에서 설명하는 기본 개념은 표준으로 사용되지만 DBMS마다 제공하는 Lock의 상세 메커니즘은 다르기 때문에 각 DBMS 문서를 확인 해야합니다.

JWT(JSON Web Token)

JWT (JSON Web Token)는 RFC 7519 문서에 정의되어 있으며 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위해 HMAC 알고리즘으로 서명하거나 RSA, ECDSA와 같은 공개/개인키 알고리즘을 사용하여 디지털 서명을 할 수 있는 웹 토큰입니다. 서명된 토큰은 데이터의 무결성을 확인할 수 있고 포함된 정보를 다른 사용자로부터 숨길수 있습니다. 일반적으로 사용자가 로그인하면 JWT를 발급하고 사용자는 후속 요청부터는 헤더에 JWT를 포함하여 요청합니다. 이때 서버는 사용자의 정보를 확인하기 위해 Dat...

OAuth2 인증 방식

Session 인증 방식은 애플리케이션 내 로그인 과정을 통해 서버측에 저장된 메모리 또는 데이터베이스의 유저 정보의 세션 정보를 취득하고 세션이 만료되기 전까지 서비스를 이용할 수 있는 방식입니다. Session 인증 방식은 서비스가 다수의 서버로 구축될 경우, 세션 공유의 문제가 발생할 수 있기 때문에 Sticky Session, Session Clustering, 별도의 세션 저장소(Redis) 구축 등의 방법을 사용합니다.

RSA 암호화

RSA 암호는 공개키 암호시스템으로 암호화와 서명이 가능한 알고리즘으로 공개키(public key)와 개인키(private key)를 사용합니다.

CORS(Cross-Origin Resource Sharing) Preflight Request

브라우저에서 일반적인 요청이 아닐 경우에 Preflight Request라는 예비 요청을 보내 접근 권한이 있는지 확인합니다. 만약 서버에서 Preflight Request을 허용하지 않으면 CORS(Cross-Origin Resource Sharing) 문제가 발생할 수 있습니다.

Web Storage(LocalStorage, SessionStorage, Cookie) 알아보기

어떤한 임시 값을 저장하기 위해서는 서버의 Session에 저장하거나 Browser(Web Storage)에 저장할 수 있습니다. Session을 사용하지 않는 무상태(Stateless) 웹 애플리케이션에서 임시 값을 저장하기 위해 LocalStorage, SessionStorage, Cookie 등에 저장할 수 있으며 저장되는 데이터는 도메인별로 관리됩니다.

Spring Boot Entity에서 Enum 사용하기

Spring boot 프로젝트에서 사용하고 있는 Enum 핸들링 방법입니다. 만들게 많아 보이지만 새로운 Enum이 추가될 때 공통을 제외하고 Enum과 컨버터 클래스만 만들어주면 됩니다.

Spring Boot @Valid, BindingResult

Spring Boot 프로젝트에서 등록, 수정 등의 기능을 구현할 때 입력 값의 validation을 확인하는 작업을 하게 됩니다. 서비스 로직에서 직접 조건을 검사하는 방법도 있지만 javax.validation에서 제공해주는 @Valid를 애노테이션을 사용하면 좀 더 쉽게 구현할 수 있습니다.

Travis 마이그레이션

기존에 사용하던 https://travis-ci.org는 2021년 5월 31일에 종료되었고, https://www.travis-ci.com 에서 계속할 수 있습니다. 그리고 travis-ci.org에서 사용중인 Repository가 있다면 travis-ci.com로 마이그레이션 해야 됩니다. travis-ci.org의 과거 빌드 데이터는 읽기 전용 상태로 유지되며 기록 데이터를 외부 파일 저장소로 다운로드할 수 있습니다.

Intellij SpringBoot LiveReload

Intellij, spring Boot, thymeleaf 환경으로 개발할 때 실행 중에 html 등의 정적리소스를 변경할 경우 반영되지 않기 때문에 서버를 재시작해줘야하는 불편한 부분이 있습니다. 이를 해결할 수 있는 것이 바로 LiveReload입니다.

RequestRejectedException

request url에 세미콜론(;) 또는 슬래쉬(/)가 붙으면 security firewall에서 요청을 거부합니다.

세션 저장소

웹서비스를 담당하고 있는 서버로 수 많은 클라이언트가 접속하여 감당할 수 없는 상태가 되면 서버의 하드웨어를 업그레이드 시키거나(Scale-Up) 서버를 추가(Scale-Out)하여 이를 해결할 수 있습니다.

세션과 쿠키

우리가 사용하고 있는 웹 서비스들은 서버와 클라이언트(브라우저) 간의 정보를 교환을 위해 주로 HTTP 통신을 사용합니다. HTTP는 비연결성(Connectionless)와 무상태(Stateless)라는 특성을 가지기 때문에 클라이언트의 요청을 응답한 후에는 연결을 끊고, 클라이언트의 요청 정보를 기억하지 않습니다. 이러한 특성은 서버의 부담을 감소시켜서 더 많은 요청을 처리하게 해주지만 클라이언트의 인증, 상태 정보 등을 저장할 수 없는 문제가 생깁니다. 이러한 문제를 해결하기 위한 방법이 세션과 쿠키를 사용하는 것입니다.

JavaDoc

Java 소스코드 파일에서 문서화 주석으로 기술된 설명을 HTML 형식으로 생성해주는 도구입니다. HTML 문서로 애플리케이션의 도움말을 구성하면 가독성도 좋으며 하이퍼링크로 각 클래스로 접근할 수 있다는 장점이 있습니다.

JVM

Java는 모든 플랫폼에서 동일한 동작하기 위해 JVM이라는 가상머신을 기반으로 동작하도록 설계되어 있습니다. JVM은 Class Loader, Execution Engine, 런타임 데이터 영역로 구성되어 있습니다. Java Complier를 통해 Java소스파일을 바이트코드(.class file)로 컴파일하고 Class Loader가 바이트코드를 런타임 데이터 영역에 로드 시킵니다. 그리고 로드된 바이트코드를 Execution Engine을 통해 읽고 실행하며 Garbage Collector는 실행중에 Heap영역에 ...

JRE, JDK, SE, EE, OpenJDK

JRE JRE는 JVM, 자바 클래스 라이브러리, 자바 명령 등을 포함하며 자바 프로그램을 실행하는데 필요한 패키지입니다. keytool, policytool 등의 유틸리티도 포함되어 있습니다. JDK JDK는 JRE의 기능 뿐만 아니라 javac, javadoc과 같은 도구 등 java를 사용하기 위해 필요한 모든 기능을 간춘 SDK(Software Development Kit)입니다. Java SE(Standard Edition) 가장 대중적으로 많이 사용되는 에디션으로 네트워킹, 보안, 데이터베이스 등 Jav...

JIRA와 Confluence

JIRA 소개 성공적인 프로젝트를 위해서는 팀이 더 효과적으로 업무를 수행하고 진행 상황과 의견을 공유하고 협업하며 업무 이력을 관리하는 것이 중요합니다. atlassian가 개발한 JIRA는 버그, 이슈 트래커, 요구 사항 관리, 애자일 소프트웨어 개발 관리까지 제공하는 강력한 프로젝트 관리 도구입니다. 제품군으로는 JIRA Software, JIRA Core, JIRA Align, JIRA Service Desk 등 다양한 제품군이 있으며 소규모(10인 이하) 이용자들은 무료로 이용할 수 있습니다. JIRA는 개별 업무...

Visual Studio Code Extensions

Visual Studio Code에서 유용하게 사용할 수 있는 Extensions(3rd party app)를 설치 합니다. 1. Prettier Prettier은 javascript, html 등의 코드를 사용자가 정한 작성 규칙에 맞게 만들어줍니다. 팀 내 코드 작성 규칙이 있다면 prettier로 일관된 작성 규칙을 따라 개발을 할 수 있습니다. install 좌측 메뉴의 extensions 검색창에서 prettier을 검색하여 install합니다. config ...