반응형

분류 전체보기 46

[Spring] Spring Boot JPA 낙관적 락(Optimistic Lock)을 활용한 동시성 제어 방법

웹 서비스는 기본적으로 동시에 여러 요청을 처리한다 문제는 여러 사용자가 동시에 같은 데이터를 접근하여 수정할 때 발생한다예를 들어 재고가 현재 1개만 남아 있는 상품이 존재한다고 했을 때 여려 명의 사용자가 주문을 하게 된다면 어떻게 될까 기본적인 설정에서 동시성 처리를 하지 않는다면재고가 1개만 남아 있는 상황에서도 동시에 여러 요청이 들어와 재고가 -1이 되는 현상이 발생할 수 있다 이러한 상황을 Race Condition (경쟁 상태) 이라고 한다 Race Condition (경쟁 상태) 은 여러 스레드(또는 트랜잭션)가 동시에 하나의 자원에 접근하면서의도하지 않은 결과를 만들어내는 현상이다 해당 문제는 일상에서 사용하고 있는 실제 서비스에서도 발생할 수 있다재고량을 초과한 상품 판매하나의 좌석이..

Back-end/Spring 2026.02.13

[Spring] Spring Boot(Log) Slf4j, Logback 로깅 레벨 관리하는 방법

평소에 로깅에 대해서 많이 고려하지 않고 간단하게 @slf4j 어노테이션을 통해서 간단하게 로그 확인용으로 사용하기만 해서 로깅을 어떤 상황에 사용하고 왜 사용하는지 궁금증이 생기기 시작했습니다 그리고 사이드 프로젝트로 개인 운영 서버를 몇 개 운영하는 입장에서도 로깅에 대한 필요성을 느끼고 있으며 이번에 로깅에 대해서 정리해보려고 합니다로깅(Loggin)이란?소프트웨어 애플리케이션이 실행되는 동안 방생하는 모든 상태,흐름,이벤트,오류 정보를 순서대로 기록으로 남기는 행위를 말한다 이 기록은 단순히 개발 중 확인용이 아닌 운영 중인 애플리케이션(서버)의 상태를 기록하고 문제를 추적하기 위한 근거 자료라고 볼수 있다 즉 이 시스템에서 어떤 일이 일어나고 있는지 확인할 수 있는 자료를 기록하는 행위이다로깅..

Back-end/Spring 2026.02.12

[IntelliJ IDEA] 인테리제이에서 오랫동안 열지 않은 프로젝트 라이브러리 인식 오류 해결 방법

이전에 작업했던 Spring 프로젝트를 IntelliJ IDEA로 작업하려고 하면 매번 동일한 오류가 발생하는데 외부 라이브러리를 인식하지 못하는 상태가 지속되었다 해당 프로젝트는 과거에는 정상적으로 동작했던 프로젝트인데 인식하지 못하고 빨간 줄이 뜨며 프로젝트 실행이 안 되는 상황을 마주하니 원인 분석과 문제 해결 방법을 직접 기록하는 게 좋다고 생각해서 작성을 하게 되었습니다💡 원인 분석이전에는 잘 돌아가던 프로젝트가 오랫동안 사용하지 않아서 실행이 안된다이런 프로젝트가 세월에 흔적을 남기듯 먼지가 쌓여서 문제가 발생하는 하드웨어도 아닌데 왜 이런 상황이 반복되는걸까 주요 원인으로는 3가지로 추측된다 1. Gradle/Maven 의존성 캐시 불일치오랜 기간 프로젝트를 사용하지 않아 로컬 캐시와 프로..

IDE 2026.02.09

이미지 리소스를 S3 + Cloudflare 캐시로 분리하여 비용을 줄인 경험

개인 운영 서비스를 운영하면서 체감됐던 문제 중 하나는 이미지 트래픽에 대한 요청 비용이었다 서비스 특성상 이미지가 한 번 업로드되어 사용될 때 거의 변하지 않는 정적 리소스로 사용되는데 구조상 API 요청을 통해 매번 S3의 URL을 응답받아 사용하는 방식이었다 그러다 보니 자연스럽게 이런 의문이 들기 시작했다변하지 않는 정적 리소스를 매번 새로 요청할 필요가 있을까? 계속 이렇게 매번 요청을 하면 요청 횟수와 그에 따른 데이터 요청 비용이 사용자가 늘어남에 따라 비례해서 증가할거라고 예상했습니다 실제로 혼자 서비스를 1달간 사용했을 때 이미지의 요청 수는 AWS 프리티어의 기준 2만 요청 정도 나왔다(프리티어는 2만 요청수까지 무료로 제공한다) 이러한 구조는 실제로 사용자가 늘어나면 비용과 성능 모두..

