| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 욕심쟁이 방법
- 오일러 경로
- Less
- 네트워킹데이
- 동적 프로그래밍 방법
- zsh theme
- mycli
- 인프런워밍업클럽
- zsh
- Pager
- CS스터디
- 데이크스트라
- cs
- 분할정복 방법
- oh-my-zsh
- 터미널
- 순차탐색
- 스터디2기
- spring boot
- table status
- 맥
- 인프런
- mysql 표 출력
- 알고리즘
- 티스토리챌린지
- 오블완
- MySQL
- mysql 표
- VI
- 이진탐색
- Today
- Total
목록2025/12 (16)
Develop
안녕하세요~ .ᐟ 회원가입 API를 테스트하다가 문제를 발견했습니다.이메일 인증 코드를 전송하는데 3.5초나 걸려서, 사용자가 회원가입 버튼을 누르고 3.5초 동안 기다려야 하는 상황이었습니다. 오늘은 이 문제를 Spring의 @Async를 사용해 해결하고, K6로 성능을 측정한 내용을 작성해보겠습니다. 결과 요약 : 3.5초 -> 0.08초로 개선함 문제 상황 : 회원가입 시 인증코드를 이메일로 발송하는 로직이 느림// 동기 방식회원가입 요청 → 인증코드 생성 → DB저장 → 이메일전송(5초 대기) → 응답ex) 응답 시간: 5초// 비동기 방식회원가입 요청 → 인증코드 생성 → DB저장 → 이메일전송 요청 → 즉시 응답 ↓ (백그라운드)..
안녕하세요 ~ .ᐟ 오늘은 Spring Boot에서 이메일 인증 시스템을 구현하는 방법을 정리해보겠습니다. 목표Gmail SMTP를 이용한 이메일 전송6자리 인증 코드 생성 및 검증인증 코드 만료 시간 관리 (10분)회원가입 전 이메일 인증 필수화 1. 의존성 추가Spring에서 이메일을 보내려면 spring-boot-starter-mail 의존성이 필요합니다.이 라이브러리는 JavaMailSender 인터페이스를 제공하여 SMTP 서버를 통한 이메일 발송을 가능하게 합니다.implementation 'org.springframework.boot:spring-boot-starter-mail' 2. Entity 설계verificationCode: 사용자에게 전송할 6자리 인증 코드expiryDate: ..
안녕하세요 ~ .ᐟ어제 만든 JWT 인증은 사용자가 누구인지 신원만 확인합니다.오늘은 무엇을 할 수 있는지 제어하는 역할 기반 권한 관리(Authorization)와 리소스 소유권 검증을 추가해보겠습니다.Spring Security의 @PreAuthorize를 사용해 메서드 레벨에서 권한을 검증게시글 작성자 본인만 수정/삭제할 수 있도록 소유권 검증 로직 추가 먼저 헷갈리기 쉬운 두 개념을 먼저 정리하고 가겠습니다.인증(Authentication) : 누구인지 → JWT 토큰으로 신원 확인인가(Authorization) : 뭘 할 수 있는지 → 역할(Role)과 소유권으로 권한 확인 1. Role Enum 개선기존에도 Role Enum 이 있었지만, 이번에는 각 역할을 지정해주었습니다.Spring Sec..
안녕하세요 ~ .ᐟ어제 게시판 프로젝트에 JWT 인증을 붙였는데 각종 테스트가 다 터지고, 스테이징 서버에 오류까지 나서 하루동안 잡았습니다 ㅎㅎ;;결론부터 말하면, JWT 설정 + Docker + MySQL + GitHub Actions가 전부 한 번씩 폭발하면서 몇 시간 동안 디버깅을 했고, 그 과정을 기록으로 남겨두려고 합니다. 이번 글에서 다루는 내용JWT 만료 시간 환경변수 바인딩 실패 (Failed to bind properties)Docker / docker-compose 환경변수 전달 이슈EC2 스테이징과 로컬에서 DB 호스트/스키마가 달라서 생긴 문제MySQL 8 인증 방식(Public Key Retrieval is not allowed) 이슈GitHub Actions, EC2, do..
안녕하세요 ~ .ᐟ 어제는 Spring Security 의 Basic 인증을 구현했습니다.Basic 인증은 매 요청마다 사용자명과 비밀번호를 Base64로 인코딩해서 보내야 하고, 서버에서 세션을 관리해야 하는 단점이 있었습니다. 그래서 오늘은 JWT를 이용한 무상태(Stateless) 인증 방식으로 전환을 해보겠습니다. 1. JWT (JSON Web Token) 란?정의JSON 형태의 정보를 안전하게 전송하기 위한 토큰구성헤더 (Header) : 토큰 타입과 알고리즘 정보페이로드 (Payload) : 실제 데이터 (사용자 이메일 등)서명 (Signature) : 토큰이 변조되지 않았음을 증명장점Stateless : 서버에 세션 저장 불필요확장성 좋음 (MSA 환경에 적합)모바일 앱에서 사용 편리토큰 자..
안녕하세요 ~ .ᐟ오늘은 Spring Security를 활용한 기본 로그인 기능을 구현했습니다. JWT는 내일 추가할 예정이고, 오늘은 Spring Security의 핵심 아키텍처를 이해하고 로그인 플로우를 보여드리겠습니다. 목차Spring Security 란?Spring Security 의 아키텍처 이해UserDetailsService 구현로그인 API 만들기테스트 결과 1. Spring Security 란?Spring 생태계의 인증/인가 프레임워크쉽게말하면 아래 두 가지를 처리해주는 도구"이 사람 누구야?" (인증, Authentication)"이 사람 이거 할 수 있어?" (인가, Authorization)장점검증된 보안 메커니즘을 쉽게 사용할 수 있음CSRF, XSS 등 보안 공격 자동 방어세션/..
안녕하세요 ~ .ᐟ오늘은 게시판 프로젝트가 2주차 되는날 입니다.내일부터 시큐리티 적용예정으로, 그동한 작성한 코드의 품질 개선과 배포 안정화 위주로 작업했습니다. 주요 작업1. 코드 리팩토링 (상수 관리, DTO 최적화)2. 예외 처리 개선 (ErrorCode 올바르게 사용)3. API 응답 통일 (ApiResponse)4. Blue-Green 배포 개선5. 테스트 커버리지 측정 (JaCoCo) 1. 코드 리팩토링매직 넘버와 문자열을 찾아내서 상수 클래스로 관리나중에 Page Size 를 바꾸고 싶을때 한곳만 수정하면 되기 때문에 상수 클래스로 분리했습니다.// Before// 여기저기 흩어진 10PageRequest.of(0, 10);// 또 다른 곳에서 10PageRequest.of(page, 10..
안녕하세요 ~ .ᐟ 게시글 목록을 조회할 때마다 DB 쿼리가 몇 번이나 실행될까요?단순히 생각하면 게시글 목록 1번 조회하면 끝일 것 같지만, 실제로는 예상보다 훨씬 많은 쿼리가 실행됩니다.이것이 바로 유명한 N+1 문제입니다. 이번 글에서는 N+1 문제가 무엇인지, 그리고 @EntityGraph와 Fetch Join 두 가지 해결 방법을 실제로 적용하고 비교해보겠습니다. N+1 문제란?문제 상황게시글 목록을 조회하면서 작성자 정보도 함께 보여줘야 하는 상황을 생각해봅시다.// 게시글 조회 (1번)List posts = postRepository.findAll();// 각 게시글의 작성자 이름 출력posts.forEach(post -> { System.out.println(post.getUser(..
안녕하세요 .ᐟ오늘은 어제 구현한 QueryDSL 검색 기능을 확장해서, 실제 게시판에서 필수적인 정렬과 필터링 기능을 추가했습니다!사용자가 원하는 방식으로 게시글을 조회할 수 있도록 만드는 과정을 공유해보겠습니다.~ 오늘 구현한 기능동적 정렬: 최신순, 조회수순, 제목순 자유롭게 선택카테고리 필터링: 특정 카테고리의 게시글만 보기복합 조건 검색: 검색어 + 카테고리 + 정렬 조합조회수 자동 증가: 게시글을 볼 때마다 조회수 증가성능 최적화: DB 인덱스 추가 1. 조회수 기능 추가Post.java@Column(nullable = false)private Long viewCount = 0L;public void increaseViewCount() { this.viewCount++;} Servic..
안녕하세요 ~ .ᐟ오늘은 쉘 스크립트, 네트워크, 텍스트 처리 명령어를 알아보겠습니다. 1. 쉘 스크립트 기본쉘 변수*# 변수 선언 (=앞뒤 공백 없음!)*NAME="Linux"NUM=100*# 변수 사용*echo $NAMEecho ${NAME}*# 환경변수 설정*export PATH=$PATH:/new/path*# 위치 매개변수*$0 *# 스크립트 이름*$1, $2 *# 첫번째, 두번째 인자*$# *# 인자 개수*$* *# 모든 인자*$? *# 마지막 명령어 종료 상태* 조건문*# if 문*if [ $NUM -gt 50 ]; then echo "50보다 큼"elif [ $NUM -eq 50 ]; then echo "50과 같음"else echo "50보다 작음"fi*# 비교 ..