꾸준히 나아가는 개발자가 되자
-
[Chapter 2] 왜 서버가 느리지? (1)
서버에서 볼 수 있는 대부분의 문제는 네트워킹에서 비롯되어 발생한다. 하지만, 어떤 문제는 여전히 로컬호스트와 관련이 있다. 이 장에서는 호스트에서 발생하는 문제를 다뤄보자. | 응답이 느려질 때 호스트에서 찾을 수 있는 가장 흔한 문제는 응답이 느려지는 증상이다. 과부하가 걸린 네트워크와 과부하가 걸린 로컬호스트 장비의 차이점을 파악할 수 있어야 한다. 종종, 시스템이 느려질 때는 시스템의 특정 자원을 모두 소비했기 때문일 수도 있다. 시스템의 주요 자원은 CPU, RAM, 디스크 I/O 그리고 네트워크이다. 이러한 리소스를 남용하면, 최후의 수단인 재부팅이 빈번하게 일어날 수 있다. | 시스템 부하시스템의 평균 부하는 느려진 시스템의 문제를 해결하기 위해 기초적인 지표가 된다. | uptime..
2024.12.23
-
동시성 프로그래밍 - 심화
Java의 동시성에 대해서 좀 더 알아보자. | 여러 스레드가 모두 한 CPU의 캐시 메모리를 읽으면? 여러 스레드가 모두 한 CPU의 캐시 메모리를 읽으면 *가시성 문제가 해결될까? 모든 스레드가 동일한 CPU 캐시를 참조한다면 데이터가 항상 동기화 상태를 유지할 것이므로 가시성 문제는 발생하지 않는다. 하지만, 실제 시스템에서는 멀티코어 CPU 환경에서 각 코어가 자신의 L1/L2 캐시를 독립적으로 관리한다.ex. 스레드 A는 CPU1의 캐시에서 작업하고, 스레드 B는 CPU2의 캐시에서 작업하는 경우, 두 캐시간의 데이터 동기화가 이루어지지 않으면 가시성 문제가 발생한다. 이에 대한 해결 방법은 Java에서 volatile 키워드와 같은 동기화 메커니즘을 통해 변수의 변경사항을 즉시 다른 스레드..
2024.12.19
-
12/18 - TIL : Driving, Driven
Driving과 Driven은 일반적으로 주도하는 역할과 주도 당하는 역할을 의미한다. 기술적인 맥락에서 보면 다음과 같다. Driving : 시스템 또는 구조에서 주요 동작을 결정하거나 제어하는 주체를 의미한다. ex. 절차적 프로그래밍이나 명령형 프로그래밍에서 개발자가 프로그램의 흐름을 직접 제어(if - else 문 등을 사용하여 프로그램의 흐름을 직접 설계)하며 드라이빙 역할을 수행Driven : 시스템에서 외부 입력이나 특정 조건에 의해 동작하는 대상을 의미한다. ex. Event-Driven Architecture : 특정 이벤트가 발생하면 동작을 수행하는 시스템, 외부 요청에 의해 실행되는 구조로 드리븐 상태이다. Database의 드라이빙과 드리븐은 무엇일까? | Join 에서의 Dri..
2024.12.18
-
12/16 - TIL : - 쓰레드 무한정 개수 늘린다면?
쓰레드를 많이 쓸수록 항상 애플리케이션의 성능이 좋아질까? 멀티스레딩의 성능은 애플리케이션의 특성에 따라 달라진다.전제 1: 애플리케이션이 더 작은 작업들로 나눠져 동시에 실행 가능한 경우.전제 2: 애플리케이션이 순차적으로 실행되어야 하거나 동시에 실행하기 어려운 성격이라면, 스레드 수를 늘려도 효과가 제한적이다. | 스레드와 컨텍스트 스위칭 컨텍스트 스위칭 CPU 코어에서 실행되던 스레드가 다른 스레드로 바뀌는 작업스위칭 작업은 애플리케이션 동작과 직접적인 관련은 없지만, 멀티스레딩을 위해 필요한 오버헤드(간접 비용)이다.스레드 수와 컨텍스트 스위칭스레드 수 증가 → CPU 코어당 경합 증가경합이 많아질수록 컨텍스트 스위칭 비용이 커지며 성능 저하 발생.결과적으로, 스레드 수를 무한정 늘려도 어느..
2024.12.16
-
12/13 - TIL : Checked Exception, Unchecked Exception
| Checked ExceptionRuntimeException의 하위 클래스가 아니면서 Exception 클래스의 하위 클래스들이다. 체크 예외의 특징은 반드시 에러 처리를 해야하는 특징(try/catch or throw)을 가지고 있다. 컴파일 타임에 체크됩니다. 따라서 컴파일러는 예외 처리 여부를 확인하며, 처리하지 않을 경우 컴파일 오류가 발생한다. 예시 IOException: 파일 입출력 처리 중 발생SQLException: 데이터베이스 접근 중 발생ClassNotFoundException: 클래스 로드 실패 시 발생 | Unchecked ExceptionRuntimeException의 하위 클래스들을 의미합니다. 이것은 체크 예외와는 달리 에러 처리를 강제하지 않는다. (개발자가 필요에..
2024.12.13
-
12/12 - TIL : 로깅 레벨
로깅 레벨(logging level)은 애플리케이션의 로그 메시지를 분류하는 기준으로, 로그 메시지의 중요도와 긴급성을 나타낸다.로깅 레벨을 통해 특정 상황에서 어떤 로그 메시지를 기록하거나 출력할지를 결정할 수 있으며, 로그 메시지를 중요도에 따라 분류하여 특정 상황에서 어떤 로그를 기록할지 결정하는 기준이기도 하다. | Trace 가장 상세한 로그 레벨로, 디버깅보다 더 많은 정보를 포함하며, 프로그램의 모든 동작을 추적하는 데 사용한다. 주로 개발 중 복잡한 문제를 디버깅하거나 코드 실행 흐름을 자세히 추적할 때 사용된다. | Debug 디버깅 정보를 기록하는 레벨로, 개발 중 코드의 문제를 찾기 위해 사용한다. 특정 모듈이나 기능이 제대로 작동하는지 확인할 때 적합하다. | Info 애플리케..
2024.12.12
-
12/11 - TIL : Validation
| Spring Boot의 Validation Spring Boot에서 Validation은 사용자의 입력 데이터를 검증하는 역할을 한다.이를 위해 컨트롤러에서 @Valid와 @Validated 어노테이션을 사용할 수 있다.두 어노테이션은 비슷해 보이지만, 사용하는 방식과 특징에서 차이가 있다. | @Valid DTO 클래스의 필드에 설정된 제약 조건(예: @NotNull, @Size, @Email 등)을 검증한다. Spring이 아닌 Java 표준으로 제공되므로 프레임워크에 종속적이지 않다.그룹 검증(group validation)을 지원하지 않는다.예외 처리 시 : MethodArgumentNotValidException 발생. | @ValidatedSpring Framework에서 제공하는 어노..
2024.12.11
-
동시성 프로그래밍 - 기초
Java에서 마주할 수 있는 동시성에 대해서 알아보자. | 동시성 vs 병렬성 동시성과 병렬성은 자주 비교된다. 동시성(Concurrency) : 하나의 CPU가 여러 작업을 빠르게 번갈아 수행함으로써, 사람이 보기에는 여러 작업이 동시에 진행되는 것처럼 보이는 상태이다. 1개의 CPU에서 작업을 나눠 실행하고, 스케줄러가 각 작업의 실행시간을 조율한다. 한 번에 한 작업만 실행되지만, 작업 간의 전환이 매우 빠르게 이루어진다. 병렬성(Parallelism) : 여러 CPU가 각각 독립적으로 여러 작업을 동시에 처리하는 상태이다. CPU N개가 N개의 작업을 동시에 처리한다.멀티 코어 프로세서에서 여러 스레드가 동시에 실행된다. 지난번에, ArrayList와 Vector를 비교할 때, Thread-S..
2024.12.10
-
12/9 - TIL : DDD 란?
DDD는 Domain-Driven Design이다. | DomainDomain이 무엇일까? DDD의 Domain은 비즈니스 Domain이다. 비즈니스 Domain은 유사한 작업 그룹이다. ex. 주문 도메인 : 주문 생성, 주문 취소, 주문 상태 확인, ... 등 애플리케이션은 비즈니스 Domain 별로 나누어 개발될 수 있다. Domain은 애플리케이션이 해결하려고 하는 문제 영역을 의미하기 때문이다. | DDD 따라서, DDD는 비즈니스 Domain 별로 나누어 설계하는 방식이다. DDD의 핵심은 결합도를 낮추고, 응집도를 높이는 것이다. (객체 지향의 핵심 목표와 일치하는 것을 알 수 있다.) DDD의 핵심 설계 원칙은 다음과 같다. 도메인을 중심으로 설계 : 도메인 문제 해결에 초점이 있다..
2024.12.09
-
Dijkstra와 A* 알고리즘
최단 경로를 탐색하는 알고리즘 중 Dijkstra와 A* 알고리즘에 대해 간단하게 알아보자. 두 알고리즘의 차이는 다음과 같다. Dijkstra : 시작점으로부터 나머지 정점들까지의 최단 거리를 구한다. A* : 시작점이 정해지고, 목표점이 정해지면 2개의 최단 거리를 구한다. | Dijkstra 시작 정점에서 모든 정점까지의 최단 경로를 구하는 알고리즘이다. 탐욕적 탐색(Greedy)을 사용하며, 방문하지 않은 정점 중 최단 거리를 가진 정점을 선택한다. 각 경로의 비용만 고려하며, 목표 노드에 도달하는 방향성을 가지지 않는다. 동작 방식 시작 정점의 거리를 0으로 초기화하고, 나머지 정점의 거리는 무한대로 설정현재 정점에서 갈 수 있는 모든 인접 정점의 거리 값을 업데이트업데이트 후, 방문하지..
2024.12.06