[Jenkins] GCP 에서 Jenkins 설치하기
2022. 11. 22. 19:00
CICD
개요 Jenkins 를 이용해 CI/CD 구축하기 위해 GCP(Google Cloud Platform) 인스턴스에 jenkins 를 설치했습니다. 몇 가지 원인 때문에 jenkins 구동이 제대로 되지 않아 이를 해결하게 된 과정을 정리해보려고 합니다. Jenkins 구동 실패 jenkins 를 설치하고 systemctl start jenkins 명령을 실행해 jenkins 를 구동 후 systemctl status jenkins 명령을 실행해 jenkins 현재 상태를 확인해본 결과입니다. 원인에 대한 로그가 정확하게 나와 있지 않아 해결하기 쉽지는 않았다. jenkins 구동이 실패하는 원인을 찾아보니, 이미 사용하고 있는 포트가 있어서 포트가 겹치거나 설치된 자바 버전이 맞지 않는 것 등이었습니다...
[프로그래머스 - SQL] 상품 별 오프라인 매출 구하기
2022. 11. 22. 12:29
알고리즘/프로그래머스
JOIN 사용하기 다음은 어느 의류 쇼핑몰에서 판매중인 상품들의 상품 정보를 담은 PRODUCT 테이블과 오프라인 상품 판매 정보를 담은 OFFLINE_SALE 테이블 입니다. PRODUCT 테이블은 아래와 같은 구조로 PRODUCT_ID, PRODUCT_CODE, PRICE는 각각 상품 ID, 상품코드, 판매가를 나타냅니다. Table 1 Column name Type Nullable PRODUCT_ID INTEGER FALSE PRODUCT_CODE VARCHAR(8) FALSE PRICE INTEGER FALSE 상품 별로 중복되지 않는 8자리 상품코드 값을 가지며, 앞 2자리는 카테고리 코드를 의미합니다. OFFLINE_SALE 테이블은 아래와 같은 구조로 되어있으며 OFFLINE_SALE_ID,..
[NestJS] 커스텀 데코레이터 만들기
2022. 11. 21. 22:50
라이브러리 & 프레임워크/NestJS
데코레이터란? 데코레이터는 대다수의 프로그래밍 언어에 사용되는 잘 알려진 개념이지만 JavaScript 세계에서는 도입된지 얼마되지 않은 개념이라고 합니다. 데코레이터에 대해 공식 문서에서는 이렇게 정의하고 있습니다. An ES2016 decorator is an expression which returns a function and can take a target, name and property descriptor as arguments. You apply it by prefixing the decorator with an @ character and placing this at the very top of what you are trying to decorate. Decorators can be d..
[OOP] 다형성
2022. 11. 19. 13:37
프로그래밍 언어/Java
다형성이란? 다형성이란 하나의 타입에 여러 객체를 대입할 수 있는 성질을 말합니다. 다형성의 장점 다형성을 활용하면 기능을 확장하거나, 객체를 변경해야 할 때 타입 변경 없이 객체 주입만으로 수정이 일어나게 할 수 있습니다. 또한 상속을 사용한다면 중복되는 코드까지 제거할 수 있으므로 더 객체 지향 설계에 가까워질 수 있습니다. 다형성을 왜 사용하는가? Polymorphism allows us to perform a single action in different ways. (ref. https://www.w3schools.com/java/java_polymorphism.asp) 다형성은 하나의 행동을 여러 방식으로 수행할 수 있게 해줍니다. 다형성을 구현하는 방법 다형성을 구현하는 방법에는 대표적으로 ..
CORS
2022. 11. 18. 17:56
웹
CORS 란? CORS 는 Cross Origin Resource Sharing의 약자입니다. Cross : 교차, Origin : 출처, Resource : 자원, Sharing : 공유 말 그대로 서로 다른 출처끼리 자원을 공유하겠다는 뜻입니다. (출처: MDN 공식 문서) 좌측의 웹 페이지는 domain-a.com 에 접속하면 볼 수 있는 웹 페이지입니다. domain-a.com 에 접속하면 웹 페이지를 렌더링하기 위해서 총 5개의 API 요청이 발생하고 있습니다. 이 중 셋은 Same Origin 이고 둘은 Cross Origin 입니다. 상단의 파란색 네모 박스 안에 있는 API 는 Same Origin 입니다. domain-a.com 에서 웹 서버 domain-a.com 으로 요청을 보냈기 때..
[리팩토링] 폴더 구조의 변경
2022. 11. 15. 17:30
포트폴리오/JJINCAFE IN SEOUL
들어가며 처음 개인 프로젝트를 진행했을 당시 Express 프레임워크는 자유도가 너무 높아 디렉토리 구조에 대한 엄격한 룰이 존재하지 않아 어떻게 구조를 정해야 할 지 정말 막막했습니다. 당시 프로젝트 디렉토리 구조는 같은 이름을 가지는 파일들(*.router.js, *.controller.js) 끼리 하나의 디렉토리 안에 저장하는 형태였습니다. 예시) 라우터들은 routers 디렉토리 하위에 저장, 컨트롤러는 controllers 디렉토리 하위에 저장 한편, 개인 프로젝트 이후 회사 실무 프로젝트에서 NestJS 프레임워크를 사용하며 Nest 의 디렉토리 구조는 유지 보수 및 확장성 측면에서 괜찮은 구조라는 생각이 들었습니다. 참고) NestJS 는 비슷한 기능을 하는 컨트롤러, 서비스 등을 묶어 각 ..
[리팩토링] 회원가입 API 트랜잭션 처리 및 관심사 분리
2022. 11. 15. 17:22
포트폴리오/JJINCAFE IN SEOUL
들어가며 5월에 종료했던 개인 프로젝트 코드를 다시 열어 보았는데 내가 왜 이렇게 코드를 작성했었지? 라는 생각이 제일 먼저 들었습니다. 대표적으로 기존에 작성했던 회원가입 API 코드를 다시 보니 다음의 두 가지 문제점을 발견했습니다. 회원 정보 저장 쿼리에 대해 트랜잭션 처리가 되어 있지 않았습니다. 이는 회원가입이 실패하더라도 회원 정보가 저장되는 사이드 이펙트를 발생시킬 수 있습니다. 컨트롤러에 요청, 응답을 처리하는 로직과 데이터베이스에 데이터를 저장하는 로직이 혼재되어 있어 가독성과 유지 보수성이 떨어집니다. 문제점을 발견했으니 가만히 있을 수 없어 코드 리팩토링을 진행했고 리팩토링 과정을 기록으로 남기고자 합니다. 기존에 작성했던 회원가입 API 코드 class AuthController {..
[Docker 적용] MySQL 서비스 컨테이너에 .sql 파일 Import 후 데이터베이스에 적용하기
2022. 11. 15. 16:49
포트폴리오/JJINCAFE IN SEOUL
들어가며 이후의 나에게 혹은 같은 상황을 겪는 다른 사람에게 도움이 되고자 MySQL 서비스 컨테이너에 DB 데이터 백업 파일을 Import 후 데이터베이스에 적용한 과정을 기록으로 남깁니다. Import 하려는 파일 정보 및 위치 현재 배포 서버의 루트 디렉토리 내 3_backend_ron_cafe_curation_db_data 디렉토리에 백업해 둔 DB 데이터가 기록된 .sql 파일이 있습니다. pwd 명령 실행 시 현재 디렉토리의 위치를 보여줍니다. ls 명령 실행 시 현재 디렉토리 내부에 존재하는 모든 파일 목록을 보여줍니다. 호스트에서 MySQL 서비스 컨테이너로 파일 Import 3_backend_ron_cafe_curation_db_data 디렉토리의 하위 파일들을 MySQL 서비스 컨테이너..