전체 글 337

SOPT 34기 서버 YB 최종 합격 후기 [면접전형 +꿀팁 + 예상질문 포함]

https://softmoca.tistory.com/326 SOPT 34기 서버 YB 최종 합격 후기 [서류전형 +꿀팁 + 자기소개서 포함] SOPT(Shout Our Passion Together) 0. 지원계기 나는 비전공자로서 2년전 처음 프로그래밍을 접하게 되어 현재는 백엔드 개발자를 희망하고 있다. 처음 UMC를 시작으로 교내외 프로젝트와 캡스톤 설계를 하 softmoca.tistory.com (이어지는 이전 포스티인 서류전형 후기 및 준비팁 입니다.) 워낙 경쟁률이 높은 동아리라서 일부러 기대를 하지 않기 위해 제출이후 "뭐 떨어지면 코딩 테스트에 쓸 시간 많고 좋지.."라고 생각하며 결과를 기다렸다. 하지만 결과를 보니 서류가 합격 해서 면접 대상자로 선정이 되었다 !!! 서버 파트의 면접 ..

SOPT 34기 서버 YB 최종 합격 후기 [서류전형 +꿀팁 + 자기소개서 포함]

SOPT(Shout Our Passion Together) 0. 지원계기 나는 비전공자로서 2년전 처음 프로그래밍을 접하게 되어 현재는 백엔드 개발자를 희망하고 있다. 처음 UMC를 시작으로 교내외 프로젝트와 캡스톤 설계를 하며 현재는 창업동아리 immersion팀에서 백엔드 개발을 하고 있다. 그 과정에서 늘 뭔가 찜찜(?)함이 남아있었다. 대부분의 팀원들은 나와같은 비전공자, 초기 입문자 혹은 큰 의지와 동기가 없는 팀원이었고 자연스레 프로젝트가 허술(?)하게 진행되었다고 생각한다. 그런 이유로 팀원 중 능력이 있는 한명이 대부분을 구현하는 방향으로간 프로젝트가 대부분이어서 협업을 통해 프로젝트를 했다기 보단 하나 하나의 기술을 익히는것에만 급급해서 찜찜함이 느껴졌던것 같다. 그런 과정에서 인스타그램..

댓글 기능 구현

0. 댓글 엔티티 생성 및 존재 하는 게시물인지 확인하는 미들웨어 @Entity() export class CommentsModel extends BaseModel { @ManyToOne(() => UsersModel, (user) => user.postComments) author: UsersModel; @ManyToOne(() => PostModel, (post) => post.comments) post: PostModel; @Column() @IsString() comment: string; @Column({ default: 0, }) @IsNumber() likeCount: number; } 댓글 엔티티 생성 post-exists.middleware.ts @Injectable() export cl..

채팅 기능 구현하기

