전체 글
가천대학교 소프트웨어학과에 재학중인 천진우입니다. 좋은 글을 주기적으로 작성하기 위해 노력합니다.
-
토이프로젝트는 항상 신규 서비스를 만들다 보니, 메인페이지의 피드에 대한 구현 요구사항이 항상 있는 것 같습니다. 덕분에 1년동안 4개 서비스의 피드를 만들었네요. 아래 게시글은 제가 1년 조금 전에 처음으로 개발했던 피드에 대한 게시글입니다. [DB] QueryDSL을 활용하여 SNS 피드 만들기(1) - 동적 쿼리로 Pagination 피드를 만들어보자. [DB] QueryDSL을 활용하여 SNS 피드 만들기(2) - 더 정확한 페이징 쿼리 만들기 offset based, cursor based 1년이 지난 지금은 조금 더 다양한 관점에서의 분석이 가능할 것 같다는 생각이 들어서, 다음과 같은 내용을 중점으로 분석해보고자 합니다. 기능상 장단점은 무엇인가? 선택의 기준? 성능상 이점 (실행계획) 유명..
[DB] Pagination 실행계획 분석 (Offset Pagination vs Cursor Pagination)토이프로젝트는 항상 신규 서비스를 만들다 보니, 메인페이지의 피드에 대한 구현 요구사항이 항상 있는 것 같습니다. 덕분에 1년동안 4개 서비스의 피드를 만들었네요. 아래 게시글은 제가 1년 조금 전에 처음으로 개발했던 피드에 대한 게시글입니다. [DB] QueryDSL을 활용하여 SNS 피드 만들기(1) - 동적 쿼리로 Pagination 피드를 만들어보자. [DB] QueryDSL을 활용하여 SNS 피드 만들기(2) - 더 정확한 페이징 쿼리 만들기 offset based, cursor based 1년이 지난 지금은 조금 더 다양한 관점에서의 분석이 가능할 것 같다는 생각이 들어서, 다음과 같은 내용을 중점으로 분석해보고자 합니다. 기능상 장단점은 무엇인가? 선택의 기준? 성능상 이점 (실행계획) 유명..
2023.07.21 -
최근 면접에서 질문 받았던 내용에 답변을 못했습니다. "자바 람다 에서 지역변수를 사용하려면 어떻게 해야하나요?" 람다를 사용할 때는 많았지만, 지역변수의 참조나 변경을 고려하면서 작성할만한 경험이 없었던 것 같습니다. 그래서였을까요. 람다에서 일반적으로 지역변수에 대한 참조가 불가능 하다는 것을 처음 알았습니다. 지나간 면접은 잊고, 오늘은 람다가 어떻게 동작하는지, 그렇다면 지역변수를 어떻게 참조하는지에 대해서 알아보겠습니다. 람다란 무엇인가 람다(Lambda)는 매서드 명이 없는 간결한 함수입니다. Java8 에서부터 등장하였으며, 주로 함수형 프로그래밍에서 함수를 인자로 넘길 때 간결하게 표현할 수 있어서 사용됩니다. 람다의 사용법 람다를 통해서 문자열의 내용을 대문자 및 소문자로 변경하는 코드를..
[JAVA] 람다(lambda) 의 작동 방식과 지역변수 사용(capturing lambda)최근 면접에서 질문 받았던 내용에 답변을 못했습니다. "자바 람다 에서 지역변수를 사용하려면 어떻게 해야하나요?" 람다를 사용할 때는 많았지만, 지역변수의 참조나 변경을 고려하면서 작성할만한 경험이 없었던 것 같습니다. 그래서였을까요. 람다에서 일반적으로 지역변수에 대한 참조가 불가능 하다는 것을 처음 알았습니다. 지나간 면접은 잊고, 오늘은 람다가 어떻게 동작하는지, 그렇다면 지역변수를 어떻게 참조하는지에 대해서 알아보겠습니다. 람다란 무엇인가 람다(Lambda)는 매서드 명이 없는 간결한 함수입니다. Java8 에서부터 등장하였으며, 주로 함수형 프로그래밍에서 함수를 인자로 넘길 때 간결하게 표현할 수 있어서 사용됩니다. 람다의 사용법 람다를 통해서 문자열의 내용을 대문자 및 소문자로 변경하는 코드를..
2023.07.03 -
App Store에 심사를 올리게 되면서, "유저가 불쾌할 수 있는 게시글에 대해서 즉각적인 조치가 가능하게 하라" 라는 피드백을 받았습니다. 아무래도 소셜네트워크 서비스이다 보니까, 조금 민감한 부분이라고 생각이 됩니다. [요구사항] 그래서 유저가 게시글 신고 이후에 즉각적인 조치를 하기 위해서 다음과 같은 기능 요구가 생겼습니다. 기능: 유저가 신고처리를 했던 게시글은, 유저에게 보이지 않는다. 성능: 신고 처리 테이블을 스캔하는 비용을 최소화 전체 코드는 접어두었습니다. 더보기 @Override public List findNextPageByCommmand(PostFetchCommand command) { Map resultMap = queryFactory.from(post) .join(post.u..
[DB] 쿼리 개선 일지 - MySQL 커버링 인덱스 (Using Index)App Store에 심사를 올리게 되면서, "유저가 불쾌할 수 있는 게시글에 대해서 즉각적인 조치가 가능하게 하라" 라는 피드백을 받았습니다. 아무래도 소셜네트워크 서비스이다 보니까, 조금 민감한 부분이라고 생각이 됩니다. [요구사항] 그래서 유저가 게시글 신고 이후에 즉각적인 조치를 하기 위해서 다음과 같은 기능 요구가 생겼습니다. 기능: 유저가 신고처리를 했던 게시글은, 유저에게 보이지 않는다. 성능: 신고 처리 테이블을 스캔하는 비용을 최소화 전체 코드는 접어두었습니다. 더보기 @Override public List findNextPageByCommmand(PostFetchCommand command) { Map resultMap = queryFactory.from(post) .join(post.u..
2023.05.28 -
[(링크) 해당 게시글은 네이버 클라우드 플랫폼 공식 블로그에도 소개되었습니다 !] [(링크) 이전편 보러가기 ] 개요 이전 편에서 위 순서도까지의 구현을 진행했습니다. 그렇지만 포스트 작성이 어쩔 수 없이 서버에서 비동기 처리로 진행되면서, 다음 요구 사항을 어떻게든 해결해야 합니다. "게시글 작성 성공 시 해당 게시글로 이동할 수 있는 푸시를 제공하고, 실패 시 재시도를 할 수 있게 제공" 소켓 등의 방식도 생각해봤지만 통신 규격에 RestAPI 외에 신경 쓸 요소가 생긴다는 것과, 유저가 앱을 이탈했을 때는 서비스가 관여할 수 있는 범위에서 벗어나게 됩니다. 그래서 결국 푸시 알람으로 해당 로직을 구현하기로 했고, 물론 네이버 클라우드 플랫폼에서 제공하는 'Simple & Easy Notificat..
[Spring] Naver Cloud Platform으로 스트리밍 서비스 개발하기(2) - 푸시 서비스로 인코딩 결과 전송하기[(링크) 해당 게시글은 네이버 클라우드 플랫폼 공식 블로그에도 소개되었습니다 !] [(링크) 이전편 보러가기 ] 개요 이전 편에서 위 순서도까지의 구현을 진행했습니다. 그렇지만 포스트 작성이 어쩔 수 없이 서버에서 비동기 처리로 진행되면서, 다음 요구 사항을 어떻게든 해결해야 합니다. "게시글 작성 성공 시 해당 게시글로 이동할 수 있는 푸시를 제공하고, 실패 시 재시도를 할 수 있게 제공" 소켓 등의 방식도 생각해봤지만 통신 규격에 RestAPI 외에 신경 쓸 요소가 생긴다는 것과, 유저가 앱을 이탈했을 때는 서비스가 관여할 수 있는 범위에서 벗어나게 됩니다. 그래서 결국 푸시 알람으로 해당 로직을 구현하기로 했고, 물론 네이버 클라우드 플랫폼에서 제공하는 'Simple & Easy Notificat..
2023.03.27 -
작년과 올해 프로젝트를 진행하면서 겪었던 문제들과, 이번 Real MySQL 북스터디를 하면서 습득했던 지식들로 문제를 해결해보았습니다. 시나리오 많은 서비스들이 본인이 보았던 컨텐츠에 반응하거나 저장하기 위해 좋아요, 북마크 등의 기능을 가지고 있습니다. 이런 기능들은 다음과 같은 문제점들을 주의 해야 합니다. 중복 요청 문제 (일명 따닥..) 해당 로직과 관련된 쿼리의 성능 문제 준비 도메인은 다음과 같이 User, Post, Likes 를 준비했습니다. @Entity @AllArgsConstructor @NoArgsConstructor public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "..
[DB] 좋아요 성능 문제와 동시성 문제 해결하기 - 다중 유니크 키, 실행계획, JMeter작년과 올해 프로젝트를 진행하면서 겪었던 문제들과, 이번 Real MySQL 북스터디를 하면서 습득했던 지식들로 문제를 해결해보았습니다. 시나리오 많은 서비스들이 본인이 보았던 컨텐츠에 반응하거나 저장하기 위해 좋아요, 북마크 등의 기능을 가지고 있습니다. 이런 기능들은 다음과 같은 문제점들을 주의 해야 합니다. 중복 요청 문제 (일명 따닥..) 해당 로직과 관련된 쿼리의 성능 문제 준비 도메인은 다음과 같이 User, Post, Likes 를 준비했습니다. @Entity @AllArgsConstructor @NoArgsConstructor public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "..
2023.03.05 -
현재 프로젝트에서 Git branch 전략을 Git flow를 사용하고 있습니다(우아한형제들 - 우린 Git-flow를 사용하고 있어요) 기존에는 시간에 쫒기며 개발하느니라 쉘스크립트로 배포를 했었습니다. 이 프로젝트에서는 다음 세가지 시나리오로 구분하여 CICD 배포 파이프라인을 구성했습니다. feature 브랜치 작업 후 Pull Request -> JAR 빌드 및 테스트 develop 브랜치에 merge(push) -> Jib 빌드 -> 테스트서버 배포 main 브랜치에 merge(push) -> Jib 빌드 -> 메인 서버 배포 일단 Jib 가 무엇일까요? GitHub - GoogleContainerTools/jib: 🏗 Build container images for your Java appli..
[Spring] Jib CI/CD 파이프라인 구축하기 (feat. Spring Rest Docs 를 돌려주세요..)현재 프로젝트에서 Git branch 전략을 Git flow를 사용하고 있습니다(우아한형제들 - 우린 Git-flow를 사용하고 있어요) 기존에는 시간에 쫒기며 개발하느니라 쉘스크립트로 배포를 했었습니다. 이 프로젝트에서는 다음 세가지 시나리오로 구분하여 CICD 배포 파이프라인을 구성했습니다. feature 브랜치 작업 후 Pull Request -> JAR 빌드 및 테스트 develop 브랜치에 merge(push) -> Jib 빌드 -> 테스트서버 배포 main 브랜치에 merge(push) -> Jib 빌드 -> 메인 서버 배포 일단 Jib 가 무엇일까요? GitHub - GoogleContainerTools/jib: 🏗 Build container images for your Java appli..
2023.02.26 -
이번에 프로젝트를 진행하며, orphanremoval = true 로 엔티티 삭제를 구현해볼까? 라는 생각이 들었습니다. 그런데 실제로 적용해보고 쿼리가 나가는 것을 확인해보며 이런저런 문제가 있다는 것을 느끼게 되었습니다. 상황 게시글(Post) 엔티티는 해시태그(Hashtag) 엔티티를 자식으로 가지고 있습니다. (OneToMany) 게시글(Post) : 게시글 정보를 담고 있음 해시태그(Hashtag) : OneToMany, 해시태그 여러개를 담고 있음 요구사항 : 게시글을 지우면, 게시글에 있는 여러개의 해시태그도 모두 삭제해야 합니다. 간소화된 엔티티 코드는 다음과 같습니다. Post.java public class Post { @Id @GeneratedValue(strategy= Generat..
[DB] JPA의 orphanremoval 또는 CascadeType.REMOVE 에서 발생할 수 있는 성능 문제와 버그(?)이번에 프로젝트를 진행하며, orphanremoval = true 로 엔티티 삭제를 구현해볼까? 라는 생각이 들었습니다. 그런데 실제로 적용해보고 쿼리가 나가는 것을 확인해보며 이런저런 문제가 있다는 것을 느끼게 되었습니다. 상황 게시글(Post) 엔티티는 해시태그(Hashtag) 엔티티를 자식으로 가지고 있습니다. (OneToMany) 게시글(Post) : 게시글 정보를 담고 있음 해시태그(Hashtag) : OneToMany, 해시태그 여러개를 담고 있음 요구사항 : 게시글을 지우면, 게시글에 있는 여러개의 해시태그도 모두 삭제해야 합니다. 간소화된 엔티티 코드는 다음과 같습니다. Post.java public class Post { @Id @GeneratedValue(strategy= Generat..
2023.02.19 -
[(링크) 해당 게시글은 네이버 클라우드 플랫폼 공식 블로그에도 소개되었습니다 !] 포착(Phochak) 포착 서비스는 이번 넥스터즈 활동에서 저희가 출시한 서비스입니다 :) 포착은 여행을 가서 촬영한 짧은 영상들을 저장하고 공유하는 아카이빙 및 스트리밍 서비스입니다. 네이버 클라우드 플랫폼의 든든한 지원 감사하게도 Naver Cloud Platform의 지원으로 크레딧을 지원받아 AWS 가 아닌 NCP를 무.료.로 이용하게 되었습니다 ! NCP를 쭉 들여다보니, AWS와 거의 동일한 환경을 제공합니다. 심지어 AWS SDK와 호환되게끔 구성이 되어있습니다. 이 게시글에서 사용할 NCP 클라우드 요소들을 소개하면.. Server(EC2): 서버 Object Strage(S3): 비용 효율적인 정적 파일 ..
[Spring] Naver Cloud Platform으로 스트리밍 서비스 개발하기(1)[(링크) 해당 게시글은 네이버 클라우드 플랫폼 공식 블로그에도 소개되었습니다 !] 포착(Phochak) 포착 서비스는 이번 넥스터즈 활동에서 저희가 출시한 서비스입니다 :) 포착은 여행을 가서 촬영한 짧은 영상들을 저장하고 공유하는 아카이빙 및 스트리밍 서비스입니다. 네이버 클라우드 플랫폼의 든든한 지원 감사하게도 Naver Cloud Platform의 지원으로 크레딧을 지원받아 AWS 가 아닌 NCP를 무.료.로 이용하게 되었습니다 ! NCP를 쭉 들여다보니, AWS와 거의 동일한 환경을 제공합니다. 심지어 AWS SDK와 호환되게끔 구성이 되어있습니다. 이 게시글에서 사용할 NCP 클라우드 요소들을 소개하면.. Server(EC2): 서버 Object Strage(S3): 비용 효율적인 정적 파일 ..
2023.02.06