전체 글 174

[NestJS] 쿼리 헤치우기(1. 인덱스 넣기 & 쓸데없는 쿼리 줄이기)

부스트캠프에서 프로젝트를 진행하면서, 전체 테스트를 실행할 때 항상 13~16초의 시간이 걸렸다. 테스트가 약 260개정도였을 때 이 정도가 나온다고 했을 때, 초당 20개의 테스트가 돌아간다고 생각했다. 하지만 나는 더, 더 빨라지길 원했다... 그래서 모든 API의 쿼리 로그를 분석해보기 시작했다. 이렇게 모든 로깅을 true로 설정하고, 로그를 분석하면서 조금씩 메모를 진행했다. 쓰다보니, 필요한 부분과, 이게 꼭 있어야 할까 싶은 부분들이 있었다. 이에 대한 간단한 정리들과, 내가 처리한 방법을 공유해보려고 한다. SAVE repository.save라는 로직을 정말 흔하게 사용했다. 이유는? 겁나게 편했다. 진짜 다른 뭔가를 생각할 필요가 없었다. 하지만 편하다는건? 라이브러리처럼 그 속에서 겁..

JS 공부/NestJS 2023.12.05

[Infra] git clone의 문제점, 그리고 어떻게 하는 것이 좋을까?

이전에 git clone을 통해 프로젝트를 받는 방식을 알아보았다. 이 방식의 문제가 무엇일까? 직접 npm install을 해주어야 한다. nestjs : npm run start, java : java -jar의 방식으로 프로젝트를 실행시켜야 한다. 하지만 실제 실행시에는, nestjs : js로 컴파일 후 dist를 실행, java : class 컴파일 후 실행을 한다. 이런 문제를 해결하기 위한 방법은 무엇일까? nestjs : dist디렉토리를 옮겨서 실행시키기 spring : build 디렉토리를 옮겨서 실행시키기 하지만 이런 방식은, 실제 프로젝트에서 일부 부분들을 매 순간마다 만들어서 ec2서버로 올린 후, 이를 실행시켜줘야 한다. 근데, 이건... 겁나 귀찮다 너무 귀찮다...이 짓을 맨..

인프라 공부 2023.12.01

[Infra] AWS EC2로 배포를 해보자!!(2. 서버에서 깃으로 프로젝트 받아서 실행시키기)

이제부터가 시작이다. 일단, git과 필요한 것들을 설치해야 한다. sudo apt update // 기본적으로 apt를 업데이트 한다. sudo apt install git // git 설치 sudo apt install openjdk-11-jdk // jdk설치 sudo apt install npm // npm && nodejs 설치 이렇게 nodejs, jdk를 모두 설치할 것이다. 왜? 테스트용으로 nodejs와 spring을 실행시킬꺼거든! 근데 git clone떠서! 이렇게 버전을 확인했다. 이제 git을 사용하기 위한 준비를 마저 해보자. git은 추가적으로 할 일이 있다. ssh키를 만든 다음, 해당 키를 github에 등록시켜주어야 한다. cd ~/.ssh // ssh키를 담을 디렉토리로..

인프라 공부 2023.11.10

[Infra] AWS EC2로 배포를 해보자!!(1. 서버 열고 드가기)

기존에 ec2서버를 이용한 백엔드 배포를 몇 번 해보았지만, 이번엔 문서화를 해보면서 해봐야겠다는 생각이 들었다. 일단 나는 이미 인스턴스가 있다. 그래도 새롭게 만드는 과정부터 보여줘야 할 것 같다는 생각이 든다. 그러므로 인스턴스 시작을 해보겠다. 나는 ubuntu 22.0.4를 이용한 배포를 할 계획이다. 이 때 64비트의 아키텍쳐를 사용하는 것을 추천한다. 아래에 인스턴스 유형은 t2.micro를 이용할 꺼시다. 왜냐고? 이후에 아래에서 키 페어를 생성해주어야 한다. 이렇게 해서 키 페어를 생성한다. 그러면 이렇게 키 페어를 받게 되는데, 이는 후에 사용해야하니 가지고 있도록 한다. 아래의 네트워크 설정이 있다. 이 부분은 방화벽을 설정하고, 이에 따른 보안 그룹을 설정할 수 있다. 하지만, 후에..

인프라 공부 2023.11.10

[NestJS] Spring을 공부하다 왔을 때 처음 낯설던 것(DTO)