개인 운영 프로젝트 N + 1 문제 해결로 1900ms → 543ms로 70% 성능 개선

개인적으로 게임 관련 사이트를 운영 중인데 서비스를 이용하면서 특정 API의 응답이 체감상 다소 느리다는 느낌을 받았다실제로 어느 정도 지연이 발생하고 있는지 확인하기 위해 PostMan을 통해 배포 서버에 요청을 보내 API 응답 시간을 측정해 봤다 그 결과, 문제가 된 API의 평균 응답 속도는 약 1900ms으로 확인되었고 자주 조회되는 API임을 고려했을 때 개선이 필요하다고 판단했다서버 환경 및 인프라 구성해당 프로젝트는 다음과 같은 환경에서 운영 중이다AWS EC2 (프리티어)인스턴스 타입: t2.micro 메모리(RAM): 약 2GB (가상메모리 포함)운영체제: LinuxAWS RDS 사용 (관계형 데이터베이스)Cloudflare CDN을 앞단에 적용하여정적 리소스 캐싱HTTPS 및 기본적인..

[Spring] Spring Security JWT 로그인 구현 필수 개념 (Session, JWT, Access / Refresh Token)

이전 글에서 Spring Security의 기본 구조와 인증 처리 흐름에 대해 작성해 보았습니다이번에는 Spring Security를 이용하여 JWT 토큰 기반 인증 방식을 적용한 로그인 서비스를 구현해보려고 합니다 Spring Security에서 기본적으로 세션(Session) 기반 인증 방식을 제공하고 있습니다세션 기반 인증클라이언트가 서버에 로그인 요청을 보내고 로그인 성공 시 서버가 사용자의 인증 정보를 세션에 저장하고 세션 ID를 생성하여 클라이언트에 쿠키로 전달한다 이후 요청에서 클라이언트는 세션 ID를 함께 보내 서버에서 사용자를 식별한다위 다이어그램은 세션 기반 인증 방식의 전체 흐름을 간단하게 나타낸 것이다 클라이언트와 서버 간의 인증 방식은 크게 다음과 같은 순서로 진행된다 1. 로그인..

Back-end/Spring 2026.01.16

[Spring] Spring Security 기본 구조와 인증 처리 흐름 (Filter Chain)

Spring Security란?Spring Security는 Spring 기반 애플리케이션의 인증(Authentication)과 인가(Authorization)를 담당하는 보안 프레임워크웹 애플리케이션에서 사용자의 접근을 제어하며 권한에 따른 리소스 보호하는 역할을 합니다 또한 Spring Security는 다양한 보안 관련 옵션을 기본으로 제공하고 있으며 대표적으로 CSRF 공격, 세션 고정(Session Fixation) 공격과 같은 웹 보안 위협을 방어할 수 있도록 지원합니다 여기에 JWT 기반 인증을 도입하고 Token을 HttpOnly 쿠키로 관리하는 방식으로 구현한다면 프론트에서 자바스크립트를 통한 토큰 접근을 차단할 수 있어 XSS 공격에 대한 방어 수준을 강화할 수 있습니다 CSRF 공격사..

Back-end/Spring 2026.01.09

[Java] 자바 자료구조 백엔드에서 어떻게 사용할까? (List)

백엔드 개발에서 많이 사용하는 자료구조는 List라고 생각합니다 주로 게시글 목록,조회 결과,API 응답 데이터 등 여러 데이터를 순서대로 다뤄야 하는 상황에서 사용됩니다여기서 List를 왜 사용하고 어떤 구현체를 통해 구현했는지에 대해 알아보고자 합니다 Spring 기반 프로젝트에서 List를 어떤 기준으로 사용했는지에 대해서 작성합니다1. 백엔드에서 List를 사용하는 상황프로젝트에서 List 자료구조는 다음과 같은 상황에서 주로 사용한다 - DB 조회 결과 저장- REST API 응답 데이터 구성List posts = postRepository.findAll();해당 상황에 대한 공통점은 데이터가 여러 개이며 순서가 중요하고 중복을 허용하는 데이터인 경우가 많았다이 조건을 만족하는 자료구조는 Li..

