전체보기
-
최근 일주일 동안 주변 사람들과 '사이드 프로젝트의 매몰 비용'에 대한 이야기가 오고 갔다. 이번 년도에 여러개의 토이 프로젝트를 진행하면서 다양한 이유로 놓지 못하고 있었던 프로젝트들이 많았고, 이런저런 생각들을 공유해야겠다. #1 포착 - 1월동안 9월까지 진행한 프로젝트 (015B - 1월부터 6월까지) 1. 현실적으로 만들 수 있는 규모인가 ? 2. 모두가 일정 시간 이상의 시간을 투자할 수 있는가 ? 우리 동아리는 2개월 만에 빠르게 런칭하는 프로젝트였다. 그렇지만 초기 기획의 Feature가 너무 비대했던 탓에, 제시간에 런칭하지 못해서 장기 프로젝트가 되었다. 이후에 '동아리'라는 강제 요소가 없이 직장인 분들과 함께 프로젝트를 진행하다 보니, 한계점이 명확해졌다. 이 후에 투자할 수 있는 ..
[프로젝트] 사이드 프로젝트에서 발생한 매몰비용최근 일주일 동안 주변 사람들과 '사이드 프로젝트의 매몰 비용'에 대한 이야기가 오고 갔다. 이번 년도에 여러개의 토이 프로젝트를 진행하면서 다양한 이유로 놓지 못하고 있었던 프로젝트들이 많았고, 이런저런 생각들을 공유해야겠다. #1 포착 - 1월동안 9월까지 진행한 프로젝트 (015B - 1월부터 6월까지) 1. 현실적으로 만들 수 있는 규모인가 ? 2. 모두가 일정 시간 이상의 시간을 투자할 수 있는가 ? 우리 동아리는 2개월 만에 빠르게 런칭하는 프로젝트였다. 그렇지만 초기 기획의 Feature가 너무 비대했던 탓에, 제시간에 런칭하지 못해서 장기 프로젝트가 되었다. 이후에 '동아리'라는 강제 요소가 없이 직장인 분들과 함께 프로젝트를 진행하다 보니, 한계점이 명확해졌다. 이 후에 투자할 수 있는 ..
2023.09.12 -
요즘 아주 재미있게 즐겨보고 있는 이중석님의 유튜브입니다. 올라온 당일날 봤었는데, 이번에 리팩토링을 진행하면서 딱 좋은 케이스가 생겨서 적용해봤습니다. 기존 코드는 어땠는가 간소화해서 가져왔지만, 리팩토링 전의 코드기도 하고 Login 로직은 쬐끔 복잡합니다. OAuth provider 확인해서 적절한 bean 꺼내오기 (외부 통신) OAuth provider에 요청 보내서, 유효한 로그인인가에 대한 검증 진행하기 회원가입 한 적이 없다면 DB에 유저 생성하기 (외부 통신) FCM 토큰 검증하고 저장하기 @Override public Long login(String provider, LoginRequestDto requestDto) { OAuthProviderEnum providerEnum = OAut..
[Java] Default 접근제어자로 견고한 테스트 만들기요즘 아주 재미있게 즐겨보고 있는 이중석님의 유튜브입니다. 올라온 당일날 봤었는데, 이번에 리팩토링을 진행하면서 딱 좋은 케이스가 생겨서 적용해봤습니다. 기존 코드는 어땠는가 간소화해서 가져왔지만, 리팩토링 전의 코드기도 하고 Login 로직은 쬐끔 복잡합니다. OAuth provider 확인해서 적절한 bean 꺼내오기 (외부 통신) OAuth provider에 요청 보내서, 유효한 로그인인가에 대한 검증 진행하기 회원가입 한 적이 없다면 DB에 유저 생성하기 (외부 통신) FCM 토큰 검증하고 저장하기 @Override public Long login(String provider, LoginRequestDto requestDto) { OAuthProviderEnum providerEnum = OAut..
2023.08.24 -
토이프로젝트는 항상 신규 서비스를 만들다 보니, 메인페이지의 피드에 대한 구현 요구사항이 항상 있는 것 같습니다. 덕분에 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