공부한 내용
docker+github actions 이용해 배포 자동화하기(CICD)
•
도커 설치해주자,,, 데톱에만 있고 노트북엔 없어서 설치해주었다.
2.
다운 받은 'Docker Desktop Installer' 실행
•
안내에 따라 설치
•
설치 중간에 Configuration 항목은 모두 체크
3.
설치 완료
•
설치가 끝나면 "Installation succeeded" 화면이 나오고
•
시스템 상태에 따라서 재시작 및 재로그인
◦
Docker Desktop 실행했더니 추가적인 설치 with WSL 업데이트하라는 에러 → WSL2 설치
1.
Windows PowerShell 관리자 권한으로 열기
2.
WSL2 요구사항 확인 → # winver 입력
•
x64 시스템의 경우: 버전 1903 이상, 빌드 18362 이상
3.
아래 명령어 입력해서 Virtual Machine 기능 사용
# dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
C++
복사
4.
WSL2 업그레이드 → 아래 링크 클릭
•
WSL2를 기본 버전으로 설정
◦
# wsl --set-default-version 2
5.
Docker Desktop 실행 성공!
에러
•
CICD 관련 에러
◦
에러) ssh: handshake failed: ssh: unable to authenticate, attempted methods [none], no supported methods remain
▪
해결) PPK 파일을 OpenSSH 포맷으로 변환해서 사용함
PPK 파일은 PuttyGen이나 PuTTY 같은 프로그램에서 사용하는 포맷이기 때문에, appleboy/ssh-action과 같은 대부분의 SSH 액션에서는 직접 사용할 수 없습니다. 대신, PPK 파일을 OpenSSH 포맷으로 변환한 후, 해당 키 파일을 Github Secrets에 등록하고, Github Actions YAML 파일에서 사용해야 합니다. PPK 파일을 OpenSSH 포맷으로 변환하려면, puttygen을 사용하여 변환할 수 있습니다.
•
postman 동작 에러
◦
에러) 모든 api들이 실행이 됐다가 아래 에러가 떴다가 계속 반복함.
▪
해결) 포트 번호 문제 같음 → 아니었음 ㅎ..
•
8080 → 80
•
docker build 할 때 아래 로그가 뜸
Step 3/4 : EXPOSE 8080
---> Running in e21f7d2e3898
◦
Dockerfile에서 EXPOSE 명령어는 컨테이너가 사용할 포트를 지정하는 역할을 합니다. 해당 로그는 Dockerfile의 3번째 줄에서 4번째 줄로 진행되는데, 3번째 줄에서 8080번 포트를 EXPOSE 하고 있다는 것을 나타냅니다. 이는 해당 Docker 이미지가 8080번 포트를 사용할 것이라는 것을 알려주는 것입니다.
즉, 이 Docker 이미지를 실행할 때, 8080번 포트를 열어야 하며, 이를 통해 외부에서 해당 컨테이너로 접근할 수 있습니다.
하지만, EXPOSE 명령어가 포트를 실제로 열어주는 것은 아니며, 단지 해당 이미지가 사용할 포트를 명시하는 것입니다. 따라서 이후에 컨테이너를 실행할 때 -p 옵션 등을 사용하여 포트를 열어주어야 합니다.
▪
해결) 아직 해결 x
이 에러는 API 서버와 연결이 끊어졌거나 서버 자체에 문제가 발생하여 API 요청이 제대로 처리되지 않은 것을 나타냅니다. 이 문제는 일시적 일 수 있으며, API 서버에서 일시적으로 과부하가 발생하거나 인프라 문제가 발생할 때 발생할 수 있습니다.
이 문제를 해결하려면 다음과 같은 조치를 취할 수 있습니다.
1.
재시도 로직 구현: API 호출이 실패하면 일정 시간 후에 재시도하는 로직을 구현하여 이 문제를 해결할 수 있습니다.
2.
API 서버 확인: 문제가 API 서버 쪽에서 발생하는 것인지 확인해야 합니다. API 서버에서 로그를 확인하고 문제를 해결할 수 있는 조치를 취해야 합니다.
3.
인프라 확인: API 서버가 호스팅되는 인프라에서 문제가 발생한 경우, 인프라 관리자에게 문제를 보고하여 조치를 취해야 합니다.
4.
API 요청량 줄이기: API 서버에 대한 요청량이 많은 경우, 요청량을 줄이는 조치를 취해야 합니다. 이를 위해 캐싱, 요청 쓰로틀링 등의 방법을 사용할 수 있습니다.
5.
API 호출 코드 수정: API 호출 코드를 검토하고 수정하여 이 문제를 해결할 수 있습니다. 예를 들어, API 요청 전에 일정한 시간을 두는 등의 방법을 사용할 수 있습니다.
위의 조치를 취하여 이 문제를 해결할 수 있습니다. 하지만 이 문제가 지속되는 경우, API 서버 또는 인프라 구성에 대한 재검토가 필요할 수 있습니다.
에러) feed 삭제 API 500 에러 : could not execute statement; SQL [n/a]; constraint
•
해결) feed와 record(주인) 연관관계가 잇는데 feed만 지우고, record만 남겨주고 싶을 땐 record의 feed를 null로 바꿔줘야 함.
Feed feed = feedRepository.findById(feedId)
.orElseThrow(() -> new EntityNotFoundException("Feed not found"));
Record record = feed.getRecord(); // 연관된 Record 가져오기
if (record != null) {
// feed.setRecord(null); // Record와의 연관관계 제거
record.setFeed(null);
// recordRepository.save(record); // 변경사항 저장
}
feedRepository.deleteById(feedId); // Feed 삭제
Java
복사
챗GPT 답변 (틀린 거 같음) → 이유는 오류 날 거라 했는데, 잘 돌아가서,,
◦
추가 에러) null pointer exception
▪
해결) if문으로 null 체크
•
feed 삭제할 경우(인자로 null이 들어오는 경우) NPE 방지 위함
// Record.java
public void setFeed(Feed feed) {
this.feed = feed;
if (feed != null) { // if문으로 감싸줌.
feed.setRecord(this);
}
}
Java
복사
새로 알게 된 것
하루 정리
TIL 작성하기
Atties
배포자동화(CICD) → 머지
스웨거 적용 PR 코리하기
8시 백엔드 회의
BeachCombine
피드 삭제하기 API 구현