일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- jvm
- spring
- Kotlin
- 보조스트림
- Java
- 쿠버네티스
- IntellJ
- 백준
- K8s
- 토비의 스프링 정리
- 이스티오
- 토비의 스프링
- 스프링
- redis
- 스트림
- mysql
- MSA
- JPA
- Collection
- thread
- Stack
- Real MySQL
- gradle
- 자바
- GC
- 자바 ORM 표준 JPA 프로그래밍
- SpringBoot
- Stream
- list
- OS
- Today
- Total
목록전체 글 (152)
인생을 코딩하다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/H5i9r/btrfho7m90X/gJ75Jiqe1E8kD6OrlUsoh0/img.png)
MSA(MicroService Architecture)란 무엇일까요? 시스템을 여러개의 독립된 서비스로 나눠서, 이 서비스를 조합함으로써 기능을 제공하는 아키텍쳐 패턴입니다. 하나의 기능을 구현 하는데, 여러 개의 서비스를 조합하여 기능을 제공합니다. -> EX) 주문하기 : 사용자 정보 조회, 상품 정보 조회, 신규 주문 생성 왜 MSA(MicroService Architecture)를 사용할까요? 위의 그림의 왼쪽은 Monolitic 구조입니다. Monolitic 구조에는 아래와 같은 문제점이 존재합니다. 단일 Container에 여러 기능을 통합하여 구성 단단한 결합을 통하여 Service를 연결 전체 시스템이 하나의 Project로 구성되어 개발 및 빌드를 통합적으로 진행하여야 함 특정 서비스 및..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/CPKXJ/btrcXljK8Wl/TQjKdRxFOE5wssKl7WjGN1/img.png)
안녕하세요. 이번에는 MySQL 실행 계획을 통해 페이징 쿼리의 성능을 개선하는 과정을 작성해 보았는데요, UI가 무한 스크롤 방식이 아닌 오프셋 페이지 방식(>)이기 때문에 커서 기반 페이지네이션 쿼리 방식을 사용하지 않고, 오프셋 기반 페이지네이션 쿼리 방식을 커버링 인덱스 방식의 쿼리를 사용하여 페이징 쿼리의 성능을 개선하였습니다. 커서 기반 페이지네이션 : 클라이언트가 가져간 마지막 row의 순서상 다음 row들을 n개 요청, 응답하게 구현 오프셋 기반 페이지네이션 : DB의 offset 쿼리를 사용하여 페이지 단위로 요청/ 응답하게 구현 커버링 인덱스란? 쿼리를 충족시키는 데 필요한 모든 데이터를 갖고 있는 인덱스를 커버링 인덱스(Covering Index) 라고합니다. 인덱스는 데이터를 효율적..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b0wPfv/btrdqjGtQWp/tk6zT5ZQ2XXEr80TYx2ok0/img.png)
안녕하세요. 요즘 이펙티브 자바(Effective Java)를 읽어보고 있는데요, 읽다보니 코틀린은 이펙티브 자바가 대부분 반영이 되어있는 산물이라고 느꼈습니다. 보통 코틀린이 자바에 비해 훨씬 코드를 간결하게 작성할 수 있다는 것은 누구나 알고 있을텐데요, 구체적으로 어떤 어떤 사례들이 있는지 제가 이펙티브 자바를 읽으면서 한 번 분석하여 보았고, 직접 이펙티브 코틀린이라는 주제로 글을 작성해보고 있습니다. 그럼 Hyung1Jung의 Effective Kotlin 시작해보도록 하겠습니다. [Effective Kotlin - Item2] : 코틀린에서 빌더를 사용할 필요가 있을까? 이번 글은 이펙티브 자바 Item2를 읽어보며 이것이 코틀린라는 언어에서는 어떻게 녹여져 있을까에 관해 작성해보았습니다. 이..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cRKvOL/btrdpDSEILx/rh6LkKwjBR02iDFw4muNk1/img.png)
서비스와 추상화 p.343) 객체지향적인 코드는 다른 오브젝트의 데이터를 가져와서 작업하는 대신 데이터를 갖고 있는 다른 오브젝트에게 작업을 해달라고 요청한다. 오브젝트에게 데이터를 요구하지 말고 작업을 요청하라는 것이 객체지향 프로그래밍의 가장 기본이 되는 원리이기도 하다. p.353) 트랜잭션이란 더 이상 나눌 수 없는 단위 작업을 말한다. 작업을 쪼개서 작은 단위로 만들 수 없다는 것은 트랜잭션의 핵심 속성인 원자성을 의미한다. 따라서 중간에 예외가 발생해서 작업을 완료할 수 없다면 아예 작업이 시작되지 않은 것처럼 초기 상태로 돌려놔야 한다. 이것이 바로트랜잭션이다. p.354) 두 가지 작업이 하나의 트랜잭션이 되려면, 두 번째 SQL이 성공적으로 DB에서 수행되기 전에 문제가 발생할 경우에는 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cIpPnd/btrdpMoBjAB/OuOtcLb3cEOEJx5DWKfm70/img.png)
4장, 예외처리 p.281) 예외를 처리할 때 반드시 지켜야 할 핵심 원칙은 한 가지다. 모든 예외는 적절하게 복구되든지 아니면 작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보돼야 한다. SQLException이 발생하는 이유는 SQL에 문법 에러가 있거나 DB에서 처리할 수 없을 정도로 데이터 엑세스 로직에 심각한 버그가 있거나, 서버가 죽거나 네트워크가 끊기는 등의 심각한 상황이 벌어졌기 대문이다. p 283) 예외의 종류와 특징 자바에서 throw를 통해 발생시킬 수 있는 예외는 크게 세 가지가 있다. Error 첫째는 java,lang.Error 클래스의 서브클래스들이다. 에러는 시스템에 뭔가 비정상적인 상황이 발생했을 경우에 사용된다. 주로 자바 VM에서 발생시키는 것이고 애플리케이션 코..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/sjJbj/btrdpC0s9Rv/7ofBIeKWunGLMxsDh3u0F1/img.png)
객체 생성과 파괴 (2장) Item2 : 생성자에 매개변수가 많으면 빌더를 고려하라 점층적 생성자 패턴 매개변수를 늘려가는 점층적 생성자 패턴을 쓸 수는 있지만, 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기가 어렵다. 코드를 읽을 떄 각 값의 의미가 무엇인지 헷갈릴 것이고, 매개변수가 몇 개인지도 주의해서 세어 보아야 할 것이다. 타입이 같은 매개변수가 연달아 늘어서 있으면 찾기 어려운 버그로 이어질 수 있다. 클라이언트가 실수로 매개변수의 순서를 바꿔 건네줘도 컴파일러는 알아채지 못하고, 결국 엉뚱한 동작을 하게 된다. 선택 매개변수가 많을 때 활용할 수 있는 두 번째 대안인 자바빈즈패턴(JavaBeanspattern) 매개변수가 없는 생성자로 객체를 만든 후, 세터 메서드들을 호출해 원..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/kYOf6/btrdrvsNnxB/aHhcKZjH9EEqJNyEOkYpXk/img.png)
객체 생성과 파괴 (2장) 개요 이 책에서는 아래와 같이 개념을 정의한다. API를 사용하는 프로그램 작성자(사람)를 그 API의 사용자라고 한다. API를 사용하는 클래스(코드)는 그 API의 클라이언트라고 한다. Item1 : 생성자 대신 정적 팩토리 메서드(static factory method)를 고려하라. public 생성자를 사용하여 객체를 생성하는 전통적인 방법 외에도 static factory method를 이용하여 객체(인스턴스)를 생성 할 수있다. static factory method의 장점과 단점을 알아보자. 장점 1 : 이름을 가질 수 있다. 생성자에 넘기는 매개변수와 생성자 자체만으로 반환될 객체의 특성을 제대로 설명하지 못한다. 정적 팩터리는 이름만 잘 지으면 반환될 객체의 특..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bcBxYS/btrc8gRWvYo/L6arXfvYkrKvsB5Ne60TC0/img.png)
들어가기에 앞서, 이전 글에서는 가상 접속자가 1000명일 때의 상황에서 성능 테스트를 진행하여 보았는데요, Scale-out을 적용한 뒤 로드밸런싱에 의해 트레픽 부하가 분산되어 더 좋은 성능을 가진 서버로 개선된 것을 확인할 수 있었습니다. 하지만 본 프로젝트는 접속자 수를 최대 1000명으로만 한정지어 놓은것이 아니기 떄문에, 가상 접속자가 3000명일 때의 환경에서도 성능 테스트를 진행하였는데요, 가상 접속자가 3000명인 상황을 대비하여 성능 테스트를 통해 사전에 시스템 장애를 확인하고 서버의 성능 튜닝하였습니다. 아래에서 확인해보도록 하겠습니다. 🔍 가상 접속자가 3000명일 때의 성능 테스트 후 성능 개선 1. 부족한 worker_connection으로 인해 CPU 사용률이 낮아 테스트 실패..