반응형

전체 글 60

[Spring] Optional 개념과 사용하는 이유 정리 (Spring Data JPA)

Spring 백엔드 개발을 할 때 Optional이라는 객체를 자주 사용하게 되는데 Spring Data JPA를 사용할 때 findById() 메서드의 반환 타입이 Optional으로 되어 있는 걸 볼 수 있는데 조회 결과가 없을 수 있는 상황(Null)을 명확하게 표현하기 위해서 사용된다1. Optional이란?Optional은 Null값을 포함할 수도 있고 포함하지 않을 수도 있는 컨테이너 객체입니다 결과 없음을 명확하게 나타내야 할 필요가 있고 null 오류가 발생할 가능성이 높은 메서드 반환 타입으로 사용됩니다 JDK 26 Documentation - HomeThe documentation for JDK 26 includes developer guides, API documentation, an..

Back-end/Spring 2026.06.29

[Oracle] Oracle Cloud 인스턴스에서 80, 443 포트가 열리지 않을 때 iptables 설정하기

Oracle Cloud 인스턴스에 Nginx를 설치하고 HTTPS를 적용하는 과정에서 인증서 발급을 위해 80번 포트를 개방해야 했습니다 일반적으로 Let’s Encrypt 인증서 발급 과정에서는 도메인 소유권 확인을 위해 외부에서 서버의 80번 포트로 접근할 수 있어야 합니다 처음에는 Oracle Cloud 콘솔에서 VCN 보안 목록의 Ingress Rule만 추가하면 바로 접속될 것이라고 생각했습니다 그래서 VCN 보안 목록에서 80, 443 포트를 개방했음에도 브라우저에서는 접속이 되지 않았고 Nginx와 Certbot 설정 과정에서도 정상적으로 외부 요청이 들어오지 않는 문제가 있었습니다 원인은 Oracle Cloud 보안 목록뿐만 아니라 인스턴스 내부의 iptables에서도 포트가 막혀 있..

DevOps 2026.06.19

웹 개발자가 알아두면 좋은 CSRF, XSS, Clickjacking 공격과 대응 방법

웹 서비스를 개발할 때 인증 기능만 구현했다고 해서 안전한 서비스가 되는 것은 아닙니다 사용자가 로그인된 상태를 악용하는 CSRF,악성 스크립트를 삽입하는 XSS,화면을 속여 의도하지 않은 클릭을 유도하는 Clickjacking과 같은 공격이 어떤 방식인지 알고 해당 공격에 대해 대응할 수 있어야 합니다CSRF (Cross-Site Request Forgery)사이트 간 요청 위조 공격으로 인증된 사용자가 특정 서비스에 로그인된 상태에서 악성 사이트에 접속했을 때 공격자가 사용자의 브라우저를 이용하여 사용자 몰래 원치 않는 요청을 서버에 보내도록 만드는 공격 CSRF가 공격이 가능한 이유는 브라우저가 요청을 보낼 때 해당 도메인의 쿠키를 자동으로 포함하여 서버에 전송하기 때문입니다서버가 요청의 출처를 ..

Back-end 2026.06.19

[Oracle] Oracle Cloud MySQL HeatWave Always Free로 무료 MySQL DB 만들기

개인 프로젝트를 운영하다 보면 MySQL 데이터베이스를 주로 사용하게 되는데요 AWS의 RDS를 사용했지만 프리티어가 끝나서 최근 Oracle로 클라우드를 옮기고 있습니다 기존에 AWS의 RDS에서 Oracle의 MySQL HeatWave으로 이전하는 작업을 통해 Oracle에서는 DB를 어떻게 구성하는지 정리하려고 합니다MySQL HeatWave란? Oracle Cloud의 MySQL HeatWave는 Oracle에서 제공하는 완전 관리형 MySQL 데이터베이스 서비스입니다직접 서버에 MySQL을 설치하고 관리하는 방식이 아니라 클라우드에서 DB 인스턴스를 생성하면 Oracle이 데이터베이스 운영에 필요한 인프라를 관리해 주는 방식입니다 AWS의 RDS와 비슷한 역할을 하는 서비스라고 볼 수 있습니다..

DevOps 2026.06.17

[Oracle] 인스턴스 퍼블릭 IP 적용 후 SSH 접속 방법

Oracle 인스턴스를 생성하고 접속을 하기 위해서 퍼블릭 IP를 발급받고 인스턴스에 할당해줘야 한다1. 인스턴스에 할당할 퍼블릭 IP 발급먼저 Oracle의 우측 상단 메뉴바를 누르면 아래와 같은 화면이 나오는데 오른쪽에 Ip 관리 - 예약된 퍼블릭 IP에 접속예약된 퍼블릭 IPv4 주소 페이지에 접속하면 퍼블릭 IP 주소 예약 버튼이 있는데 클릭하여 진행합니다예약된 퍼블릭 IP 주소 이름만 간단하게 설정하고 퍼블릭 IP 주소 예약 버튼을 눌러줍니다이후 목록에서 발급 받은 퍼블릭 IP 주소를 확인할 수 있습니다2. 발급 받은 퍼블릭 IP 인스턴스에 할당하기퍼블릭 IP를 할당할 인스턴스 세부정보 페이지로 이동해서 네트워킹 메뉴를 눌러줍니다이후 아래로 이동하면 연결된 VNIC에 있는 기본 VNIC에 접속인..