SpringBoot에서 @RequestBody를 통해 dto 객체를 받을 수 있었다. 똑같은 로직을 생각하고, RegisterRequest객체를 js에서 아래와 같이 만들었다. const EMAIL_REGEX = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; export class RegisterRequest{ username:string; nickname:string; email:string; password:string; passwordCheck:string; constructor(username:string, nickname:string, email:string, password:string, passwordCheck:string) { this.usern..

JS 공부/NestJS 2023.11.03

[부스트캠프] 7, 8주차 회고. 같이 쓰는데에는 이유가 있다!

7, 8주차 과제를 통해 실제 웹에서 우리가 사용하는 기술의 원리를 이해하고, 이를 구현해볼 수 있는 과제를 받았다. 하지만, 뭔가...뭔가였다...(몬가..몬가임..) 그래서 나만의 새로운 과제를 하나 두고 과제를 해결해볼까 라는 생각이 들었다. 그것이 무엇일까? 바로 그룹 프로젝트 준비였다. 지금 바로 그룹 프로젝트의 코드들을 만든다는 것이 아니라, 무슨 상황에서건 필요할 수 있는 기술들을 하나씩 공부했다. nest.js의 공식 문서를 읽으면서 내가 공부한 이론과 원리들이 사용되는 방식에 대해서 추론하고, 이를 구현해보는 식으로 학습했다. 이런 방식으로 2주 정도를 학습을 했다. 이를 통해 느낀 부분들을 몇 가지 여기서 정리해봐야겠다. SpringBoot, NestJS는 우리가 생각하는 것 보다 더 ..

[부스트캠프] 6주차. 공부도 했지만 딴짓도 했지요!

6주차에는 5주차 과제에서 조금 더 수정하는 부분들이 많긴 했다. 자세하게 어떤 부분을 했다고 이야기할 순 없기에, 조금 추상화 시켜야겠다. (백엔드 특 : 추상화, 객체지향 개좋아함) 조금 더 객체지향적이게? 부스트캠프의 과제가 정확히 무엇인지 이야기할 순 없다. 하지만 비슷한 예시를 들어보자. class Sentence { nouns:string[]; verbs:string[]; constructor(inputString:string) { inputString.split(" ").forEach(words => { //띄어쓰기로 나눈 단어들을 의미에 따라 인스턴스 배열에 넣는다. }) } } 이런 코드가 있다고 생각해보자. 여기에서 Sentence라는 객체를 만들어두고, 이 부분에서 각 배열을 가져온 ..

[부스트캠프] 5주차. 페어 프로그래밍과 추상화

5주차에 페어 프로그래밍이라는 것을 했다. 자바 스프링으로 프로젝트할 때에도 페어 프로그래밍과 유사품을 경험해보긴 했지만, 진짜 페어 프로그래밍이 무엇인지 생각해보진 못했다. 실제론 내비게이터(뒤에서 보면서 첨언하는 방식)와 드라이버(직접 코드를 작성하는 방식)를 두고 개발을 한다고 한다. 어찌보면 기존에 했던 방식과 비슷했다. 디스코드로 화면을 띄우고, 이를 보면서 같이 보면서 한 사람은 로직을 짜고, 이에 대해 실시간으로 같이 보면서 소통하는 방식이었다. 25분마다 번갈아 가며 드라이버를 바꾸는 경우도 있었지만, 나와 페어는 그렇게까지 하지는 않았다. 대신에 깃을 조금 더 공부해서, 이를 더 수월하게 하는 방법을 생각했다. 각자의 브랜치를 만들고, 합치는 브랜치에서 이를 모았다. 이를 통해 upstr..

[ChatUniv] KOMORAN을 이용한 자연어 처리

질문에 대한 명사들의 통계를 내기 위한, 자연어 처리 라이브러리들을 보고있었다. 이걸 통계로 적용시키고, 각 문자열에서 단어들만을 파싱하기 위한 외부 라이브러리를 디깅하던 중, 두 가지 라이브러리가 눈에 들어왔다. mecab과 KOMORAN이라는 친구였다. 물론 요즘 부스트캠프를 통해 js를 하루종일 만지다 보니 mecab을 적용시켜보는 것은 아주 수월했다 (솔직히 오픈소스에 대한 접근, 활용성은 자바보단 js가 더 편한 느낌도 든다.) 그래서, 둘 다 시도를 해보고, 프로젝트 내부에 코드를 적용시킬 수 있는 KOMORAN을 최종적으로 선택했다. 그렇다면, KOMORAN을 어떻게 쓸까? 2가지 순서가 존재한다. build.gradle에 해당 리포지토리 등록, 의존성 주입 코드 적용 해당 순서대로 정리를 ..

[ChatUniv] No Offset?이게 왜 좋을까?

페이징을 최적화 시키기 위한 방법이 무엇일까를 이야기하게 되었다. 근데, 이전에 페이징을 왜 최적화 시켜야할까? 라는 생각이 들었다. 우리는 JPA에서 offset, limit를 이용해 페이징을 만들 수 있고, 이를 통해 우리가 데이터베이스에서 모든 데이터를 리스트로 받아오고 연산할 필요가 없는데? 이에 대한 내용은, 실제 offset limit을 어떻게 두는지에 따라 달라진다. 우리가 어떤 쿼리를 쓸까? 실제 pageable를 이용하면 어떤 방식의 쿼리가 나올까? 두 개의 다른 프로젝트의 코드지만, 비교를 위해 가져왔다. @Override public Page searchMessage(MessageSearchRequestDto messageSearchRequestDto) { Pageable pageab..