배운것들을 정리합니다.
三昧境

전체 글 73

Spring Security와 JWT, 구현하며 이해한 인증 구조

JWT 인증을 구현하면서 JwtTokenProvider, JwtAuthenticationFilter, SecurityConfig 같은 클래스를 사용했습니다.처음에는 기능이 동작하는 것에 집중했지만, 구현을 마치고 나니 각 클래스가 왜 필요한지와 어떻게 연결되는지를 다시 정리할 필요가 있었습니다.이번 글에서는 제가 구현한 코드를 기준으로 JWT와 Spring Security를 왜 사용했고, 실제로 어떻게 사용했는지를 정리해보겠습니다. Spring Security와 JWT Spring Security는 인증과 인가를 처리하는 보안 프레임워크입니다.JWT는 로그인한 사용자의 정보를 담아 이후 요청에서 사용자를 확인하기 위한 토큰입니다.즉 이번 프로젝트에서는 Spring Security가 전체 보안 흐름을 관리..

Java/Spring Boot 2026.09.24

[Spring Boot] Community API 프로젝트 회고록 (설계, 문제 해결, 배포)

Community API 프로젝트 전체 소스 코드와 구현 내용을 GitHub에서 확인할 수 있습니다. GitHub Repository → ">Community API프로젝트 전체 소스 코드와 구현 내용을 GitHub에서 확인할 수 있습니다. GitHub Repository → 약 4주 동안 Spring Boot 기반의 커뮤니티 REST API를 개발했습니다.프로젝트를 시작할 당시에는 회원 인증과 게시판 CRUD를 중심으로 약 3주 정도의 개발 기간을 계획했습니다. 하지만 구현을 진행하면서 단순히 기능이 동작하는 것에서 끝내기보다 로그아웃 이후의 JWT 처리, 동시 요청, 예외 응답, 파일 저장 정합성, 테스트, 보안, 실제 배포 환경까지 직접 확인해보고 싶어졌고, 결과적으로 조..

[Spring Boot] EC2 배포 마무리: 도메인, HTTPS, Nginx와 Spring Security 점검

커뮤니티 API 프로젝트의 기능 구현과 테스트를 마친 뒤, 마지막 단계로 실제 서버에 애플리케이션을 배포했습니다.처음에는 단순히 EC2에 Spring Boot를 실행하고 IP로 접근할 수 있으면 배포가 끝난다고 생각했습니다.하지만 실제로 배포를 진행하면서 다음과 같은 부분도 함께 고민하게 되었습니다.서버의 IP가 변경되지 않게 하려면 어떻게 해야 하는가?사용자가 IP가 아닌 도메인으로 접근하려면 무엇이 필요한가?HTTP가 아닌 HTTPS는 어떻게 적용하는가?Spring Boot의 8080 포트를 외부에 직접 공개해도 되는가?EC2가 재부팅되면 Spring Boot, MySQL, Redis는 자동으로 다시 실행되는가?실제 운영 환경에서도 JWT 로그인과 로그아웃이 정상적으로 동작하는가?개발 과정에서 미처 ..

[Spring Boot] AWS를 사용해 Spring Boot API를 EC2에 배포하기 2

지난 글에서는 AWS 배포를 위해 운영 환경을 분리하고, S3 저장 구조와 IAM Role, 파일 정리 배치까지 구성한 과정을 정리했습니다.이번 글에서는 이어서 운영 MySQL에서 Spring Batch를 안정적으로 실행하기 위한 설정과 실제 EC2 배포 과정, 그리고 배포 후 검증 과정을 정리해보겠습니다. 운영 MySQL 환경의 Spring Batch 스키마 관리 기존 프로젝트에는 탈퇴 후 일정 기간이 지난 회원 데이터를 정리하는 Spring Batch 작업이 있었습니다.로컬에서는 H2를 사용하고 있었기 때문에 Batch 실행에 필요한 메타데이터 테이블을 비교적 쉽게 준비할 수 있었지만, 운영 MySQL에서도 같은 방식에 의존하는 것은 적절하지 않다고 생각했습니다.특히 이미 애플리케이션의 DB 스키..

[Spring Boot] AWS를 사용해 Spring Boot API를 EC2에 배포하기 1

프로젝트의 주요 기능 구현과 테스트를 마친 뒤, 마지막으로 실제 운영 환경에 배포했습니다.이전까지는 로컬 환경과 Testcontainers를 통해 MySQL, Redis 등을 검증하고 있었지만, 테스트가 통과한다는 것과 실제 서버에서 서비스가 정상적으로 동작한다는 것은 다른 문제라고 생각했습니다.그래서 이번 작업에서는 단순히 EC2에서 Spring Boot를 실행하는 것에 그치지 않고,운영 환경을 분리S3를 연결외부 요청을 받을 수 있도록 구성한뒤의 실제 사용자 흐름서버 재부팅까지 검증하는 것을 목표로 했습니다.비용과 프로젝트 규모 견적내기 비용과 프로젝트 규모를 고려해 단일 EC2 구조를 선택했습니다.처음에는 MySQL을 RDS로 분리하는 구성도 고려했습니다.하지만 개인 프로젝트에서 처음부터 RDS, ..

AWS(Amazon Web Service), 클라우드와 AWS 주요 서비스 기초 정리