DevOps 2026.06.17

[TOPCIT] 탑싯 25회 정기평가 715점 후기

시험 후기 (715점)TOPCIT 25회 정기평가에 응시해서 715점 이라는 고득점을 받았습니다!! SQLD,정보처리기사 4학년 전공 과목을 중점으로 공부하다 보니 자연스럽게 실력이 좋아지는것 같습니다 [TOPCIT] 탑싯 24회 정기평가 후기 및 준비 방법재학 중인 대학교가 SW 중심대학으로 선정되어 있어 교내에서 TOPCIT 시험을 학교에서 응시하도록 지원을 하고 있으며또한 시험 장소가 재학 중인 학교에서 시험을 치르기 때문에 TOPCIT 시험을 응white63ser.tistory.com이전에 응시했던 24회 정기평가에서는 537점 이라는 점수를 얻었지만 수준 4 & 700점을 넘겨보자 했던 목표를 달성했네요 700점 넘겼는데 교내 1등을 할 수 있을지는 모르겠네요 하지만 수준 4를 넘긴 만큼 성..

[Oracle] Oracle Cloud 인스턴스 생성 해보기

평소에 AWS를 주로 사용하고 있었는데 프리티어가 끝나버렸다 대체할 클라우드를 찾던 중 오라클 클라우드의 프리티어를 보고 사용하기 적합하다고 판단하여 오라클 클라우드로 프로젝트 인프라 마이그레이션도 진행 하면서 인스턴스 생성하는 방법에 대해서 기록해보려고 합니다Oracle Coude Free Tier1. 메인 페이지 인스턴스 생성오라클 클라우드에 접속하여 메인 페이지의 VM 인스턴스 생성을 클릭하여 인스턴스를 생성합니다1-1 이미지(OS) 설정인스턴스의 이미지는 OS 즉 운영체제를 의미하고 원하는 이미지를 선택하여 생성할 수 있습니다기본 이미지는 Oracle Linux 9 으로 설정되어 있습니다 저는 Ubuntu 이미지를 선택하여 설정하도록 하겠습니다다음으로 이미지의 세부 버전을 설정할 수 있습니다 저는..

DevOps 2026.05.25

백준 서비스 종료 선언...

백준이 서비스를 종료한다는 공지를 처음 봤을 때 솔직히 믿기지 않았다 아니 믿고 싶지 않았다늘 당연하게 접속하던 사이트였고 코딩테스트를 준비할 때도 알고리즘 공부를 할 때도 그냥 습관처럼 들어가던 곳이었다 solved.ac와 함께 매일 티어를 올리고 푼 문제 수를 늘리고 새로 생긴 문제를 구경하는 일이 너무 익숙했다 최근에는 다시 PS 공부를 제대로 해보려고 마음먹고 있었다하루에 한 문제씩이라도 꾸준히 풀자는 생각으로 1일 1백준도 다시 시작했다예전처럼 브론즈부터 차근차근 감을 되찾고 골드 문제도 다시 풀어보고 언젠가는 플래티넘 문제도 다시 도전해보려고 했었다 그런데 갑자기 서비스 종료 공지를 보니 머리가 멍해졌다뭔가 해야 할 일이 있는데도 손에 잘 안 잡히고, 공부를 하려고 해도 집중이 안 된다사이트 ..

[Spring] Spring Data JPA Native Query 사용법 및 매핑 방법

MVP 모델을 빠르게 만들 때는 Spring Data JPA를 사용하면 대부분의 조회는 JPA에서 제공하는 쿼리 메서드를 통해 충분히 처리 할 수 있습니다 간단한 CRUD 정도를 빠르게 개발하는데 목적이 있기 때문입니다 하지만 프로젝트가 점점 커지고 요구사항이 많아지면서 조회해야 할 데이터가 많아질수록 단순 조회로는 처리할 수 없는 상황이 생깁니다 예를 들어 - 여러가지 테이블을 JOIN 하여 한 번에 조회해야 하는 경우- 테이블의 여러 데이터를 조합하여 계산해야 하는 경우- CASE WHNE,GROUP BY,SUM,LIMIT,윈도우 함수 같은 SQL 기능이 필요한 경우- 성능 최적화를 위해 DB레벨에서 직접 통제해야 하는 경우 이러한 상황에서 Native Query를 사용하면 SQL을 통해 제어할 수 ..

Back-end/Spring 2026.04.05

[GitHub] GitHub 학생 인증 혜택 Pro 플랜 라이선스 재발급 방법

