일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 토비의 스프링
- 스트림
- 쿠버네티스
- 자바
- MSA
- GC
- 자바 ORM 표준 JPA 프로그래밍
- 이스티오
- redis
- SpringBoot
- Kotlin
- OS
- list
- Stream
- Collection
- K8s
- gradle
- spring
- 스프링
- Stack
- 보조스트림
- JPA
- mysql
- 백준
- thread
- Real MySQL
- jvm
- 토비의 스프링 정리
- IntellJ
- Java
- Today
- Total
목록전체 글 (152)
인생을 코딩하다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/R85PJ/btsv9NpkN5Z/GpAiL3aNIDYcrFeNSW9t0k/img.png)
Redis Pipeline에 설명하기에 앞서 No Pipeline에 관해 간략하 말씀드리겠습니다. redis는 요청을 보낼 때 일반적으로 아래와 같이 수행됩니다. 클라이언트는 서버에 쿼리를 보내고 일반적으로 차단 방식으로 소켓에서 서버 응답을 읽습니다. 서버는 명령을 처리하고 클라이언트에 응답을 다시 보냅니다. Redis는 클라이언트-서버 모델과 요청/응답 프로토콜을 사용하는 TCP 서버이며, 클라이언트가 서버에 명령을 보내고 응답을 받는 구조입니다. 위 과정은 클라이언트가 연속적으로 많은 요청을 보내야 하는 경우 RTT가 길어져 성능에 악영향을 미칠 수 있습니다. 예를 들어 RTT가 250밀리초인 경우, 초당 최대 4개의 요청만 처리할 수 있습니다. 만약 요청이 1000개라면 엄첨 느리겠죠? 위와 같이..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/A6xtx/btsdZzWWDy7/NHRezxjJKQtVTOAhw3Orp0/img.png)
where절 작성 순서는 query 성능과 연관이 있을까요?SELECT * FROM hyungil.user AS u .... WHERE u.id = ? AND u.name = ? AND u.date = ?상관없습니다. Query Optimizer의 최적화 알고리즘에 의해 알아서 최적화됩니다. 비즈니스 로직의 순서에 맞춰서 작성하면 됩니다.FROM절 작성 순서는 query 성능과 연관이 있을까요?INNER JOINSELECT * FROM hyungil.A INNER JOIN hyungil.B ON A.col = B.col INNER JOIN hyungil.C ON C.col = B.colINNER JOIN은 Query Optimizer의 최적화 알고리즘(순서가 달라도 결과가 같아야 한다.)에 의해 알아서 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/FxNYX/btr0GLiubJB/xR374edoKLaKlXlhJXsdf0/img.png)
카프카 리밸런싱이란 무엇일까요? 컨슈머 그룹으로 이루어진 컨슈머 들 중 일부 컨슈머에 장애가 발생하면, 장애가 발생한 컨슈머에 할당된 파티션은 장애가 발생하지 않은 컨슈머에 소유권이 넘어갑니다. 이러한 과정을 리밸런싱이라고 부릅니다. 리밸런싱이 일어날 수 있는 상황 두 가지는 크게 컨슈머가 추가되는 상황과 컨슈머가 제외되는 상황으로 나뉩니다. 이슈가 발생한 리밸런싱 즉, 컨슈머를 컨슈머 그룹에서 제외하여 모든 파티션이 지속적으로 데이터를 처리할 수 있도록 가용성을 높여 주어야 합니다. 그럼 컨슈머에 문제가 발생했을 때 리밸런싱이 일어난다는 건데, 문제가 발생한걸 어떻게 실시간으로 판단하고 자동으로 리밸런싱이 되게 할 수 있을까요? 저는 리밸런싱에 관해 이러한 생각이 들었습니다. "그럼 컨슈머에 장애가 난..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/o66vO/btrJItxbWAW/GSyWNT70P1kKcWrvB1hbW1/img.png)
쿠버네티스 설명에 앞서 현재 세계 많은 기업에서 쿠버네티스를 사용하게 된 역사에 관해 간단히 작성해보았습니다. 큰 기업들은 대규모의 서비스를 운영하고 있기 때문에 최대한 자원을 효율적으로 쓰는 것이 중요합니다. 이것은 비용과 관련이 있기 때문이죠. 따라서, 서버 자원을 효율적으로 쓰기 위해 기업들은 가상머신(VM) 기술에 대해 관심을 가질 수 밖에 없습니다. VM은 무엇인가요? 가상 머신(Virtual Machine, VM)은 물리적 하드웨어 시스템(오프프레미스 또는 온프레미스에 위치)에 구축되어 자체 CPU, 메모리, 네트워크 인터페이스 및 스토리지를 갖추고 가상 컴퓨터 시스템으로 작동하는 가상 환경입니다. VM의 역사 위 사진을 보면 2014.6 전까지를 하이퍼바이저(가상머신 방식) 기반 가상화, 그..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Q640V/btrCBpwCuNR/9gkA3iejrAH3hyKoEIOqQk/img.png)
가변성을 제한하라. 읽고 쓸수 있는 프로퍼티 var을 사용하거나 mutable 객체를 사용하면 상태를 가질 수 있습니다. 상태를 가지면 해당 요스의 동작은 사용 방법뿐만 아니라 그 이력에도 의존하게 됩니다. 가변성이 있을 시 문제점 1. 프로그램을 이해하고 디버그하기 힘들어집니다. 이러한 상태를 갖는 부분들의 관계를 이해해야 하며, 상태 변경이 많아지면 이를 추적하는것이 힘들어집니다. 이러한 클래스는 이해하기도 어렵고, 이후에 코드를 수정하기도 힘들어집니다. 클래스가 예상하지 못한 상황 또는 오류를 발생시키는 경우에도 큰 문제가 됩니다. 2. 가변성이 있으면, 코드의 실행을 추론하기 어려워집니다. 시점에 따라서 값이 달라질 수 있으므로, 현재 어떤 값을 갖고 있는지 알아야 코드의 실행을 예측할 수 있습니..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bstscQ/btrB66WT8nr/DKkaNPumf9pUoUJfFOYT4k/img.jpg)
안녕하세요. 오늘은 Pessimistic Lock으로 동시성 제어를 하는 법에 관해 글을 작성해보려 합니다. 저는 상품을 주문하는 API를 개발하고 있었습니다. 여러 사용자가 동시다발적으로 상품을 주문 할 때, 데이터 정합성에 이슈가 발생하는 문제였습니다. 위의 그림처럼 세 명의 사용자가 동시다발적으로 주문을 요청할 시 상품의 총 재고는 70이 되어야하지만, 주문이 동시에 일어나는 바람에 70이 아닌 90이 되어버리는 상황입니다. 총 (10 + 10 + 10)30의 재고가 차감되어야 하지만, 동시에 요청이 일어나서 10의 재고만 차감이 되어버리는 이슈입니다. 이걸 어떻게 해결할 수 있을까요? 이것은 간단하게 JPA의 비관적 락(Pessimistic Lock), 혹은 낙관적 락(Optimistic Lock..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/PDKZd/btrARLg1kiT/7u4hTVCAnYNhUZk7gV6Lr0/img.png)
최근에 디프만 프로젝트를 진행하며 회원가입을 위해 이메일 인증 API를 개발하고 있었습니다. 약관 및 정책 등의 링크를 메일로 보내고, 메일에서 링크를 클릭하면 이메일 인증이 되는 flow 였습니다. 허나 이게 로컬에선 잘 돼는데, ec2 서버에서 계속 인증 메일을 보낼 때 AUTH LOGIN failed 발생했습니다. 두 가지 이유가 있엇습니다. 첫 번째 이유는 SMTP의 기본 port는 25입니다. 하지만, Amazon EC2 서버에서는 SMTP port 25을 이용해서 메일을 보내는 것이 전송이 제한이 되어 있기 때문이였습니다. 따라서 Ec2 환경에서 기본 port인 25를 사용하게 돼면 이메일 인증에 실패하게 됩니다. 이는 메일 보내기를 25번 포트가 아닌 다른 포트 465, 587 포트를 사용해..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bX7SwV/btryO4JqtxG/FF2e1wW0zXYimkgeeKfkl1/img.png)
상수 풀(String Pool)은 GC가 될까요? JVM 내부구조를 다시 보던 중에, 문득 "상수 풀은 GC가 될까?" 라는 생각이 떠올랐습니다. 자바에서 보통 static은 GC가 되지 않는데, 상수풀도 GC가 안되려나? 자바에서 보통 string 객체의 사용량이 가장 큰데 상수풀이 GC가 되지 않는다면 메모리에 큰 이슈가 발생하지 않을까? 큰 이슈가 발생할 수도 있으니, JVM에서 상수풀이 GC가 되도록 최적화하는 옵션을 설정해두지 않았을까? 하는 생각들을 했었습니다. https://www.baeldung.com/java-string-pool에서 답을 얻을 수 있었습니다. Before Java 7, the JVM placed the Java String Pool in the PermGen space,..