본문 바로가기

전체 글

(24)
[Network] HTTS 통신 과정 파헤치기(1) - TLS/SSL 이번 글에서는 TLS/SSL handshake에 대해 정리해보겠습니다. intro 본격적인 설명에 앞서서 이번 글을 정리하는 배경을 간단하게 설명해볼까 합니다. 저희 회사에서 운영하는 서비스 중 정말 오래된 몇몇 레거시 서비스에서 3DES 알고리즘 등과 같은 몇가지 보안 취약점이 발견되었습니다. 이번 글은 위의 보안 취약점을 비활성화하는 과정을 공유드릴까 합니다. HTTPS와 TLS/SSL 본격적으로 문제 해결 과정을 설명하기 전에 글을 이해하기 위한 기초지식을 최대한 간략하게 살펴보겠습니다. HTTPS는 HyperText Tranfer Protocol over Secure socket layer의 약어로, 직역하자면 Secure socket layer 위에서 동작하는 HTTP 프로토콜을 의미합니다. 그..
Sync, Async & Blocking, Non-Blocking 파헤치기 저를 포함한 많은 분들이 blocking과 synchronous, non-blocking과 asynchronous의 차이점을 명확하게 알지 못하는 것 같아, 이번 글에서는 위 개념들에 대해 공부하면서 이해한 것들을 공유해보려고 합니다. (혹시나 잘못 설명하고 있는 점이 있다면 언제든 댓글 달아주세요.) 결론부터 말씀드리면, 두 개념(Blocking & Non-Blocking / Synchronous & Asynchronous)는 각각 제어권과 결과값을 초점으로 두고있습니다. 글만으로는 이해가 안될 것 같아 예제 코드를 가져와봤습니다. 예제 코드는 이름과 나이로 player를 찾고, (중복은 없다고 가정하겠습니다.) 해당 player가 성인이라면 player를 return하는 간단한 코드입니다. Block..
Parallelism(병렬성)과 Concurrency(동시성) 이번 글에서 parallelism과 concurrency에 대해 정리해보겠습니다. 먼저 각각의 개념의 정의는 다음과 같습니다. 병렬 컴퓨팅(parallel computing) 또는 병렬 연산은 동시에 많은 계산을 하는 연산의 한 방법이다. 병행성(concurrency)은 컴퓨터 과학에서 여러 계산을 동시에 수행하는 시스템의 특성 뭔가 차이는 있어보이지만 직관적이지는 않은 것 같습니다. 조금 더 명확하게 차이를 설명하기 위해 그림을 하나 가져왔습니다. 위 예시에서 우리는 두 가지 작업(task)을 수행합니다. 각각의 작업은 3 단계의 연산으로 이뤄져있습니다. concurrency에서는 하나의 core에서 작업의 관점에서는 두 작업을 동시에 수행하지만 연산의 관점에서는 두 연산을 번갈아 수행하는 것을 알 수..
[tomcat] catalina.out 관련 디스크 사용량 문제 해결 이번 글에서는 catalina.out과 관련하여 겪었던 문제와 이를 해결했던 과정에 대해 정리해보려고 합니다. Unix 기반의 OS에서는 tomcat의 console output은 catalina.out으로 redirect되어 있습니다. 때문에 시간이 지나면 catalina.out의 사이즈가 커지게 되고 서버의 디스크 정리를 위해 해당 파일을 삭제하였습니다. 문제는 위 파일을 삭제했는데도 불구하고, 디스크 사용량이 줄어들지 않았다는 것입니다. 저희 회사에서는 디스크 사용량에 따라 알람을 전송하기 때문에 계속적으로 알람이 발생하고 있었습니다. 위 문제가 발생한 원인을 설명하기 앞서, 먼저 Unix계열에서 파일을 관리하는 방법에 대해 간략하게 알아보겠습니다. Unix계열의 File system Unix 계열..
[Java] Stream 파헤치기(1) - Stream을 사용해야하는 이유 이번 글에서는 Java 8에서 소개된 Stream에 대해 정리해보겠습니다. Stream은 다음과 같은 불편함을 해결하기 위해 만들어졌습니다. Collection을 사용하는 코드를 반복적으로 구현 병렬적으로 Collection을 처리하기 어려움 Collection을 사용하는 코드를 반복적으로 구현 해당 내용을 설명하기 위해 간단한 쿼리문을 가져와봤습니다. SELECT id FROM transactions WHERE type = 'GROCERY' ORDER BY value DESC; 해당 쿼리문은 특정 type을 갖는 row들에 대해 높은 value를 갖는 순서대로 id를 조회하는 쿼리입니다. 우리는 위와 같은 쿼리문을 사용할 때, 해당 과정에 대한 깊은 이해 없이도 쉽게 사용할 수 있습니다. 위와 동일하게..
[MSSQL] DECIMAL 사칙연산 파헤치기 이번 글에서는 DECIMAL 타입에서 사칙연산이 동작하는 방식에 대해서 정리해보겠습니다. DECIMAL 연산에 대한 설명에 앞서서 간단하게 DECIMAL이라는 타입에 대해 알아보겠습니다. DECIMAL은 Precision과 Scale로 정의되어 있습니다. Precision은 전체 자릿수, Scale은 .(점) 오른쪽에 오는, 소수 자릿수를 의미합니다. SELECT CAST(1.0005 as DECIMAL(4, 3)) 위 예시에서는 그림과 같이 precision과 scale을 표시할 수 있고 scale의 범위를 넘은 소수점의 값(5)은 반올림 하여 위 query의 결과는 1.001이 됩니다. (정수가 자릿수를 초과할 경우에는 overflow error가 발생합니다.) Calculation 그럼 DECIMA..
[Spring Boot] Custom Constraint / Validation 파헤치기 이번 글에서는 Spring Boot에서 validation이 동작하는 원리를 간단하게 살펴보고 직접 validator를 정의하는 방법을 정리해보겠습니다. 참고로, validation에 대한 설명을 따로 하지는 않기 때문에 validation이 무엇인지 궁금하신 분들은 다음 글을 참고해 주시면 될 것 같습니다. ( Validation 어디까지 해봤니? : TOAST Meetup ) 또한, 예제들은 다음과 같은 환경에서 작성되었습니다. Spring Boot 2.3.3 hibernate validator 6.1.5.Final ('spring-boot-starter-validation' dependency에 포함되어 있습니다.) JUnit 5 우선 validation을 수행하기 위해 간단한 핸들러 메소드와 DT..
[Spring Boot]HikariCP 모니터링 - InstanceAlreadyExistsException 해결 지난 글에서는 MBean을 이용해 HikariCP의 상태를 모니터링하는 방법에 대해 다뤄봤습니다. ( [Spring Boot]HikariCP 모니터링 ) 하지만 회사에서 서비스 중인 프로젝트에 적용하려고 하니 다음과 같은 문제가 발생하였습니다. 내용을 살펴보니 MXBean이 이미 등록되었다고 합니다. 본격적으로 원인을 알아보기 전에 코드를 살펴보겠습니다. Configuration //DatasourceConfig.java @Bean public HikariPoolMXBean poolProxy() throws MalformedObjectNameException { MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); ObjectName..