본문 바로가기

👨‍💻 프로그래밍/📦 Backend 76

특정 거리 범위 내 위도/경도 계산하기 (의외로 어려움) 특정 거리 범위 내 위도/경도 계산하기 (의외로 어려움) 해야 하는 것현재 위치를 기준으로 특정 거리 내의 위도/경도 범위를 계산 Java의 Method Signature로 따지면 아래와 같습니다.public double[] getLatitudeRange(double latitude, int radiusInMeters) {}public double[] getLongitudeRange(double latitude, double longitude, int radiusInMeters) {}우선 위도 / 경도에 대해 알아보자우선, 위도 / 경도는 단순히 지구의 x / y 좌표가 아닙니다. 위도 / 경도는 각도입니다. 지구를 선으로 나누고, 그 선을 기준으로 몇 도 떨어져 있는지를 측정합니다.  위도는 적도에서 몇 도 떨어져 있느냐를 측정합니다.  적도는 지구의 자전축.. 2023. 5. 27.
Spring Security에서 SecurityContext에 내가 원하는 정보 추가하기 Spring Security에서 SecurityContext에 내가 원하는 정보 추가하기 문제 상황일반적으로 Spring Security를 사용하면 현재 요청 유저의 로그인 정보를 SecurityContext에 추가합니다. 그리고 유저 정보가 필요할 때마다 SecurityContext에 접근해서 유저 정보를 가져옵니다.유저 정보는 Authentication이라는 interface를 구현한 객체를 저장해 놓을 수 있습니다.public interface Authentication extends Principal, Serializable { Collection getAuthorities(); Object getCredentials(); Object getDetails(); Object getPrincipal(); boolean isAuthenticated(); vo.. 2023. 5. 23.
🔥 Hot Ranking 알고리즘, Spring Batch로 구현하기 (feat. Strategy 패턴) 🔥 Hot Ranking 알고리즘, Spring Batch로 구현하기 (feat. Strategy 패턴) Hot Ranking 알고리즘이란?인기있는 것 (Hot한 것)에 순위(Ranking)을 매기는 알고리즘 실시간 검색어, 커뮤니티의 인기 게시글, 화제가 되고 있는 뉴스 등 무언가에 특정한 기준으로 순위를 매기고 싶을 때 쓰는 알고리즘을 Hot Ranking 알고리즘이라고 부릅니다. 보통은 공개되어 있지 않고, 다양한 데이터를 바탕으로 계속 개선합니다.책잇아웃(포트폴리오)을 만드는 도중, 커뮤니티 기능을 만들게 됐는데 게시글을 인기순으로 보여 주고 싶어 Hot Ranking 알고리즘을 고안해 봤습니다.나만의 Hot Ranking 알고리즘우선, 커뮤니티 부분의 DB 구조만 잠깐 보여 드리자면 아래같이 되어 있습니다.즉, 게시글을 평가할 때 게시글 자체, 게시글의 좋아요/싫어요, 댓글, 댓글의 좋아요 싫어요 .. 2023. 5. 18.
AntMatcher 문법 알아보기 (Ant Path Pattern) AntMatcher 문법 알아보기 (Ant Path Pattern) Ant Path Pattern이 뭐야?Ant Path Pattern, AntMatcher은 URL 패턴을 묘사하는 간단한 언어입니다. Apache Ant라는 Gradle, Maven 같은 Build Tool에서 유래됐습니다.우리가 웹사이트는 접속할 때의 주소를 보면 https://example.com/test와 같은 형식으로 돼 있습니다. 이때 특정 비즈니스 로직을 /test로 시작하는 모든 곳에 적용하고 싶다면 어떨까요?/test/5/test/ant/test/123등등... 이를 위해서는 /test로 시작하는 URL을 묘사할 방법이 필요합니다. 그 방법 중 1개가 바로 Ant Path Pattern입니다.쓰이는 곳🐜 Spring Web안티 패턴이긴 하지만, Spring Web에서도 AntMatcher.. 2023. 5. 16.
안 하느니 못 한 "확장성을 고려한 설계" 안 하느니 못 한 "확장성을 고려한 설계" 확정성을 고려한 설계, 왜 중요할까?이력서의 단골 멘트기도 하고, 기술과 관련된 대화를 할 때 단골처럼 나오는 말이 확장성을 고려한 설계입니다. 이렇게 자주 나오니 당연히 중요한 역량입니다. 확장성을 고려한 설계가 대체 무엇일까요?사실 굉장히 있어 보이는 말이긴 하지만 간단합니다. 새로운 기능이 추가돼야 할 때 빨리 추가될 수 있게 코드를 짜라는 말입니다. 소프트웨어는 정말 빨리 바뀝니다. 당장 지금 쓰고 있는 많은 기술들이 10년 전에는 없었습니다. 유튜브나 넷플릭스로 동영상을 스트리밍 하는 건 상상도 못 했고, 세세한 기술 스택으로만 봐도 당장 React가 2013년에 나왔으니 이제 겨우 10년이 됐습니다.이런 새로운 기능들과 요구사항이 미친듯이 쏟아지는 상황에서 작은 기능 추가에 몇 년이 걸린다면 .. 2023. 5. 4.
Spring Cloud Config로 Config 서버 구성하기 Spring Cloud Config로 Config 서버 구성하기 Spring Cloud Cloud란?Spring에서는 흔히 설정과 관련된 정보를 application.properties나 application.yml에서 관리합니다.설정에는 API Secret이나 암호키 같은 민감한 정보가 있을 수 있기 때문에 보통 환경변수나 jar 실행 시의 argument로 이런 값을 받게 해서 유출을 방지합니다.하지만 이런 방식은 같은 instance 여러개가 다른 시간에 배포되는 MSA 같은 환경에서는 관리가 너무 어려워 비현실적입니다. 이를 해결하기 위한게 Spring Cloud Config입니다.Spring Cloud Config를 쓰면...Backend(Git, Vault 등)에서 설정 파일들을 버전 관리 가능instance의 재시작 없이 주기적으로 새로운 설정으로 업데이.. 2023. 5. 2.
Kotlin의 꼬리재귀(tailrec) 알아보기 Kotlin의 꼬리재귀(tailrec) 알아보기 꼬리 재귀 함수란? (Tail Recursive Function)재귀 함수인데 마지막 동작이 재귀 호출인 재귀 함수 재귀 함수는 자기 자신을 호출하는 함수를 말합니다. 가장 유명한 예로 피보나치 수열을 만든 재귀 함수가 있습니다.fun fibonacci(n: Int): Long { return if (n 잘 보시면 이 함수 안에서 또 다시 함수를 호출합니다. (fibonaccci(n - 1))꼬리 재귀 함수는 재귀 함수의 일종입니다. 재귀 함수를 호출하는 모든 곳에서 재귀 함수 호출 외에 아무런 동작도 안 하면 꼬리 재귀 함수입니다.예를 들어 팩토리얼 (!)을 계산하는 재귀 함수를 보겠습니다.tailrec fun factorial(n: Int, acc: Long = 1): Long { retu.. 2023. 5. 1.
느린 검색 속도 최적화하기 (공공 API, 웹 크롤링의 병목 현상) 느린 검색 속도 최적화하기 (공공 API, 웹 크롤링의 병목 현상) 열심히 만들고 있는 책과 관련된 사이트에 책을 검색할 수 있는 기능을 넣었습니다. (booksitout.com에서 사용해 볼 수 있습니다)평소 책을 많이 읽는 편이라 도서관, 구독 서비스, 중고책 등을 한 번에 검색하면 편리하겠다 해서 넣었고, 좋은 아이디어라 생각했습니다.하지만 문제가 있었습니다. 느려도 너무 느리다는 것입니다. 아래는 Zipkin을 사용해서 검색 속도를 측정한 것인데, 최고 9초가 걸립니다.  검색 속도를 최적화 하기 위해 제가 헤매고 실수하며 내린 결정들과 그 근거들을 소개해 보겠습니다.Spring Webflux, Kotlin Coroutine으로 Refactoring가장 먼저 비동기적으로 요청하도록 개선했습니다.사용자가 거의 없으니 영향이 크지는 않겠지만, 전체를 받아오는데는 오래.. 2023. 4. 30.
통계를 처리하기 위한 Table을 만드는 설계는 바람직할까? 통계를 처리하기 위한 Table을 만드는 설계는 바람직할까? 통계용 Table을 만든 이유제가 만들고 있는 사이트 책잇아웃에는 1년간의 독서내역 통계를 보여주는 기능이 있습니다.통계는 사이트를 들어갈 때 마다 보이는데, 들어갈 때 마다 1년간의 모든 독서 활동을 SELECT 해서 계산해서 보여주면 너무 비효율적이라 생각해 보여주는 통계를 독서활동을 INSERT 할 때 마다 갱신해서 그 통계만 보여주면 좋을거라 생각해 통계용 Table을 만들었습니다.통계용 Talbe이 재앙이 된 이유우선, SELECT가 INSERT/UPDATE 보다 많은것 자체는 사실입니다. 하지만 INSERT/UPDATE가 일어 날 때 마다 코드 레벨에서 Transaction으로 통계 Table을 갱신해 줘야 하는건 상당한 부담입니다.1. 코드가 쓸데없이 복잡해집니다. 통계용 Table의 역할은.. 2023. 4. 28.
MSA (마이크로서비스)에서 환경에서 JWT 기반 보안 구축하기 MSA (마이크로서비스)에서 환경에서 JWT 기반 보안 구축하기 JWT는 가장 많이 사용되는 보안 방식 중에 하나입니다. 요청을 할 때 (보통 HTTP Authorization Header에) JWT Token을 보내면, 서버가 JWT Token을 파싱하고, 암호 키로 유효한 JWT Token인지 확인합니다. 서버가 1개일 때는 이 과정이 비교적 간단합니다. JWT Token을 검증하는 방법은 복잡한 수학적 알고리즘이 사용되지만 어차피 개발자는 라이브러리를 사용하니 이 과정에 거의 신경 쓰지 않습니다.하지만 만약 서버가 여러대인 마이크로서비스 환경이라면 어떨까요?MSA에서는 기능이 여러 서버로 나눠져 있어서 Client 입장에서는 요청 1개더라도 굉장히 많은 서버를 거칠 수 있습니다. 이 경우 JWT Token은 어떻게 처리해야 할까요? 2가지 접근 방식접근 방식은 .. 2023. 4. 22.
스프링 서큐리티(Spring Security) 구조 이해하기 스프링 서큐리티(Spring Security) 구조 이해하기 스프링 서큐리티 (Spring Security)? 그거 어떻게 하는 건데?Spring Security는 말 그대로 Spring 기반 애플리케이션에 보안을 제공하는 프레임워크입니다. 제공하는 기능은 아래와 같습니다. 인증 / 인가 (아래서 설명)일반적인 보안 위협 방어 (CSRF, XSS, SQL Injection)세션(Session) 관리다른 Spring의 프로젝트들과 연동 보안에 관한 기본적인 용어를 알아보자리소스Resource보호하고자 하는 대상접근 주체Principal접근하는 사람 (일반적으로 아이디)자격 증명Credential접근하는 사람이 본인이라는 걸 증명할 수 있는 정보 (일반적으로 비밀번호)역할RolesPrincipal이 가지고 있는 권한인증Authentication정말 그 사람이 맞는지 .. 2023. 4. 11.
마이크로서비스(MSA)를 쓰는 이유 마이크로서비스(MSA)를 쓰는 이유 초반에 프로그래밍을 공부하면서 틈틈히 IT 기업들의 발표회를 보곤 했는데, 거의 알아들을 수 없어서 충격을 받았던 적이 있습니다. 아직 갈 길이 멀구나 좌절하고, 반년 정도 열심히 공부한 후 다시 봤는데, 놀랍게도 똑같이 거의 알아들을 수 없었습니다. 나중에 알고 보니, 제가 알아듣지 못한 내용은 모두 MSA 관련 내용이였습니다. MSA(마이크로서비스 아키텍처), 말 그대로 서비스를 작게(마이크로하게) 만든다는 것입니다.대기업들은 굳이 왜 MSA를 사용할까요? MSA를 배워 보면 그 이유가 명확해 집니다. MSA에 관한 공부를 앞두고 계신다면, 그 전에 MSA가 정말 왜 필요한지 알려드리겠습니다. 크면 클 수록, 관리가 힘들고 예상치 못한 오류들이 많이 나온다구글이나 마이크로소프트 같은 실리콘벨리의 큰 .. 2023. 3. 28.
자바 21 - 자바 상속(Inheritance) 자바 21 - 자바 상속(Inheritance) 객체지향 프로그래밍에서 상당히 중요한 개념 중에 하나가 바로 상속이다. 상속은 우리가 일상생활에서도 흔히 쓰는 단어 중 하나인데, 객체지향에서의 상속도 이 일상생활에서의 의미와 상당히 비슷하다. 상속을 사용하는 이유는, 상속을 쓰는게 더 쉽게 코드를 짤 수 있기 때문이다. 상속에 대해 더 자세히 알아보자. 상속이란?객체지향에서 상속은 현실에서의 상속과 마찬가지로 프로퍼티(Prperty)와 매소드(Method)를 물려 받는 것이다. 프로퍼티는 쉽게 말해 클래스 안에 있는 변수이고, 매소드는 쉽게 말해 클래스 안에 있는 함수이다. 현실에서의 상속과 마찬가지로, 모든 프로퍼티와 매소드를 물려 받는 것이 아니라, 접근 제어자가 private인 프로퍼티나 매소드는 상속할 수 없다. 상속에서 상속을 해주는 클래스를.. 2021. 5. 21.
자바 20 - UML 다이어그램 자바 20 - UML 다이어그램 영화를 만드는 사람은 대본을 바탕으로 영화를 만든다. 영화 대본에는 대사뿐만 아니라, 표정 연기나 조명 등 영화를 만들 때 필요한 연출 등을 담고 있다. UML 다이어그램은 프로그래머의 대본이라고 할 수 있다. UML 다이어그램, 그중에서도 클래스 다이어그램(Class Diagram)은, 클래스에 있는 변수와 매소드의 성질과 어떤 데이터를 받는지 등을 나타내 준다. UML 다이어그램이란?UML 다이어그램(Unified Modeling Language)은, 모델링을 하기 위한 언어체계이다. 그중에서도 자주 씌는 클래스 다이어그램은 클래스를 나타내 주는 모형이다. 객체지향 프로그래밍에서 프로그램은 클래스들의 상호작용으로 나타낼 수 있기 때문에 클래스 다이어그램은 프로그램의 핵심을 담고 있다고 해도 과언이 아.. 2021. 5. 10.
자바 19 - static의 의미 자바 19 - static의 의미 새로운 프로그래밍 언어를 배울때 처음으로 하는게 바로 Hello World를 프린트하는 프로그램을 만드는 것이다. 자바에서 Hello World 프로그램은 다음과 같았다. class Ex { public static void main(String[] args) { System.out.println("Hello, world!"); }} 여태까지의 내용을 잘 따라왔다면 이 프로그램이 가지는 의미가 조금은 보일 것이다. 하지만 static은 뭘까? 우선, static이 뭔지 설명하기 전에 객체지향 프로그래밍의 기초적인 내용을 알아야 한다. 객체지향 프로그래밍의 기초는 여기서 배울 수 있다. static의 의미static이 무슨 뜻인지 한 마디로 하자면 인스턴스를 만들지 않고 사용할 수 .. 2021. 5. 8.
자바 18 - 오브젝트(Object), 객체지향 프로그래밍 자바 18 - 오브젝트(Object), 객체지향 프로그래밍 오브젝트와 클래스는 객체지향 프로그래밍을 구현하기 위해 존재한다. 객체지향 프로그래밍이란 뭘까? 왜 중요할까? 객체지향 프로그래밍이란?객체지향 프로그래밍은 프로그램을 객체들이 서로 상호작용하게 구현하는 방법이다. 원래 프로그램을 만든다고 하면, 프로그램이 뭐를 해야 하는지를 차례대로 구현해야 한다. 간단한 계산기 프로그램을 만든다면, 먼저 어떤 연산을 하는지 물어보고, 숫자를 받아오고, 계산을 해서, 결과를 보여주는 식으로 프로그램을 구현할 수 있다. 간단한 프로그램이라면 이런식으로 디자인해도 전혀 문제가 없지만, 문제는 프로그램이 복잡해지면 이러한 방식으로 하기가 쉽지 않다는 것이다. 예를 들어, 체스 프로그램을 이런 식으로 만든다고 하면, 어떻게 접근할지조차 쉽게 떠오르지 않을 것이다. 하지만, 객체.. 2021. 5. 6.
자바 17 - 자바 매소드(Method), 오버로딩, Call-by-Value 자바 17 - 자바 매소드(Method), 오버로딩, Call-by-Value 매소드는 함수라고도 불리며, 데이터를 받아 특정한 작업을 수행하고 다시 데이터를 내보내는 대상이다. - 매소드를 왜 써야 할까?- 매소드 선언- Call-by-Value- 오버로딩(Overloading) 매소드를 왜 써야 할까?매소드는 기본적으로 프로그램을 더 간편하게 하고, 반복되는 코드를 줄여준다. 코드가 반복되는 걸 줄여주는 건 상당히 중요한데, 예를 들어 어떤 기능을 구현했다고 했을 때, 똑같거나 비슷한 코드를 반복해서 사용하면 오류가 일어났을 때나 수정을 하고 싶을 때 코드를 쓴 모든 부분을 수정해야 하지만, 매소드를 사용하면 매소드만 수정하면 매소드가 사용된 모든 부분에서 코드가 자동으로 수정되기 때문에 버그를 고치기도 편하고, 수정하기도 편하고, 테스트하기도 편하고, 개발할 때도 편하고, 코.. 2021. 5. 4.
자바 16 - 2차원 배열 자바 16 - 2차원 배열 컴퓨터는 기본적으로 1차원 자료 구조를 가지고 있다. 그러나, 일상생활에서도 그렇고, 프로그래밍을 할때도 2차원 이상의 자료 구조를 사용하고 싶을때가 많다. 말이 어려울 수 있지만, 쉽게 말해 체스 프로그램을 만든다고 해 보면, 체스 말을 저장할 구조는 2차원이다. 1차원 배열을 사용해서 체스 말을 저장할 수도 있겠지만, 매우 헷갈리고 비효율적이기에, 2차원 배열이 있다. 주의해야 할 것은, 2차원 배열도 컴퓨터 안에서는 1차원 배열도 저장된다는 것이다. 1. 2차원 배열 문법2. 2차원 배열 활용 1. 2차원 배열 문법2차원 배열은 1차원 배열과 마찬가지로 대괄호를 사용해 선언한다. 차이점은, 2차원이기 때문에 2개의 대괄호를 써야 한다는 것이다. int[][] ex = new int[3][4]; 위의.. 2021. 5. 2.
자바 15 - 배열(Arrays) 자바 15 - 배열(Arrays) 배열은 한 변수에 여러개의 데이터를 저장하기 위해 고안됐다. 만약에 우리가 한 학년의 시험점수를 저장하고자 하는데, 그때마다 변수를 선언해야 한다면 매우 불편할 것이다. 이런 상황을 위해 하나의 변수에 많은 데이터를 저정하기 위해 배열이 존재한다. 1. 배열 문법2. 배열 활용 1. 배열 문법배열은 아래와 같이 선언한다. int[] ex; 배열은 원래 있는 데이터 타입 여러개를 한 변수에 저장하는 것이기 때문에 어떤 데이터를 저장할지 명시하고, 대괄호 2개를 써서 배열임을 나타낸다. 배열은 같은 데이터 타입만 저장할 수 있다. 보통은 데이터 타입 바로 뒤에 대괄호를 쓰지만, 변수 이름 뒤에 써도 상관없다. int ex[]; 배열은 크기가 정해져 있다. 그렇기 때문에 처음에 모든 값을 줘서 그 값의 크기만.. 2021. 4. 30.
자바 14 - while 루프 자바 14 - while 루프 while루프는 for루프와 비슷하게 코드를 반복할때 사용한다. 하지만 for루프와는 다르게 반복하는 횟수를 모를때 사용한다. 1. while 루프 문법2. while 루프 예제3. do-while 루프4. do-while 루프 예제 1. while루프 문법while 루프는 boolean 타입의 조건을 주고, 이 조건이 맞는 한 안의 코드를 계속 반복한다. int var = 0;while(var  위의 코드에서는 var이 10 미만일 한 while 루프 안의 코드를 계속 반복하게 했다. 여기서 중요한 것이, while 루프는 반드시 제시한 조건에서 빠져나올 수 있게 장치를 해야 한다는 것이다. 그렇지 않으면 무한루프가 발생해서 코드가 영원히 반복된다. int var = 0;while(var  위의 코드에.. 2021. 4. 28.
자바 13 - for 루프 자바 13 - for 루프 프로그램을 작성할 때 똑같은 코드를 반복하고 싶을 때가 있다. 그럴 때 사용하는 게 루프이다. 루프에는 여러 종류가 있는데, 그중에서도 for 루프는 몇 번 반복하고 싶은지 미리 알 때 유용하다. 1. for루프 문법for 루프에 필요한 것은 크게 3가지이다. 1. for 루프가 몇 번 실행됐는지 추적해 주는 변수2. for루프가 멈추는 조건 (몇 번 실행할지)3. for 루프가 실행될 때 마다 변수를 늘려주는 것 이게 무슨 말인지는 실제 코드를 보고 확인해보자. int i;for(i = 0; i  우선 첫 번째 재료인 변수를 선언하고, 그 변수를 0으로 만들어 줬다. for루프가 아직 한 번도 실행되지 않았기 때문에 0이라 했다. 두 번째 재료인 멈추는 조건은 i 즉, i가 지금은 0이지만, i가 2.. 2021. 4. 26.