본문 바로가기

분류 전체보기70

[대규모 시스템 설계] GRPC를 통한 서비스간 통신 서비스간 통신 어떻게 진행할까?일반적으로 우리가 MSA 구조에서, 서비스와 서비스간 통신한다라고 한다면 직관적으로 떠오르는 것은 Endpoint를 생성해서 REST를 이용해서 통신하는 것이다. 하지만, REST의 큰 단점이 존재한다. REST는 HTTP/1.1 프로토콜을 사용하기 때문에, 단일 request에 대해서 단일 response만 제공해준다. 즉, 여러번의 request를 보내서 서버에 처리를 요청해야 된다. 그러면, 불필요한 네트워크 비용이 발생하며, 성능도 저하가 된다. 요즘같이 MSA가 업계 표준이 되가는 상황에서, 서비스간 통신이 진행될 일이 굉장히 많을텐데, 이 점은 굉장히 치명적일 것이다. 그래서 해결하기 위해 등장한 기술이 Socket, RPC와 같은 기술이다. 여기서, 구글이 기존.. 2025. 7. 9.
[Spring] Jar Layer 분리로 효율적으로 Spring 서버 배포하기 일반적인 Docker로 Spring 서버 배포하기제일 직관직이고 간단한 방법부터 시작해보고자 한다. 우선 프로젝트 최상단에 Dockerfile을 하나 생성하고 아래처럼 작성해보자.FROM openjdk:17-alpineARG JAR_FILE=./build/libs/*.jarCOPY ${JAR_FILE} app.jarENTRYPOINT ["java","-jar","/app.jar"] 이제 ./gradlew 또는 gradle clean build를 통해서 빌드를 진행하여 .jar 파일을 생성한다.docker build -t [name]:[tag] . image의 name과 tag를 지정한 뒤, 위 명령어를 통해 docker image를 생성한 후, docker run -d [name]:[tag] 그런데 D.. 2025. 6. 30.
[Spring] OpenSearch를 이용한 검색어 자동완성 기능 제작 검색어 자동완성을 구현하는 가장 쉬운 방법은 RDB에서 매번 특정 칼럼에 Like문을 때리는 것이다. 그런데 이렇게 하면 문제가 있다. 첫번째, 검색어 자동완성 자체가 이벤트가 일어날 때 마다 지속적으로 api 요청을 보내는데, 거기에 Full Scan으로 검색하는 RDB Like 문으로 검색하면 DB 부하가 장난 아닐 것이다. 두번째, 모든 데이터가 영어로 보장되있다면 그나마 괜찮은데 (인덱스를 활용하면 되기 때문), 한글 데이터가 들어가는 순간, Like 문 검색은 반드시 피해야된다. 왜냐하면, 한글 특성상 DB 인덱스를 사용하기 매우 어렵기 때문이다. 한글은 자모음 분리가 가능하고, 초성 검색 등의 특수한 경우를 고려해야 하기에, 기본적인 Like 문으로는 성능이 급격히 떨어진다. 따라서, Ela.. 2025. 6. 22.
[백엔드 기술 면접] #9 DB심화 #9 DB심화 Q. 데이터베이스 파티셔닝의 필요성과 파티셔닝 방식에는 어떤 것들이 있나요?A. 데이터베이스 파티셔닝은 대용량 데이터베이스의 관리를 용이하게 하고 성능을 향상시키기 위해 사용됩니다. 주요 파티셔닝 방식으로는 수평 파티셔닝(Horizontal Partitioning)과 수직 파티셔닝(Vertical Partitioning)이 있습니다. 수평 파티셔닝은 데이터 행을 여러 테이블로 나누고, 수직 파티셔닝은 열을 기준으로 데이터를 분할합니다. 각 방식은 특정 쿼리 유형에 최적화되어 성능을 개선할 수 있습니다. Q. MySQL에서 파티션 테이블에 외래키 제약조건을 설정할 수 있나요? 없다 실제 사용 시 어떻게 대응하는 것이 좋을까요?A. MySQL에서 파티션 테이블은 외래키 제약조건을 지원하지 않습.. 2024. 11. 24.
[백엔드 기술 면접] #8 JAVA #8 JAVA Q. JVM의 작동 원리에 대해 설명해보아라A. JVM은 자바 애플리케이션을 실행하기 위한 가상 머신이다. JVM은 클래스 로더를 통해 클래스 파일을 메모리에 로드하고, 바이트코드를 실행 엔진이 해석하며, JIT 컴파일러가 성능을 최적화한다. Q. Garbage Collection이 무엇이며, Java에서 주요 알고리즘에 대해 설명하라.A. 프로그래밍에서 객체나 변수를 생성하면, 이들은 메모리를 점유하게 됩니다. 하지만 더 이상 사용되지 않거나 참조되지 않는 객체가 남아 있다면, 그들이 차지하는 메모리는 비효율적으로 낭비됩니다. 이러한 메모리 누수를 방지하기 위해 Garbage Collection이 필요합니다. 주요 알고리즘으로는 Mark and Sweep, Minor/Major GC, G.. 2024. 11. 23.
[백엔드 기술 면접] #7 Server (3) #7 Server (3) Q. Java 17 버전을 사용한 이유는 무엇인가?A. Java 17은 LTS(Long-Term Support) 버전으로, 안정성과 장기적인 지원을 제공합니다. 또한, 성능 향상과 새로운 기능들, 특히 텍스트 블록을 통한 코드 가독성을 향상시킬 수 있었으며, record 객체를 이용하여 보일러플레이트 코드를 크게 줄일 수 있습니다. Q. GraphQL과 REST의 차이는 무엇인가?A. GraphQL은 클라이언트가 필요한 데이터만 요청할 수 있게 해주어 오버페칭과 언더페칭을 줄일 수 있으며, REST는 정형화된 HTTP 메서드를 사용해 리소스를 처리합니다. GraphQL은 하나의 엔드포인트로 다양한 쿼리를 처리할 수 있지만, REST는 리소스마다 별도의 엔드포인트를 가집니다. Q... 2024. 11. 22.
[DB] ElasticSearch의 Suggest API Suggest API SuggestAPI에서 사용되는 Suggester는 색인이 된 대상을 FST(유한상태 변화기)라는 데이터 구조를 만들어 In-Memory에 올려 일반 검색 API보다 훨씬 응답이 빠르다. 이때, 인메모리에 올라가니 변경이 적은 것이 좋다. FST Type을 사용하고 싶으면 mapping에서 completion type으로 지정하면 된다. Completion field type | Elasticsearch Guide [8.16] | ElasticCompletion field type edit To use the completion suggester, map the field from which you want to generate suggestions as type completion.. 2024. 11. 21.