디스코드 뮤직 봇 개발 및 배포까지
·
프로젝트에서 일어난 일
1. 개요동아리 사람들과 디스코드를 하다가 오랜만에 뮤직봇을 사용했다.근데 너무너무너무 제대로 작동하지가 않고 오류가 많았다. 그래서 그냥 Tave 뮤직 봇을 만들기로 했다. 2. 디스코드 봇 제작Discord Developers에 들어가서 Application을 만든 다음. Application ID와 Token Key를 기억하고 있으면 된다. Token은 외부 노출을 막기 위해 환경변수 파일(.env)를 만들고 주입했다.또한 패키지를 설치해야한다.pip install yt_dlppip install discordpip install dotenv# pip 설치 권한 해제python3 -m pip config set global.break-system-packages true# pip 설치 권한 해제 후..
Spring Cloud Gateway에서 인증/인가 구현하기
·
프로젝트에서 일어난 일
1. 개요졸업 프로젝트를 MSA로 구현하고 있다.요청에 대해서 User-Service에서 인증 인가를 다루면 모든 요청이 들어올 때 마다 User-Service를 거쳐야 하고 이를 거친 요청이 다시 원래 경로로 라우팅하는 작업을 수행하기 복잡하다. 따라서 API Gateway에서 인증 인가를 검증하고자 한다. 2. Spring Cloud Gateway??먼저 모놀리식 아키텍처에서 필터를 사용해 인증 인가를 구현하는 방법을 알아보자2.1 일반 Spring Boot (모놀리식) 아키텍처에서 Filter를 사용한 인증 인가 (With Spring Security)일반적으로 모놀리식 아키텍처에서는 Spring Security 의존성을 추가한다음 OncePerRequestFilter를 상속해 특정 커스텀 필터를 ..
DataGrip에서 SSH 터널링으로 MySQL Container 접속하기
·
프로젝트에서 일어난 일
1. 개요1. Termius로 SSH 접속2. docker exec -it [컨테이너 명] bash3. mysql -u [사용자명] -p4. 비밀번호 입력 지금까지는 위와 같이 MySQL 컨테이너에 접속해서 MySQL Shell로 직접 다루려고 했다.너무 불편하다... 라즈베리파이 내부 MySQL 도커 컨테이너에 손쉽게 접속하기위해서DataGrip에서 SSH 터널링으로 MySQL 도커 컨테이너에 접속하고자 한다. 2. 방법SSH/SSL 클릭SSH 터널링을 위해서 Use SSH tunnel을 클릭하고설정을 위해 ...을 클릭한다. Host에는 Cloud서버 (나는 라즈베리파이 IP 주소)Username은 사용자명Password or Key Pair 방식 중 자신이 사용하는 걸 채택 후 Test Connne..
라즈베리파이 + MSA(Spring Cloud) + CI/CD 배포
·
프로젝트에서 일어난 일
1. 개요졸업 프로젝트로 교내 키오스크를 개발하고 있다.이때 MSA를 CI/CD 자동화 배포에 성공한 경험을 기록하고자 이 글을 작성한다. 2. 시스템 아키텍처빠른 이해를 위해 시스템 아키텍처를 보자! 시스템 아키텍처는 다음과 같고내가 작성한 CI/CD 흐름은 다음과 같다.1. MicroService별로 변경 감지2. 변경 감지된 MicroService-CI.yml job 실행3. docker compose image pull4. docker compose up -d아쉬운 점은 마이크로서비스 별로 yml을 작성했다는 점과 젠킨스를 사용안해본 것.자동화 배포에 성공은 했지만 유지보수는 조금 힘들 거 같다는 생각이 들었다. 3. 실제 CI.yml 코드 예시name: User Service CIon: pus..
다수 데이터 Insert 시 성능 개선하기(37.06% 개선)
·
프로젝트에서 일어난 일
상황 설명 나의 개발 파트는 그림과 같이 Resume가 생성될 때 분아별 + 공통 분야 ResumeQuestion을 생성하는 것이다.ResumeQuestion은 관리자가 미리 설정해둔 Question에서 정보를 가져와 생성한다. 위 그림 처럼 지원서를 생성할 경우필드가 COMMON인 Question을 가져온 뒤 Question을 통해 ResumeQuestion을 생성합니다.필드가 SPECIFIC(ex BACKEND, FRONTEND etc...)인 Question을 가져온 뒤 Question을 통해 ResumeQuestion을 생성합니다.생성한 필드별 ResumeQuestion을 하나의 리스트로 합쳐서 BulkInsert 합니다. (성능 개선을 위함)생성 후 지원서 질문 정보 반환을 위해 DTO 변환의 ..
같은 객체에 대해서 OneToMany를 두번 사용할 경우
·
프로젝트에서 일어난 일
1. Tave 지원 페이지, 지원 관리자 페이지Tave 홈페이지 프로젝트를 완료하고 Tave 지원 페이지, 지원 관리자 페이지를 만들고 있다.내 개발 파트인 지원서 질문 파트의 간단한 요구사항이다.지원 페이지에서 일반 회원들은 지원서를 작성한다.특정 분야, 공통 분야 질문이 따로 존재한다.질문에 답변할 수 있어야한다.면접 가능 시간대를 물어본다.임시저장이 가능해야한다.과거 지원한 이력서들을 볼 수 있다.지원 관리자 페이지가 필요하다회원에게 보여줄 질문은 관리자페이지에서 생성, 조회, 수정, 삭제가 가능하다.질문의 개수는 유동적으로 변할 수 있다. 2. 설계위 요구사항들을 생각했을 때 다음과 같은 ERD를 생각했다. (컬럼 생략)Resume - ResumeQuestion - Question 지원서는 여러 ..
졸프: 라즈베리파이와 MSA를 곁들인
·
프로젝트에서 일어난 일
1. 개요나는 4학년 1학기 졸업프로젝트를 진행 중이다.졸업 프로젝트 주제는 학교 안내 홈페이지를 만드는 것!사실 키오스크를 만드려다가 학교에서 부품 지원을 안해줘서 키오스크는 포기했다... 졸업 프로젝트에서 나는 다음과 같은 도전?을 해보려고 한다. 1. MSA 적용2. 학과서버가 아닌 라즈베리파이 NAS서버 사용 2. Why? MSA를 적용하는 이유 1올해 3월 초 개강 첫주차에 학교 홈페이지가 마비된 적이 있다.그런데 문제는 사이버캠퍼스까지 같이 마비가 되어버린 것이다. 즉, 학교와 관련된 모든 사이트가 접속이 안된 적이 있다.위 사진처럼 3시에 온라인 수업이 있고 해당 온라인 접속 링크가 사이버캠퍼스에 있다.결국 사캠이 안들어가져서 온라인 수업을 못듣는 상황이 발생...학교측에 문의를 해봐도 서버..
Jwt토큰 인가 검증에서 일어난 간단한 사건!
·
프로젝트에서 일어난 일
1. 사건프론트 분에게 온 카카오톡... 무섭다....친구 요청 시 403 에러와 함께 다음과 같은 메세지를 받는다고 한다. 2. 나의 대처 - 1HttpStatus에서 403 코드는 서버가 해당 요청을 받았으나, 권한이 없어서 요청을 거부할 때 사용한다.나는 이를 CustomAccessDeniedHandler에서 인가 에러 처리를 하고 있었기 때문에 우선 해당 코드를 살펴봤다.@Slf4j@Componentpublic class CustomAccessDeniedHandler implements AccessDeniedHandler { private final static String LOG_FORMAT = "ExceptionClass: {}, Message: {}"; private final s..
N+1 싹둑(Slice)해버리기
·
프로젝트에서 일어난 일
1. 상황가치택시 프로젝트 중 나의 친구 목록을 반환하는 API 구현중이었다.초기에는 기본 FetchJoin을 JPQL에 때려서 List 를 가져온 후 map으로 FriendsResponseDto로 변환했다.초창기 코드에 따른 코드 리뷰 내용! 2. 코드 리뷰 내용1. stream().map() 으로 많은 데이터를 처리할 경우 많은 메모리 사용량!2. @BatchSize 사용을 해보는 게 어떨 지!3. Repository 조회 시점에 바로 Dto에 매핑시켜서 가져오는 방법은 어떨 지! 3. 나의 생각1. stream().map의 경우 데이터가 너무 많으면 메모리 사용량이 많아 성능에 좋지 않다. 하지만 친구 목록이 100명이 넘지 않는 이상 메모리 사용량에 따른 성능 이슈가 있을까?? 그래도 고려해보면 ..