2026. 7. 13. 15:50ㆍ부트캠프/TIL(Today I Learned)
오늘의 학습일지 (Git, SQL, Test, Soft Delete)
- Git
- SQL
- Test
- Soft Delete
오늘은 리뷰 이미지 업로드 기능과 Git 협업, 그리고 회원 탈퇴 버그 수정에 많은 시간을 투자했다.
리뷰 이미지 업로드 기능 구현
오늘 가장 많이 고민했던 부분은 리뷰 이미지 업로드 구조였다.
기존에는 프론트를 통해 그리고 백엔드를 통해 이미지를 S3에 업로드하는 방식만 생각하고 있었지만, 프로젝트에서는 프론트엔드가 S3로 직접 업로드하는 구조를 적용했다.
흐름은 다음과 같다.
사용자
│
▼
POST /reviews/images/presign
│
▼
백엔드
- 업로드 권한 확인
- Presigned URL 생성
│
▼
프론트엔드
│
▼
S3에 직접 PUT
│
▼
POST /reviews
(images key 전달)
│
▼
백엔드
- key 검증
- Review 저장
- Image 메타데이터 저장
처음에는 파일을 직접 다루지 않으니 백엔드의 역할이 줄어드는 줄 알았지만, 실제로는 그렇지 않았다.
백엔드는
- 업로드 권한 확인
- Presigned URL 발급
- 전달받은 Key가 우리 버킷인지 검증
- Review 저장
- 이미지 메타데이터 저장
등 비즈니스 로직을 모두 담당한다는 점을 새롭게 이해할 수 있었다.
Git 브랜치
회원 탈퇴 기능을 리뷰 브랜치에서 잘못 작업한 상황이 발생했다.
브랜치 구조는 다음과 같았다.
89-feat-review
├── 리뷰 CRUD
├── 리뷰 CI 수정
└── 회원 탈퇴 기능
하지만 회원 탈퇴 기능은 별도의 이슈 브랜치에서 관리해야 했다.
이때 사용한 명령어가 바로
git cherry-pick
이었다.
작업 순서는
git switch develop
git pull origin develop
git switch -c 102-feat-user-withdraw
git cherry-pick dc254c2
git push -u origin 102-feat-user-withdraw
결과적으로
- develop 최신 내용 반영
- 새 브랜치 생성
- 회원 탈퇴 커밋만 복사
- 원격 브랜치 생성
회원 탈퇴 버그 해결
오늘 가장 오래 붙잡고 있었던 작업이었다.
발생한 문제
회원 탈퇴 요청 시
DELETE /api/auth/delete
를 호출하면
500 Internal Server Error
가 발생했다.
로그를 확인해보니
Data too long for column 'nickname'
오류가 발생하고 있었다.
원인 분석
회원 탈퇴 시 기존 계정으로 재가입할 수 있도록
username, nickname, email 뒤에 UUID를 붙여 unique 값을 유지하도록 구현되어 있었다.
기존 코드
String suffix = "__deleted__" + UUID.randomUUID();
this.username += suffix;
this.nickname += suffix;
this.email += suffix;
하지만
nickname length = 20
인데
__deleted__ + UUID
길이만 이미 약 47자였다.
즉
nickname + suffix
가
20자를 초과하면서
Data too long
예외가 발생한 것이다.
해결 방법
append 방식 대신
아예 새로운 값으로 치환하도록 변경했다.
String tag = "del_" + this.id;
this.username = tag;
this.nickname = tag;
this.email = tag + "@deleted.local";
이렇게 수정하여
- 컬럼 길이 초과 문제 해결
- Unique 유지
- 기존 계정 재가입 가능
- Soft Delete 유지
를 모두 만족할 수 있었다.
또한
@Transactional
덕분에 오류 발생 시 모든 작업이 Rollback되어 데이터가 손상되지 않았다는 점도 다시 확인했다.
Git 협업에서 브랜치 관리의 중요성
- git cherry-pick
- git switch
- git pull
- git push -u
명령어를 실제 상황에서 사용하면서
잘못된 브랜치에서 작업했더라도 필요한 커밋만 안전하게 이동시킬 수 있다는 점.
merge는 브랜치 전체를 합치고,
cherry-pick은 원하는 커밋만 가져온다는 차이도 확실하게 이해하게 되었다.
버그 해결 과정
로그 확인 → SQL 에러 분석 → 원인 추적 → 코드 수정 → 검증
DataIntegrityViolationException
이 발생했을 때
컬럼 길이까지 계산하며 원인을 찾아가는 과정이었다.
내일 할 것
- 리뷰 이미지 기능 마무리
- 팀원들과 발표 내용 정리
- 팀원들의 배포 작업 마무리 지원
'부트캠프 > TIL(Today I Learned)' 카테고리의 다른 글
| [내일배움캠프_사전캠프_8기]_Days_18 TIL_ 팀 프로젝트-Day10 (0) | 2026.07.15 |
|---|---|
| [내일배움캠프_사전캠프_8기]_Days_17 TIL_ 팀 프로젝트-Day9 (0) | 2026.07.14 |
| [내일배움캠프_사전캠프_8기]_Days_15 TIL_ 팀 프로젝트-Day7 (0) | 2026.07.10 |
| [내일배움캠프_사전캠프_8기]_Days_14 TIL_ 팀 프로젝트-Day6 (0) | 2026.07.09 |
| [내일배움캠프_사전캠프_8기]_Days_13 TIL_ 팀 프로젝트-Day5 (0) | 2026.07.08 |