Github Actions과 Docker을 활용한 CI/CD 구축
·
Web/배포
이전 프로젝트에서는 Spring boot 프로젝트의 빌드 파일을 이미지로 만들어 도커에 올리EC2에서 pull해서 서버를 배포를 하는 방식으로 진행했었다.코드가 변경될때마다 이 과정을 반복했기 때문에 상당히 귀찮고 불편했어서이번 프로젝트에서는 Github Actions를 사용해서 CI/CD를 구축해보려 한다. Github Actions 선택 이유Jenkins, Travis CI 등 다양한 CI/CD 도구가 있지만가장 접근성이 좋고 무료라는 장점이 있어 github actions를 선택하게 되었다. 도커- Dockerfile FROM openjdk:21-jdk-slimARG JAR_FILE=build/libs/*.jarCOPY ${JAR_FILE} app.jarENTRYPOINT ["java", "-Dus..
Spring Boot HTTPS로 배포하기 - CertBot, NginX
·
Web/배포
HTTPS(HTTP Secure)는 기존 HTTP에 SSL/TLS 암호화를 적용한 보안 프로토콜이다.HTTPS는 데이터를 암호화하여 네트워크 상에서 가로채거나 변경하는 것을 방지하고인증서를 통해 서버의 신뢰성을 검증할 수 있기 때문에데이터 유출, 중간자 공격, 피싱 공격 등 다양한 보안 위협으로부터 사용자를 보호한다. 그리고 프론트엔드를 Vercel에 배포하면 기본적으로 HTTPS로 서비스된다.하지만 AWS EC2에 배포한 백엔드가 HTTP로만 제공된다면HTTPS 환경의 프론트에서 HTTP API를 호출할 때브라우저가 이를 혼합 콘텐츠(Mixed Content)로 간주하여 요청을 차단하여네트워크 통신이 이루어지지 않는 문제가 발생한다. 따라서 이러한 문제를 해결하고 안전한 통신을 보장하기 위해 백엔드 서..
[트러블 슈팅] 페이징 쿼리 최적화 - offset, no offset, covering index
·
트러블슈팅
[트러블슈팅] 인덱스로 쿼리 최적화하기 와 이어지는 트러블 슈팅이다.지난 글에서는 인덱스로 정렬 비용을 줄이는 데에는 성공했다. 하지만 OFFSET 30 LIMIT 10 으로 인해 10개만 조회하면 되지만40개를 읽고 필요한 10개를 반환하는 문제가 발생했다. Offset (Offset-based Pagination)LIMIT A OFFSET B라고 한다면 DB 옵티마이저는 A + B만큼의 데이터를 읽은 후불필요한 부분은 버리는 식으로 동작한다. 그렇기 때문에 Offset 기반 페이지네이션은 구현이 단순하다는 장점이 있지만뒷페이지로 갈수록 읽어야 할 데이터의 총량이 많아져 성능이 저하된다. study 테이블에 약 삼백만개의 데이터가 있다. -- 4번째 페이지 조회SELECT s.id, s.n..
[트러블슈팅] 인덱스로 쿼리 최적화하기
·
트러블슈팅
최종 프로젝트 wibby - 스터디 통합 관리 플랫폼 프로젝트를 다시 살펴보면서 개선할 부분을 찾던 와중관리자의 스터디 관리 페이지에 스터디의 개수가 많아진다면 성능이 떨어질 것이라 생각하였다.이 페이지에서는 10개씩 offset 페이징을 하고 있으며 카테고리 필터링과 스터디 이름 검색이 가능하다. 문제 인식study 테이블에 약 삼백만개의 데이터가 있다. SELECT s.id, s.name, s.category, s.finished, s.activatedFROM study sWHERE s.name LIKE '%자바%' AND s.category = 'IT'ORDER BY s.created_date DESCLIMIT 10 OFFSET 30;스터디를 '자바' 검..
[AWS] Spring Boot 프로젝트 배포하기 - EC2, RDS, S3
·
Web/배포
EC2 생성하기- 서버 선택 : 우분투 - 인스턴스 유형 선택프리 티어 사용 가능이라고 적혀있는 인스턴스로 선택한다. - 키 페어 생성EC2에 접속할 때 키 페어를 사용하여 접속하기 위해 생성한다. 다운받은 pem 키는 사용자 밑 폴더에 .ssh 라는 폴더를 생성해서 넣어준다. - 네트워크 설정HTTP도 추가로 열어주었다. - 스토리지 구성크기 30까지 무료이기 때문에 30으로 지정해준다. - 인스턴스 시작설정을 완료하였으니 인스턴스 시작 버튼을 눌러 시작해주면 된다. - EC2 접속EC2 > 인스턴스 > 실행되고 있는 인스턴스 > 연결 > SSH 클라이언트 로 따라 들어가서ssh -i "mozi-server-key-pair.pem" ubuntu@ ~~~ 라고 되어있는걸 복사한 후cmd 창에서 아까 만들..
[트러블슈팅] 동시성 문제 해결하기 - 낙관적 락, 비관적 락
·
트러블슈팅
최종 프로젝트 wibby - 스터디 통합 관리 플랫폼 개발을 진행하던 와중스터디 인원 수에서 동시성 문제가 발생할 것이라고 생각하였다. 문제 인식이 코드는 스터디를 탈퇴하는 로직이다.@Transactionalpublic void leaveStudy(Long studyId, Long userId) { Study study = findValidStudy(studyId); StudyMember studyMember = findValidStudyMember(studyId, userId); if (isLastMember(study)) { study.delete(); studyMember.delete(); return; } if (studyMember..
객체지향의 사실과 오해 스터디 회고
·
회고
한 달 동안 객체지향의 사실과 오해 스터디를 진행하였다. ❗ 스터디를 하게 된 이유데브코스 프로젝트를 진행하면서 setter, getter 지양해라, 추상화해라 캡슐화해라 등의 피드백을 들어객체지향을 왜 필요한지 말로 설명할 수 있을만큼 이해하고싶었고이를 코드에 잘 적용해보고싶다는 생각이 들었다. 객체지향은 자바 스프링부트 강의(김영한) 를 들을 때 얕게 배우긴 했지만왜 객체지향을 써야하며 어떠한 이점이 있는지, 어떻게 적용할 수 있는지를 깊게 알고 싶어 스터디를 모집하였고같이 프로젝트를 하는 팀원 중 한 명과 마음이 맞아 두명이서 진행하게 되었다. ❗ 스터디 진행 방식1주일에 한 번 2장씩 서로 정리해오고 정리한 내용을 한번 훑은 뒤이해가 잘 되지 않거나 같이 이야기할만한 부분들을 위주로 토론하였다..
[트러블슈팅] JPA N+1 문제와 해결법
·
트러블슈팅
3차 프로젝트를 진행하던 와중 지출을 등록 및 수정할 때 n+1 문제가 발생하게 되었다.계획과 일정, 지출이 모두 양방향으로 관계가 맺어져있어 개발을 할 때 이를 고려하고 했어야했는데쿼리가 엄청나게 많이 나가는 문제가 발생했다. n + 1 문제 ?n+1 문제는 연관 관계가 설정된 엔티티 사이에터 한 엔티티를 조회했을 때조회된 엔티티의 개수(N개)만큼 연관된 엔티티를 조회하기 위해 추가적인 쿼리가 발생하는 문제이다. ⇒ 엔티티 조회 쿼리 (1번) + 조회된 엔티티의 개수만큼 연관된 데이터를 조회하기 위한 추가적인 쿼리 (N번) 원인- LAZY(지연) 로딩 : 연관된 엔티티를 필요할 때 조회한다.부모 엔티티 조회 -> 지연 로딩이기 때문에 자식 엔티티 조회 X -> 자식 엔티티 접근 시 추가 조회 발생 ->..
[트러블슈팅] JPA 양방향 관계 설정 시 삭제가 되지 않는 문제
·
트러블슈팅
Tripin 프로젝트를 진행하던 와중 삭제가 되지 않는 문제가 발생했다. 문제 상황TravelSchedule과 Expense는 양방향 OneToOne 관계이다.아래는 간략한 엔티티 코드이다. - TravelSchedule@Getter@Entitypublic class TravelSchedule extends BaseEntity { @OneToOne(mappedBy = "travelSchedule", cascade = CascadeType.PERSIST, orphanRemoval = true) private Expense expense;}영속성 전이와 고아 객체를 설정해두었다.TravelSchedule이 하나의 expense를 가지고 있다. - Expense@Getter@Entitypublic ..
프로그래머스 백엔드 데브코스 5기 합격 후기
·
회고
백엔드 엔지리어닝 데브코스에 합격하여 그 과정을 적어보려고 한다 !지원 절차는 서류 -> 코딩테스트 -> 유선 인터뷰 순으로 진행되었다. 지원동기졸업을 하고 내가 지금 이 상태에서 취업을 할 수 있을까? 라는 고민을 하기 시작했으며이렇다할 프로젝트도 하나밖에 없어 프로젝트를 더 하고 경험을 쌓고 싶다는 생각이 들었다.졸업 프로젝트를 하면서 기초가 많이 부족하다는 생각이 많이 들었었고내가 작성한 코드들이 잘 작성된 코드인가? 라는 의문이 계속 들어 누군가에게 코드 리뷰를 받아보고 싶은 마음이 컸었다.그렇기에 부트캠프에 들어가서 기초부터 다시 다지며 코드를 짜는 나만의 방법을 만들어보고 싶었다. lg 유레카에 지원을 하였지만 첫 면접이라 긴장을 너무 많이 해서 말아먹은탓에 ...(엉뚱한걸 대답하고 다시 물어..