npm i @nestjs/common @nestjs/core @nestjs/jwt @nestjs/platform-express @nestjs/platform-socket.io @nestjs/typeorm @nestjs/websockets Socket.io는 패키지간 의존성이 잘 맞지 않는 경우가 많아 주요한 라이브러리들을 다시 설치해서 의존성을 맞혀준다. 1. 채팅방과 메세지 엔티티 생성 chats.entity.ts @Entity() export class ChatsModel extends BaseModel { @ManyToMany(() => UsersModel, (user) => user.chats) users: UsersModel[]; @OneToMany(() => MessagesModel, (mes..

인터셉터과 트랜잭션을 활용한 게시물 작성 [파일 업로드]

이미지 업로드 방식에는 크게 두가지 방법이 있다. 첫번쨰 방식 - 제목,내용, 이미지를 모두 선택한 다음 모든 정보를 한번에 서버로 업로드 - 파일은 업로드가 오래걸려 사용자는 프로그램이 느리다는 인상을 받을 수 있다. 두번째 방식 - 한번에 텍스트와 파일을 업로드하는게 아니라 이미지를 선택할 때마다 이미즈는 먼저 업로드를 한다. - 업로드된 이미지들은 '임시폴더'에 이미지 경로만 잠시 저장해 둔다.(/public/temp) - 이후 포스트를 업로드 할 때 이미지의 경로만 추가한다.(/public/temp 에서 public/posts로 이동) -> AWS S3의 Presigned URL 을 사용하는 방식의 일부이다. 각각의 방식에는 아래와 같은 장단점이 있다. 결론적으로 사용자의 체감 시간에 더욱 중점을..

페이지네이션 일반화 하기

이후 댓글과 채팅 등등에서도 페이지 네이션을 사용하기 위해 객체지향 적으로 코드를 고도화 시켜 일반화 해보고자 한다. basePaginationdto.ts export class BasePaginationDto { @IsNumber() @IsOptional() page?: number; @IsNumber() @IsOptional() where__id__less_than?: number; // 이전 마지막 데이터의 ID // 이 프로퍼티에 입력된 ID 보다 높은 ID 부터 값을 가져오기 @IsNumber() @IsOptional() where__id__more_than?: number; // 정렬 // createdAt -> 생성된 시간의 내림차/오름차 순으로 정렬 // Ascending / Descend..

게시물 페이지 네이션

https://softmoca.tistory.com/315 페이지네이션[Pagination] 페이지네이션[Pagination] 이란 ? 많은 데이터를 부분적으로 나눠서 불러오는 기술. 특징 - 쿼리에 해당되는 모든 데이터를 한번에 다 불러오지 않고 부분적으로 나눠서 불러온다 예) 한번에 20개씩 softmoca.tistory.com 페이지 네이션 전반적인 내용은 위 게시물을 참조 ! 1) 커서 기반 페이지 네이션 게시물 20개의 오름차순 정렬된 게시물 가져오기 오름 차순 페이지네이션을 위한 기본 dto생성 export class PaginatePostDto { // 이전 마지막 데이터의 ID // 이 프로퍼티에 입력된 ID 보다 높은 ID 부터 값을 가져오기 @IsNumber() @IsOptional()..

Redis와 분산 락(Distributed Lock)

레디스(Remote Dictionary Server) 메모리에 저장하는 key-value기반의 NoSQL DBMS - 캐싱 뿐 아니라 임시작업큐, 실시간 채팅,메시지 브로커 - 메모리에 저장되어 빠른 속도로 접근가능, get/post 경우 10만 TPS이상 가능 - 싱글 스레드로 한번에 하나의 명령만 처리, race condition(두개 이상의 프로세스가 동시에 하나의 리소스에 대해 접근할 때 서로 경쟁)이 거의 발생하지 않는다 - 다양한 자료구조 제공, 개발의 편의성 증가 - 메모리에 저장된 데이터를 디스크에 영속화Persistence( RDB,AOF 두가지 옵션 존재) → 서버에 치명적인 문제가 발생하더라도 복구 가능 RDB: 특정한 간격으로 현재 레디스의 메모리에 존재하는 데이터의 스냅샷을 남기는..

캐시란 ?

캐시의 사용 이유 캐시 : 데이터나 값을 미리 복사해 놓는 임시 장소 보통 기본적으로 3Tier 아키텍처 구조를 많이 사용한다. 작은 서비스라면 문제가 없지만 사용자가 많아지고 서비스가 커진다면 클라이언트가 많아지고 요청이 많아저서 DB에 대한 부하도 증가 하게 된다. 그러한 DB의 부하를 줄이기 위해 캐시를 도입한다. 약 80%의 결과가 20%의 원인으로 부터 온다는 법칙 이런 법칙을 캐시에도 적용을 시켜 이해해 보면 직관적으로 빠른 이해를 할 수 있다. 캐시에 자주 사용되는 약 20%의 데이터를 미리 캐싱해 둔다면 효과적인 성능 향상을 기대할 수 있다. 공간적 지역성과 시간적 지역성 공간적 지역성 :참조된 주소와 인접한 주소의 내용이 다시 참조되는 특성 시간적 지역성 : 사용 되었던 데이터가 빠른 시..

페이지네이션[Pagination]

페이지네이션[Pagination] 이란 ?많은 데이터를 부분적으로 나눠서 불러오는 기술.  특징- 쿼리에 해당되는 모든 데이터를 한번에 다 불러오지 않고 부분적으로 나눠서 불러온다 예) 한번에 20개씩- 쿠팡 같은 앱의 경우 수억개의 상품이 데이터베이스에 저장되어 있는데 사용자가 상품 검색화면을 들어갈 때 마다 모든 상품을 서버에서 클라이언트로 전송할 필요가 없다. (데이터 전송시 많은 양의 금액이 발생+ 메모리 터짐+ 시간이 오래걸림) 페이지 기반 페이지 네이션(간단)- 페이지 기준으로 데이터를 잘라서 요청- 요청을 보낼 때 원하는 데이터 갯수와 몇번째 페이지를 가져올지 명시- 페이지 숫자를 누르면 다음 페이지로 넘어가는 형태의 UI에서 사용- 페이지네이션 도중 데이터베이스에서 데이터가 추가되거나 삭제..