Back-end/Java 2026.01.08

[IntelliJ] 인텔리제이 유용한 플러그인 추천 4가지

주로 JetBrains의 IntelliJ IDEA를 사용하고 있는데요 개발 생산성을 높이고 좋은 방식으로 작업을 할 수 있는 플러그인을 사용하고 있습니다 그중에서 제가 사용하고 있는 플러그인 4가지를 소개합니다JetBrains Marketplace JetBrains MarketplaceWelcome to JetBrains Marketplaceplugins.jetbrains.com JetBrains Marketplace 공식 홈페이지에서 플러그인을 검색하여 설치할 수 있습니다또는 IntelliJ IDEA에서 설정 - 플러그인에서도 사용 가능 합니다1. One Dark Theme - IDE 테마 One Dark Theme - IntelliJ IDEs Plugin | MarketplaceOne Dark t..

IDE 2026.01.04

[Spring] Spring Boot + MySQL 연동 & JPA 활용 심화 (2)

이전 포스팅에서 Spring Boot와 MySQL 연동하여 프로젝트 실행 후 출력되는 로그에 대해서 살펴봤다면 이번에는JPA를 실제 프로젝트에서 어떻게 사용되고 활용하는지에 대해서 작성해보려고 합니다 이번 글에서는 간단한 게시판 프로젝트를 예제로 사용하여 설명합니다엔티티 설계 방식엔티티는 DB 테이블과 매핑되는 클래스로 @Entity 어노테이션이 붙은 객체를 의미한다Spring에서는 JPA를 사용할 때 DB 테이블을 자바 클래스로 설계하고 관리하기 위해 주로 사용된다 그런데 엔티티를 "테이블을 자바 클래스로 옮긴 것" 정도로 생각하기 쉬운데 실제로는 JPA가 상태를 관리하는 객체 입니다JPA는 엔티티를 영속성 컨텍스트에 올려두고, 트랜잭션 동안 엔티티의 상태 변화를 추적하여 커밋 시점에서 필요한 SQL을..

Back-end/Spring 2026.01.03

[Spring] Spring Boot + MySQL 연동 & JPA 활용 심화 (1)

