Programming 12

[Infra] "제 컴퓨터에서는 되는데요?" 금지 - Docker 란?

개발을 하다보면 한 번쯤 이런 상황을 겪게 된다. 내 로컬에서는 분명 잘 돌아가던 코드가 팀원의 컴퓨터나 서버에 올리는 순간 갑자기 오류가 난다거나.. 아마 이유는 단순하고 다양할 것이다. Java 버전이 다르거나, 환경변수가 빠져있다거나, OS가 다르거나. 이러한 문제를 해결하기 위해 등장한 것이 Docekr이다.🤔 Docker 란?Docker는 애플리케이션을 컨테이너화하여 가볍고 이식성 있는 패키지로 실행할 수 있게 해주는 소프트웨어 플랫폼이다.주요한 특징으로는 아래와 같다.컨테이너화경량이식성확장성❓ 언제 사용할까?일관된 개발 환경이 필요할 때위에서도 설명했듯이 개발이나 테스트, 운영 환경이 다를 때 발생하는 문제를 피하고자 할 때 사용하면 좋다.빠르게 배포하고 싶을 때개발 환경과 동일한 모든 구성..

코드를 깔끔하고 직관적이게(1) - 디자인 패턴(Design Pattern)이란?

코드를 작성하다보면 으레 고민해야 하는 문제들이 있다. 객체를 어떻게 어디에서 생성할지, 객체 간 소통을 어떻게 하도록 설계해야 할지, 반복되는 코드들을 어디에서 관리할지 등... 개발을 공부하고 나서 초반에는 그냥 되는대로 작성했었다. 그렇다보니 즉흥적이고 규칙없이 직관성없는 스파게티 코드가 되기 일쑤였다. 디자인패턴은 이러한 문제들에 대해 검증된 해결책을 정리해놓은 설계 템플릿이라고 할 수 있다. 1994년 GoF(Gang of Four)라고 불리는 네명의 개발자가(그래서 four구나..) 디자인 패턴 23개를 정리하면서 알려지게 되었다고 한다.디자인패턴, 왜 사용해야 할까?- 커뮤니케이션이 수월해진다.- 검증된 구조를 재사용할 수 있다.- 유지보수하기 좋다.디자인 패턴을 3가지로 분류하면1. 생성 ..

Programming/Java 2025.11.25

[Spring] Batch작업이란?

Spring Batch란? 배치 처리는 주기적으로 대량의 반복적인 데이터 작업을 수행하기 위해 사용하는 방식이다. 예를 들어 백업, 삭제나 필터링 같은 특정 데이터를 처리하는 일을 개별 트랜잭션에서 진행해야 하는데 이런 작업들은 지금 당장 결과가 필요하지 않은 경우가 많다. 이러한 작업들을 모아서 자동으로 처리하는 것이 Batch이다.Batch가 필요한 이유?반복적으로 수행되어야 하는 태스크를 보다 효율적으로 실행하기 위함이다.하루 매출 정산월별 통계 계산로그 분석대량의 알림 발송데이터 백업 / 정리이런 작업을 리소스 사용량이 많은 시간대에 처리하면응답 지연😱서버 부하 폭증😱서비스 장애 가능성 증가😱등의 우려가 있다. 따라서 Batch는 서비스 운영의 부담을 덜어주는 역할을 한다.Batch의 특징..

Programming/Spring 2025.11.19

[DB] DDL, DML, DCL

SQL 명령어는 목적에 따라 크게 DDL, DML, DCL 이렇게 세 가지로 분류된다. 개인적으로 글자도 비슷비슷해서 공부하면서 헷갈렸다...그래서 정리하기 위한 글을 작성해보기로 했다! 각각의 역할과 차이를 명확하게 이해해보자.DDL(Data Definition Language) - 데이터 정의어DDL은 데이터베이스의 구조를 정의하고 변경하는 명령어이다. 즉 테이블을 만들고 수정하고 삭제하는 작업이라고 생각하면 된다.-- 테이블 생성CREATE TABLE users ( id INT PRIMARY KEY, email VARCHAR(100) NOT NULL, role VARCHAR(20));-- 컬럼 추가ALTER TABLE users ADD COLUMN created_at TIME..

[Server] 캐시의 정의와 캐시 유형

캐시(Cache)캐시란 자주 접근하는 데이터를 빠르게 가져오기 위해 임시로 저장해두는 저장소라고 할 수 있다. 예를 들어 온라인 쇼핑몰의 메인 페이지에서 보이는 데이터(인기 상품, 신상품 등)는 사용자 수가 많아질 수록 조회 횟수가 늘어나는데 이때 한 번 불러온 데이터를 일정 기간 캐시에 저장해두고, 다음의 동일한 요청부터 DB에서 불러오지 않고 캐시에서 바로 가져와서 빠르게 응답하도록 하는 상황을 생각해볼 수 있다. 캐시의 필요성1. 자주 접근하는 데이터를 빠르게 조회2. 원본 데이터 소스의 부하를 감소 시킴- 캐시가 없는 요처으이 경우, 데이터베이스로 직접 전달되어 자원을 소모시키게 되는데 캐시를 사용할 경우 동일 데이터를 여러 번 요청해도 데이터베이스에서는 한 번만 조회하면 되므로 DB 연결 수가 ..

