![[AWS] VPC(Virtual Private Cloud)](https://blog.kakaocdn.net/dna/u0v6O/btsNHg1xdZv/AAAAAAAAAAAAAAAAAAAAAFl-uz8xycKkqzLZWKX6n4rCBBsMJ98tLkzW6GlA2CfZ/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=05ieQIAPKgIIQpnm3DHXrCJBanI%3D)
![[Spring] 스프링 컨테이너(IoC, DI 컨테이너)](https://blog.kakaocdn.net/dna/bKs3H1/btsM46zw4cc/AAAAAAAAAAAAAAAAAAAAALvRSBXY5xHxzpTo0wyevNOUBaxcEfrESFeEyhZgTn-z/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=9Dn4lIfdRrfR%2BvYCBDyh4Gv60Bs%3D)
![[DB 성능 최적화] 인덱스(Index)](https://blog.kakaocdn.net/dna/nA2td/btsI9RE76dJ/AAAAAAAAAAAAAAAAAAAAABQG-YPYCIIIDAz5B6QqLHhp9EQsuRYdvrYb7clSEsvN/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=1aytEuF%2B%2Fr5yyXJubz6zfRTclPY%3D)
![[JPA] 병합(Merge)과 변경 감지(Dirty Checking)](https://blog.kakaocdn.net/dna/bFZDNu/btsIWaxR2k8/AAAAAAAAAAAAAAAAAAAAAKU_Wl0gP0Bh_uA_KZVjQ8owS8Q15iz6nfb-370c8RXl/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=H4h37PPTUI9QOkqFkIayHqZtRh4%3D)
![[JAVA] 상속 - 타입 변환과 다형성(매우 중요)](https://blog.kakaocdn.net/dna/viEHP/btrVjnz9GER/AAAAAAAAAAAAAAAAAAAAAGXrZufvQ6C1qk3zdXc_V9gAJv_pRZ0Fkb5m5xq51VTf/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=DPH8OFhvhXPg%2FyoREhaLj020p%2BI%3D)
![[Docker] Docker Compose](https://blog.kakaocdn.net/dna/bQ4rTl/btsJfoCTWhU/AAAAAAAAAAAAAAAAAAAAABzdmYSP8N0861g-IfyDb3FBGZt7NzAbLLT98YORQ99b/img.webp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=ZcfYTyh8U5Mc6qnE3cBKflFsokU%3D)
![[Database] 트랜잭션 ACID, DB 연결구조와 세션](https://blog.kakaocdn.net/dna/c7kA33/btsFcQKD9PM/AAAAAAAAAAAAAAAAAAAAABRkvBlA9f2t26bzSxCayJ9NxlkyxydL4R2xM8dtqq-u/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=Jvt%2BDaa4I9cf84VTQ01khGaS9j4%3D)
![[Linux] 프로세스와 시그널](https://blog.kakaocdn.net/dna/bkg05L/btsKDFCOXxP/AAAAAAAAAAAAAAAAAAAAAPbSzYChzdF15PWIQck3aTNOhkW8bkVVgY2Gk5LeBXCw/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=wHAM0aDyiOyzbR%2FXAZVyvrH8Pzc%3D)
![[Ubuntu] ssh 원격접속 보안 강화](https://blog.kakaocdn.net/dna/vOZdu/btsLzqF56aG/AAAAAAAAAAAAAAAAAAAAAM4P14XHZYtbhB_O-F6hjF04WSt8eeyM_S9zntowILJz/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=FcCH23Gzo37iJ4h37qkOUgGDfc4%3D)
![[Linux / Ubuntu] VMware Tools 수동 설치](https://blog.kakaocdn.net/dna/cNmx0k/btsGbDbW1yY/AAAAAAAAAAAAAAAAAAAAACNJXtu8XM_NfOl3WHXunf-qZyWF6NsBJm0-jB6DwaK8/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=yp7wQhGu%2FwR6xP0o%2FTq2a7IZ334%3D)
![[Git] 소스트리(Sourcetree)로 브랜치(Branch) 다루기](https://blog.kakaocdn.net/dna/1Ulru/btsCy6Do1i6/AAAAAAAAAAAAAAAAAAAAAFH450-O82q-bAup72u1vmlpvxgSjs01Zhv2xHEUF9Kv/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=%2FYP9yN2q%2FOyAAb8NSboX7e3sIVw%3D)

![[JSP] IntelliJ 에서 JSP 개발환경 만들기](https://blog.kakaocdn.net/dna/cNQOvx/btsC7qtoxqm/AAAAAAAAAAAAAAAAAAAAAIavNr6TA8DBnTQ1TMcv0_Zj_oRO_WuuwM_3SDfD3mon/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=k3PChP4WpCnITUa8E08A41XDG34%3D)

![[Redis] 스프링에 레디스 추가](https://blog.kakaocdn.net/dna/1Ey6Q/btsOq8nDzFK/AAAAAAAAAAAAAAAAAAAAAOzkGNnKfLeJtL6p_Pjbg8Hw96hDcaUqaLOWuib4Eb4j/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=uxWMr2kJX4pdtkLxixosFjSptm4%3D)
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.스프링에 레디스를 도입해서 간단한 게시판 서비스의 조회 성능을 개선하는 코드 기본적인 애플리케이션 설정application.yml# local 환경spring: profiles: default: local datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: true data: redis: host:..
![[Spring] CQRS 패턴](https://blog.kakaocdn.net/dna/bGK14c/btsOqeaLI7s/AAAAAAAAAAAAAAAAAAAAAEQoJr5B5-I9Ssb2qt_A6oOQ8TGHqm-UbSay4OadBUs5/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=Hk2Cef1pICw1FRKaWmxX%2FMxmEek%3D)
CQRS는 CUD(Command)와 R(Query)를 분리하는 것이다.기존의 CRUD 서비스 구조는 보통 하나의 클래스나 API에서 create, read, update, delete 전부 처리한다.CQRS는 이를 명확히 나눠서,Command (명령): create, update, deleteQuery (조회): read이 두 가지를 서로 다른 책임으로 나누는 패턴이다. CQRS 패턴을 도입하는 이유역할이 다르기 때문Command는 상태를 바꾸는 작업.Query는 상태를 읽기만 함. 성능 최적화 가능예를 들어 Command는 트랜잭션 안전성과 정합성 위주로, Query는 빠르게 결과만 제공하도록 설계할 수 있다. 코드 유지보수 편리로직이 복잡해질수록 읽기와 쓰기를 분리하는 게 유리하다. CQRS는 단순히..
![[Github Actions] 기본 문법과 배포 자동화 방법](https://blog.kakaocdn.net/dna/V9vtv/btsOoeQNQkb/AAAAAAAAAAAAAAAAAAAAAAA-56xPMtWYbdYNzefSYyvnY68iKG5J0uCpUa1Vjoug/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=y1JK1oS3zdIdq0j%2Bb%2BmpXk4IqvE%3D)
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.기본 문법GitHub Actions에서 가장 중요한 파일은 deploy.yml인데, 이 파일의 위치는 git으로 관리되는 최상위 루트의 .github/workflows/ 폴더에 저장되어 있어야 한다.-> 최상위루트/.github/workflows/deploy.yml(deploy.yml 의 이름은 변경해도 상관없다.)# Workflow의 이름# Workflow : 하나의 yml 파일을 하나의 Workflow라고 부른다. name: Github Actions 실행시켜보기# Event : 실행되는 시점을 설정# main이라는 브랜치에 push 될 때 아래 Workflow를 실행on: push: branches: ..
![[부하 테스트] 트래픽 증가에 따른 시스템 설계 및 확장](https://blog.kakaocdn.net/dna/sutUX/btsOmKBLVUr/AAAAAAAAAAAAAAAAAAAAADi0kmxJcLYybtWnnbJXm8QvCnlnApo6hrbn8XaDlgs0/img.webp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=6ofmO3xn7TpA2yW3xymmwmbBeHY%3D)
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.부하 테스트를 하면서 목표로 설정해놓은 Throughput, Latency를 달성하기 위해 성능 개선을 해야 한다.병목 지점이 어디서 발생하느냐에 따라 성능 개선의 방법이 달라진다. 병목 지점에 따른 성능 개선EC2(WAS)가 병목 지점일 경우애플리케이션 로직에서 비효율적인 부분 개선정적 파일 서버(S3, Cloudfront) 분리로드밸런서(ELB)를 활용해 수평적 확장수직적 확장 RDS(데이터베이스 서버)가 병목 지점일 경우비효율적인 쿼리 개선 (인덱스 활용, SQL문 튜닝, 역정규화 등)수직적 확장읽기 전용 데이터베이스(Read Replica) 도입캐시 서버 도입주의위 순서가 절대적인것은 아니다. 일반적으로 ..
![[부하 테스트] 병목지점 판단](https://blog.kakaocdn.net/dna/m8EtO/btsOmGzjEDd/AAAAAAAAAAAAAAAAAAAAAIFLX0QBRHPt_MoQ4-bd_tqnzBMaTBjSb2Jq22cEwVcy/img.webp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=zqu1SPRBBg0J9PN2s0ald6g%2FelI%3D)
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.모니터링과 병목지점부하 테스트 과정 중에 성능을 개선하려면 병목 지점을 먼저 파악해야 한다.병목 지점을 파악하기 위해서는 각 컴퓨터의 CPU 사용률과 메모리 사용률과 같은 값들을 지속적으로 확인할 수 있어야 한다.여기서 얘기하는 컴퓨터는 로드 밸런서(ELB), 백엔드 서버(EC2), DB(RDS), 캐시(ElastiCache) 등을 얘기한다. 무언가 요청을 받아서 처리하는 형태의 서비스는 전부 컴퓨터에서 처리하기 때문이다.컴퓨터가 무언가를 처리하려면 CPU와 메모리 같은 자원이 필요하다. 만약 컴퓨터가 처리할 수 있는 최대한의 요청을 처리하고 있다면, CPU 사용률 또는 메모리 사용률과 같은 값이 100%에 가까운..
![[부하 테스트] k6 설치 및 사용 방법](https://blog.kakaocdn.net/dna/NLJkY/btsOnuEvqFa/AAAAAAAAAAAAAAAAAAAAAG6U_mP4jWEasPh27fQG4AiC1xFm97-mpvAjeH2s1wdt/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=%2BjhOHPxKBDmfqgRsTJGt17c6ipE%3D)
k6는 사용자인척 요청을 보내는 도구이다.원래라면 사용자가 직접 서비스에 요청을 보내야 하는데, k6는 여러 명의 사용자를 대신해서 요청을 보내는 도구이다. k6 설치(맥 기준)맥에서 k6를 설치하는 방법은 매우 간단하다.brew install k6 설치가 완료되고 k6를 입력하고 아래와 같은 화면이 나타났다면 정상적으로 설치된 것이다. read: connection reset by peer윈도우나 맥에서 k6를 사용하다보면 read: connection reset by peer 문제를 마주할 수 있다.이는 MacOS에서 소켓에 제한을 걸어서 발생되는 문제이다.이는 3가지 방법으로 파훼할 수 있다.1. ulimit -n 명령어 사용ulimit -n 65535소켓의 수를 임시적으로 65535개로 늘리는 ..
![[부하 테스트] 처리량(Throughput), 지연 시간(Latency), 병목 지점(Bottleneck Point)](https://blog.kakaocdn.net/dna/l0bje/btsOm8IShmy/AAAAAAAAAAAAAAAAAAAAACUNw_w9TfLZnkahlqgXDYERl3b72bCpDuq7OHyIx-ni/img.webp?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=zsXXdgINHCj8M59I1jeehnwvDwU%3D)
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다. 처리량(Throughput)부하 테스트에서 서비스가 1초당 처리할 수 있는 트래픽 양을 보고 Throughput이라고 부른다.단위는 TPS(Transaction Per Seconds, 1초당 처리한 트랜잭션의 수)를 많이 활용한다.만약 서비스가 1초에 최대 100개의 API 요청을 처리할 수 있다면, 이 서비스의 Throughput은 100 TPS라고 말한다.TPS VS RPS(Request Per Second)RPS는 요청(Request) 기준이다.단순히 서버가 1초에 받은 HTTP 요청 수를 의미한다.예: /login, /products, /users/1 같은 API 호출 1건당 1 RPS로 측정된다.TPS는..
![[ElasticSearch] 검색어 추천 기능(search_as_you_type)](https://blog.kakaocdn.net/dna/pjbtH/btsOmLfa2cL/AAAAAAAAAAAAAAAAAAAAAOaeTqNHJ6Rti2Epg2VjlBkJJF7n2dVi3qJq8OqLKas5/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=MgkPUcOYEQEgr2Z%2BBluHums0Pkg%3D)
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.쿠팡 서비스에 들어가서 검색 창에 글자를 입력하면 글자에 해당하는 검색어를 추천해준다.자동 완성 기능을 구현하는 방법에는 정말 다양한 방법이 존재한다.그 중에서 가성비가 좋은 방법인 search_as_you_type을 활용하는 내용을 다룬다. search_as_you_typeElasticsearch에서 자동 완성 기능을 쉽게 구현할 수 있게 설계된 데이터 타입이다.text 타입처럼 애널라이저(Analyzer)를 거쳐 토큰으로 분리된다.이 타입을 활용해 필드를 만들면 내부적으로 _2gram, _3gram이라는 멀티 필드(Multi Field)도 같이 만든다. _2gram, _3gramPUT /products{ "m..
![[ElasticSearch] 멀티 필드(Multi Field)](https://blog.kakaocdn.net/dna/OCvWG/btsOk5TGypY/AAAAAAAAAAAAAAAAAAAAAON8k7u7u6_Zi01NnGlITDEIRhSIBVNXVGVHkSRvc61S/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=A%2FVOfDnA5Z%2FicBbdVRiJ0WK8UO8%3D)
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.Multi Field하나의 필드에 text와 keyword 타입을 동시에 사용하고 싶을 때 사용데이터 타입에서 text는 유연한 검색이 필요할 때 사용하고, keyword는 정확한 검색이 필요할 때 사용한다.그런데 유연한 검색과 정확한 검색 둘 다 하고 싶은 경우가 있을 수 있다.예를 들어, 상품 카테고리와 이름 필드에 저장된 필드 값에 대해 검색할 때는 유연하게 검색되게 하고 싶고, 정확한 비교를 통해 특정 카테고리를 기준으로 필터링을 하고 싶을 수 있다.즉, text 타입과 keyword 타입을 동시에 사용하고 싶은 경우이다. 인덱스 생성PUT /products{ "mappings": { "propert..
![[ElasticSearch] 오타 허용 검색, 하이라이팅, 페이지네이션 및 정렬](https://blog.kakaocdn.net/dna/CdtSM/btsOlBR8NiU/AAAAAAAAAAAAAAAAAAAAABEvJp028xHjVLMZoodIQKRgWn9_3L-dSnBKhT3L8IPZ/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allow_ip=&allow_referer=&signature=JABfxn2PbpQ%2BQyk1Zy8DT6htfKI%3D)
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.fuzziness(오타 허용 검색)오타를 어느 정도 허용해서 검색하고 싶을 때 fuzziness를 활용하면 된다. 인덱스 생성 및 데이터 삽입// 인덱스 생성PUT /boards{ "mappings": { "properties": { "title": { "type": "text" } } }}// 데이터 삽입POST /boards/_doc{ "title": "elasticsearch 사용법" } 오타 허용 검색GET /boards/_search{ "query": { "match": { "title": { "query": "elastiksearc..