Spring Boot와 MySQL을 연동하는 방법에 대해서 정리하고 JPA를 활용하여 데이터베이스를 설계하고 조작하는 방법에 대해서 작성하려고 합니다 Spring Boot + MySQL 연동 방법1. Spring dependency 설정Spring 프로젝트를 생성할 때 dependency를 다음과 같이 추가해줍니다[1] Spring Web- Spring MVC를 기반으로 HTTP 요청과 응답을 처리하며, REST API와 MVC 템플릿 기반 웹 애플리케이션을 구현할 수 있는 웹 환경을 제공하는 의존성[2} Spring Data JPA- Spring 프레임워크에서 JPA(Java Persistence API)를 쉽고 편리하게 사용할 수 있도록 Repository 추상화를 제공하는 데이터 접근 의존성[..

Back-end/Spring 2025.12.30

[IntelliJ] 인텔리제이 Ultimate 학생용 라이선스 재발급 방법

IntelliJ IDEA Ultimate 라이선스 만료IntelliJ IDEA Ultimate 버전을 학생용 라이선스로 이용하고 있었는데 라이선스가 만료되었다...1년 동안만 유효하기 때문에 1년 뒤에는 다시 재발급을 받아 사용해야 합니다 이제 졸업하면 못쓰니까 다음 학년 때 많이 사용해야겠네요 인텔리제이 Ultimate 학생용 라이선스 발급 [IntelliJ] 인텔리제이 Ultimate 버전 설치 및 학생용 라이선스 발급 방법IntelliJ IDEA 란?IntelliJ IDEA는 JetBrains에서 개발한 통합 개발 환경(IDE)입니다 주로 Java 및 Kotlin 개발에 최적화되어 있으며 다양한 언어와 프레임워크를 지원하고 있고 개발 생산성을 높여주는 기능white63ser.tistory.com1..

IDE 2025.12.26

[MySQL] SELECT 문 기본부터 응용까지 알아보기

백엔드 개발을 하면서 SQL의 SELECT 문을 가장 많이 사용하게 되는 거 같습니다 평소에 JPA라는 ORM을 주로 사용하고 있지만 복잡한 요구사항 및 성능 개선을 위해서 직접 쿼리를 작성하는 경우도 많기 때문에 SQL의 중요성을 깨닫고 있습니다 간단한 요구사항은 ORM의 기본 CRUD 메서드를 활용하면 되지만 그 이상으로는 한계가 있다고 생각하고 있습니다 그래서 그중에서 많이 사용되는 SELECT 문에 대해서 정리해보려고 합니다1. SELECT 기본 문법SELECT 컬럼 FROM 테이블명;가장 기본적인 형태입니다컬럼을 모두 가져오고 싶을 때는 "*"을 사용합니다 하지만 필요한 컬럼만 가져오는 게 좋을 것 같습니다2. AS - 테이블과 컬럼에 이름 붙여 사용하기SELECT id,username FR..

Back-end/MySQL 2025.12.23

군대에서 개발자로 살아남기

군대를 입대할 때 개발 감각을 잃기 싫었다 세상은 빠르게 변화하고 개발자는 계속 공부해야 하는 직업이기 때문이기도 했다개발 감각은 솔직히 몇 주만 안 해도 조금씩 잃어간다 그런데 1년 9개월(공군 이슈)동안 개발 관련 공부를 못한다면 전역 후 나의 개발 감각은 장담 못할 거 같다는 생각에 군대에 가서도 조금이라도 개발 감각을 키워나가 보자고 다짐했다 그래서 제가 했던 군대에서 개발자로 살아남기 위해서 주로 했던 방법이나 방식들에 대해서 말해보고자 합니다자기계발비로 개발 서적 구매하기내가 복무했을 때는 자기 계발비라고 서적,강좌,문화 등등 80% 비용을 지원하는 제도가 있었다 개발 서적을 보면 가격이 만만치 않기 때문에 평소에는 잘 구입하지 않았는데 이런 제도를 적극 활용해서 평소에 관심 있는 개발 서적을..

[Spring] Spring Data JPA 어노테이션 정리 (초기화 전략,연관관계,Repository)

Spring의 대표적인 ORM Spring Data JPA에 대해서 작성해보려고 합니다 먼저 ORM은 객체 지향 프로그래밍 언어의 객체와 관계형 데이터베이스의 테이블 간의 데이터를 자동으로 변환해 주는 기술입니다 간단하게 말하면 DB의 테이블을 클래스 형태로 표현하고 이를 자동을 테이블에 매핑 해주는 기술이라고 보면 됩니다 이게 되게 편리하다고 느끼는 부분이 직접 SQL을 통해서 테이블을 정의하지 않고 클래스 형태로 정의가 가능하기 때문에 훨씬 간편하고 가독성도 되게 좋다고 느끼고 있습니다 또한 기본적인 쿼리문(CRUD)도 지원하고 쿼리메서드도 지원하고 있어 메서드의 이름을 통해서 쿼리문 역할을 할 수 있도록 구현하기도 합니다JPA(Java Persistence API)자바에서 객체와 관계형 데이터베이스..

Back-end/Spring 2025.11.06

[구름톤 유니브] 9oormthonUNIV 4기를 마무리 하며

이번 2025년 초에 전국 대학 연합 동아리 구름톤 유니브를 시작하고 마무리를 짓게 되었습니다9oormthonUNIV 4기를 마무리하며 회고를 작성하려고 합니다구름톤 유니브교내 또는 연합으로 스터디 및 작은 해커톤을 진행하면서 무박 2일 중앙 해커톤을 준비하는 전국 대학 IT 연합 동아리입니다전체적인 일정으로는 3월에 미르미를 모집하고 4~6월에 온보딩 또는 교내 스터디 준비나 지부 별로 작은 해커톤을 진행합니다9월에는 구름톤 유니브의 가장 큰 행사인 중앙 해커톤의 예선,본선을 진행하게 됩니다구름톤 유니브 4기 미르미 참여평소에 협업에 대한 중요성을 알고 있지만 실제로 협업을 진행하기 쉽지 않았다 해보려고 흐지부지 되기 일쑤였고그래서 이번에 구름톤 유니브 4기 미르미를 모집하고 있기에 백엔드로 참여해보고..

[Spring] Java 제네릭과 람다 개념 정리 및 Service 계층 활용 예제

Java는 꾸준히 발전하면서 개발자가 더 안전하고 간결한 코드를 작성할 수 있도록 새로운 기능을 도입해 왔습니다대표적으로 Java 5에서 추가된 제네릭(Generic), Java 8에서 도입된 람다(Lambda) 입니다 이러한 제네릭과 람다를 Spring에서 어떻게 활용되고 왜 사용하는지 알아보려고 합니다1. 제네릭 (Generic) 제네릭(Generic)은 클래스나 메서드가 사용할 타입을 파라미터처럼 일반화하여 다룰 수 있도록 해주는 문법입니다 제네릭은 Java 5에서 처음 도입된 기능입니다 그 이전에는 List, Map과 같은 자료구조 컬렉션을 사용할 때 타입 안정성이 보장되지 않았습니다 List에 문자열과 정수를 동시에 넣을 수 있었으며 값을 꺼낼 때는 무조건 Object 타입으로 반환되기 때문에..

Back-end/Spring 2025.09.23

[Spring] DTO와 ResponseEntity로 깔끔한 응답 처리하기

Spring Boot로 API를 개발할 때 응답을 어떻게 반환할지에 대한 고민이 생깁니다 API 개발을 할때할 때 DB와 같이 사용하여 응답하도록 구현하는데 여기서 엔티티 자체를 반환한다면 불필요한 값도 같이 포함하여 반환하게 되기 때문에 비효율적인 방식입니다 또한 상태 코드나 헤더를 포함하여 반환해야 할 때도 존재합니다 이러한 문제점을 보완 하기 위해 DTO와 ResponseEntity를 같이 사용하게 되면 안정적이고 명확한 응답 처리가 가능합니다DTO(Data Transfer Object)란?API 요청/응답 전용 객체로 엔티티를 직접 노출하지 않고 필요한 데이터만 클라이언트 및 서버에 전달하는 역할을 합니다유지보수성과 안정성을 높여주며 많이 사용되는 방식입니다 다음과 같은 User 엔티티가 존재한다..

Back-end/Spring 2025.08.28

[Spring] Spring Boot Controller & Service & Repository 구조 이해하기 (MVC 패턴)

Spring Boot로 API 서버를 개발할 때 주로 MVC 패턴(Model-View-Controller)을 기반으로 Controller,Service,Repository 계층을 나누어 개발하게 됩니다 MVC 패턴을 사용했을때의 장점과 어떤 방식으로 사용되는지에 대해 정리해보려고 합니다 먼저 Spring Boot의 동작 방식에 대해서 알아보려고 합니다Spring Boot 동작 방식스프링 부트는 spring-boot-starter-web 모듈을 사용하면 기본적인 톰캣(Tomcat)을 사용하는 Spring MVC 구조를 기반으로 동작하게 됩니다 spring-boot-starter-webSpring MVC + 내장 톰캣(Tomcat)을 기본으로 제공하는 모듈REST API,웹 애플리케이션 개발을 위한 필수..

Back-end/Spring 2025.08.27

[Spring] Spring Boot로 간단한 API 만들기 (Hello REST API)

백엔드 개발에 주로 사용되는 Spring 프레임워크를 사용하여 간단한 Hello REST API를 만들어 보려고 합니다REST API는 무엇이고 기본 동작 원리에 대해 정리하려고 합니다REST (Representational State Transfer)자원을 URI로 구분하고 HTTP Method를 활용하여 CRUD를 수행하는 아키텍처 스타일입니다즉 어떤 자원(Resource)에 대해 무슨 행동(Method)을 할지 조합하여 API 설계하는 방식REST API 의 특징- 자원(Resource): /users, /blog/1 처럼 URI로 표현- 행위(Method): GET,POST,PUT,PATCH,DELETE 같은 HTTP Method 사용- 표현(Representation): JSON,XML 등으로 ..

Back-end/Spring 2025.08.26
반응형