AWS를 공부하기 시작하면 가장 먼저 어려운 부분은 서비스 이름입니다.EC2, S3, RDS, IAM처럼 비슷해 보이는 이름이 계속 등장하기 때문에 각각 무엇을 하는 서비스인지 먼저 구분할 필요가 있습니다.이번 글에서는 특정 프로젝트나 구현 사례보다는 AWS가 무엇인지, 주요 서비스들이 어떤 역할을 하는지, 웹 서비스가 AWS 안에서 어떻게 동작하는지를 정리해보겠습니다. AWS란? 서버, 데이터베이스, 파일 저장소, 네트워크 같은 컴퓨팅 자원을 인터넷을 통해 빌려 사용할 수 있는 클라우드 플랫폼입니다.예를 들어 웹 서비스를 직접 운영한다고 생각해보겠습니다.클라우드가 없다면 서버용 컴퓨터를 구매하고, 운영체제를 설치하고, 인터넷에 연결한 뒤 직접 관리해야 합니다.AWS에서는 이런 장비를 직접 구입하지 않고..

Java/Spring Boot 2026.09.19

[Spring Boot] 커뮤니티 API 보안 점검 (SQL 인젝션, JWT 재사용 문제)

커뮤니티 API를 개발하면서 회원가입, 로그인, 게시글 작성 같은 주요 기능이 정상적으로 동작하는지 테스트했습니다기능 테스트를 어느 정도 마치고 나니 한 가지 궁금증이 생겼습니다.정상적인 요청이 잘 동작하는 것은 확인했는데, 이상한 값을 넣거나 예상하지 못한 순서로 요청하면 어떻게 될까? 예를 들어 이런 상황들입니다.검색창에 admin'-- 같은 값을 입력하면 어떻게 될까?정지된 회원의 토큰은 정지를 해제하면 다시 사용할 수 있을까?파일은 저장됐는데 DB 저장이 실패하면 그 파일은 그대로 남는 걸까?처음에는 막연하게 보안 문제라고 생각했지만, 하나씩 확인해보니 이미 Spring이나 JPA가 막아주고 있는 부분도 있었고, 제가 직접 보완해야 하는 부분도 있었습니다.이번에는 SQL 인젝션, 입력값 검증, ..

[Spring Boot] JWT 필터·저장소 장애·동시성 충돌 예외 처리

이전에는 Spring MVC에서 발생하는 예외를 정리하면서 잘못된 요청과 서버 오류를 구분했습니다.하지만 예외 처리를 다시 살펴보면서 @RestControllerAdvice만으로 모든 실패 상황을 처리할 수 있는 것은 아니라는 점을 알게 되었습니다.특히 JWT 인증은 컨트롤러에 도달하기 전 필터에서 실행되고 있었습니다.이 과정에서도 Redis나 DB를 사용하고 있기 때문에 인증 정보가 잘못된 경우뿐 아니라 저장소 자체가 응답하지 않는 상황도 발생할 수 있습니다.또한 정상적인 요청이라도 여러 요청이 거의 동시에 실행되면 저장 과정에서 데이터 충돌이 발생할 수 있습니다.그래서 이번에는 기존 예외 처리를 한 단계 더 확장하면서 다음 세 가지를 중심으로 점검했습니다.JWT 인증 필터에서 발생하는 오류Redis·..

[Spring Boot] Spring MVC 요청 예외 처리 개선

Community API를 개발하면서 회원이나 게시글이 존재하지 않는 경우처럼 서비스 로직에서 발생하는 비즈니스 예외는 어느 정도 처리하고 있었습니다.하지만 테스트를 진행하면서 예외 처리가 서비스 계층에서 발생하는 오류에만 치우쳐 있다는 점을 알게 되었습니다.예를 들어 잘못된 JSON을 보내거나 필수 파라미터를 누락하는 경우에는 요청이 컨트롤러 메서드까지 정상적으로 전달되기 전에 Spring MVC 내부에서 예외가 발생할 수 있습니다. 기존 코드에서는 이런 예외를 따로 처리하지 않았기 때문에 일부 요청 오류가 500 응답으로 처리될 가능성이 있었습니다.이번 작업에서는 예외 처리 코드를 다시 살펴보면서 클라이언트가 요청을 수정해야 하는 오류와 서버에서 해결해야 하는 오류를 구분하는 것을 우선 목표로 잡았습..

DockerTest

테스트를 작성하다 보니 한 가지 궁금한 점이 생겼습니다.왜 어떤 테스트는 Run으로 실행하고, Docker 테스트는 ./gradlew dockerTest로 실행할까? 일반적인 단위 테스트나 통합 테스트는 IntelliJ에서 테스트 옆의 ▶(run) 버튼을 눌러 바로 실행할 수 있었습니다.그런데 Docker를 사용하는 테스트는 프로젝트에서 다음 명령어로 실행하고 있었습니다../gradlew dockerTest처음에는 "Docker 테스트라서 무조건 터미널에서 실행해야 하나?" 라고 생각했는데, 정확히는 Docker 때문이라기보다 Gradle에서 테스트를 어떻게 구분해 놓았는지와 관련이 있었습니다.JUnit으로 작성한 테스트에는 IntelliJ에서 ▶ 버튼이 표시됩니다.예를 들어 다음과 같은 테스트가 있다면..

Java/Spring Boot 2026.09.18