Programming/Server 2025.10.22

[Server] 로컬 캐시와 분산 캐시

로컬 캐시와 분산 캐시는 캐시 데이터가 저장되는 위치와 공유되는 범위에서 근본적인 차이가 있다.1️⃣로컬 캐시 (Local Cache): 로컬 캐시는 애플리케이션 내부 메모리(RAM, JVM 힙메모리 등)에 데이터를 저장하는 캐시 구조이다. 각 서버 인스턴스는 자신만의 독립적인 캐시 저장소를 가지며 이는 각자가 책상 위에 개인용 메모 노트를 두는 것과 같다고 볼 수 있다.로컬 캐시는 서버 자체에 존재하므로 외부 네트워크 요청 없이 가장 빠르게 데이터에 접근할 수 있다.장점네트워크 호출이 없고 자신의 메모리에서 바로 데이터를 읽어오므로 응답 속도가 가장 빠르다별도 캐시 서버를 구축하거나 관리할 필요 없이 단순 구현이 가능하다(HashMap, Caffeine 등)단점서버마다 캐시가 달라서 데이터 불일치 가능..

Programming/Server 2025.10.21

[Spring]@Cacheable, @CachePut, @CacheEvict

1️⃣@CacheableSpring Cache의 가장 기본적이자 핵심적인 어노테이션이다. 캐시가 있으면 메서드를 실행하지 않고, 캐시가 없으면 메서드를 실행하고 결과를 캐시에 저장한다. 동작 방식메서드 호출 시, 지정된 캐시(Key)가 이미 존재하는지 확인.존재하면 DB나 외부 호출 없이 캐시의 결과를 바로 반환.존재하지 않으면 메서드를 실행하고, 반환값을 캐시에 저장.// "users" 캐시 저장소에 userId를 키로 사용@Cacheable(value = "users", key = "#userId")public User findUserById(Long userId) { // 캐시에 없으면 이 로그가 찍히고 DB 조회가 발생한다. log.info("Fetching user from DB: {..

Programming/Spring 2025.10.20

[Spring] JWT의 구조

JWT(JSON Web Token)는 헤더, 페이로드, 서명 이 세부분을 점(.)으로 구분하여 구성된 문자열이다.1. 헤더 (Header) 📜헤더는 토큰 자체에 대한 메타데이터를 담고 있다. 여기에는 주로 아래와 같은 두 가지 정보가 포함된다.typ (Token Type): 토큰의 타입을 지정하며, JWT의 경우 항상 "JWT"라는 값을 가진다.alg (Signing Algorithm): 서명을 생성할 때 사용한 알고리즘을 지정한다. 이 정보는 서버가 토큰을 검증할 때 어떤 알고리즘으로 서명을 확인해야 하는지 알려주는 중요한 역할을 한다.2. 페이로드 (Payload) 📦페이로드는 토큰이 실제로 전달하고자 하는 핵심 정보를 담고 있는 부분이다. 여기에 포함된 정보 조각들을 클레임(Claim)이라고 ..

Programming/Spring 2025.10.01

[Spring] JPA에서 N+1이 발생하는 이유

JPA에서 발생하는 N+1 문제는 연관된 엔티티를 조회할 때 발생하는 성능 문제이다.발생 원인: 간단히 말하자면 JPA의 연관관계 처리 방식 때문에 발생한다고 할 수 있다. 즉 지연로딩(LAZY)전략으로 연관 관계가 설정된 엔티티를 조회할 때, 각각의 조회 시도에 개별적으로 추가 조회가 발생하기 때문이다. 예를 들어, 회원(Member)과 주문 (Order)이 1:N 관계일 때, 회원만을 조회한다면, 이후 각 Member의 orders를 조회할 때 추가 쿼리가 발생한다.이러한 경우, ➡️ 첫 번째 쿼리: 회원 전체 조회 -> 1 ➡️ 두 번째 쿼리: 각 회원마다 주문 조회 -> N ➡️ 총 1 + N번의 쿼리가 발생하여 문제가 됨해결방안1) Fetch Join을 사용한다.JPQL에서 JOIN F..

Programming/Spring 2025.09.24

스케일 인, 스케일 아웃 / 스케일 업, 스케일 다운

Scale Up , Scale Down(수직 스케일링)서버 자체를 강하거나 약하게 만드는 것 Scale Up 🔼: 서버 사양을 올리는 것.예) RAM 8GB -> 32GB , CPU 4코어 -> 16코어 Scale down 🔽: 서버 사양을 내리는 것예) 트래픽 줄었을 때 비용 절감하기 - 한 대를 기준으로 키우는 것이기 때문에 한계가 명확함. 업그레이드할 때는 서버를 잠시 내려야 할 수도 있음Scale Out, Scale In(수평 스케일링)서버의 개수를 늘리거나 줄이는 것 Scale Out ➡️: 서버 대수 늘리기예) 서버 1대 -> 10대 Scale In ⬅️: 서버 대수 줄이기예) 새벽시간대와 같이 트래픽이 없는 시간에는 다시 1대로 돌리는 경우 - 클리우드에서 자동으로 관리할 수 있음(Aut..