GitHub Pro 플랜을 학생 인증을 통해 무료로 업그레이드하여 사용하고 있었는데 최근 라이선스가 만료된다는 이메일을 받게됐다저 아직 학생인데요 뭐야 혜택 돌려줘요... 이메일은 GitHub 계정 학생 인증을 통해 무료로 Pro 플랜을 제공하는 쿠폰이 2026년 3월 25일 라이선스가 만료된다는 내용이었다최근에 알게 됐는데 GitHub 학생 인증 혜택은 2년간 유효한다는 것이었다 자동 연장이 되지 않기 때문에 유효 기간을 확인하고 재발급받을 수 있도록 체크하는 게 좋을 것 같습니다 즉 아직 학생 신분을 유지하고 있더라도 2년이 경과했다면 다시 학생 인증을 해야 한다는 말이다GitHub Pro 플랜 혜택 및 발급 방법 [GitHub] 대학생 Pro 플랜으로 무료로 업그레이드 하기 (뱃지 증정)깃허브 P..

Git & GitHub 2026.03.19

[TOPCIT] 탑싯 24회 정기평가 후기 및 준비 방법

재학 중인 대학교가 SW 중심대학으로 선정되어 있어 교내에서 TOPCIT 시험을 학교에서 응시하도록 지원을 하고 있으며또한 시험 장소가 재학 중인 학교에서 시험을 치르기 때문에 TOPCIT 시험을 응시했었습니다 TOPCIT 시험 후기와 고득점을 위해서 준비하면 좋은 방법을 정리해보려고 합니다TOPCIT 이란? 홈 | TOPCIT온라인학습센터 TOPCIT 에센스에서 TOPCIT 학습에 필요한 강의를 무료로 수강하실 수 있습니다.www.topcit.or.kr TOPCIT(Test Of Practical Competency in IT) 은과학기술정보통신부와 정보통신기획평가원(IITP)에서 시행하는 IT 역량 평가 시험입니다 일반적인 자격증 시험과는 다르게 단순한 암기 위주의 문제가 아니라실제 IT 실무 능력과..

[Spring] @Transactional 내부 동작 원리

Spring Boot로 백엔드 개발을 하면서 자주 사용되는 어노테이션 중 하나가 @Transactional입니다이번에 정보처리기사,SQLD를 취득하기 위해서 공부를 하다 보니 트랜잭션(Transaction)에 관심이 많이 가지게 되었는데 Spring에서 트랜잭션을 다루는 어노테이션 @Transactional의 내부 동작 원리에 대해 알아보려고 한다 보통 @Transactional 을 해당 메서드를 하나의 트랜잭션으로 실행한다라고 간단하게 생각하며 사용한다하지만 실제로는 Spring 내부에서 여러 컴포넌트가 결합하여 트랜잭션을 관리한다 먼저 트랜잭션에 대해서 짚고 넘어가 보려고 한다 트랜잭션은 무엇이고 어떤 특징을 가지며 왜 사용되는지 간단하게 알아본다 트랜잭션(Transaction) 트랜잭션은 데이터..

Back-end/Spring 2026.03.10

[Spring] Spring Boot 운영 환경 모니터링 시스템 구축 방법 (Prometheus + Grafana + Docker)

해커톤에서 Prometheus와 Grafana를 활용해 모니터링을 도입해 본 경험이 있다하지만 당시에는 시간이 촉박해 구현에 집중하느라, 모니터링 시스템의 구조나 구현 과정을 체계적으로 정리하지 못했다 이후 AWS 환경에서 Spring Boot 기반 서비스를 배포하고 운영하면서 AWS의 모니터링 시스템만으로 측정하는 것에 한계가 느껴졌다 - 현재 API 응답 시간이 안정적인가?- JVM 메모리는 충분한가?- 특정 시간대에 요청이 집중되고 있는가? 기존 클라우드 환경에서 제공하는 기본 모니터링(CPU,메모리 사용량 등)만으로는 애플리케이션 내부 상태까지 파악하기 어려웠다 이번 글에서는 Spring Boot + Docker + AWS 환경에서 Prometheus와 Grafana를 활용하여운영 환경 모니터링 ..

Back-end/Spring 2026.02.23

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

이전 글에서 낙관적 락(Optimistic Lock)을 적용하여 동시성 제어를 하는 방법에 대해서 다뤄봤습니다 [Spring] Spring Boot JPA 낙관적 락(Optimistic Lock)을 활용한 동시성 제어 방법웹 서비스는 기본적으로 동시에 여러 요청을 처리한다 문제는 여러 사용자가 동시에 같은 데이터를 접근하여 수정할 때 발생한다예를 들어 재고가 현재 1개만 남아 있는 상품이 존재한다고 했white63ser.tistory.com이번에는 비관적 락(Pessimistic Lock)을 적용하여 동시성 제어를 하는 방법에 대해서 작성하려고 합니다 공연 티켓 예매를 해본 사람이라면 익숙한 문장이 있습니다 수많은 대기열을 뚫고 들어가서 포도알(좌석)을 보고 눌렀더니 나오는 한 줄의 메시지이미 선택된 좌..

Back-end/Spring 2026.02.15

[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
반응형