분류 전체보기254 [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. 9. Dijkstra와 A* 알고리즘 최단 경로를 탐색하는 알고리즘 중 Dijkstra와 A* 알고리즘에 대해 간단하게 알아보자. 두 알고리즘의 차이는 다음과 같다. Dijkstra : 시작점으로부터 나머지 정점들까지의 최단 거리를 구한다. A* : 시작점이 정해지고, 목표점이 정해지면 2개의 최단 거리를 구한다. | Dijkstra 시작 정점에서 모든 정점까지의 최단 경로를 구하는 알고리즘이다. 탐욕적 탐색(Greedy)을 사용하며, 방문하지 않은 정점 중 최단 거리를 가진 정점을 선택한다. 각 경로의 비용만 고려하며, 목표 노드에 도달하는 방향성을 가지지 않는다. 동작 방식 시작 정점의 거리를 0으로 초기화하고, 나머지 정점의 거리는 무한대로 설정현재 정점에서 갈 수 있는 모든 인접 정점의 거리 값을 업데이트업데이트 후, 방문하지.. 2024. 12. 6. JCF와 스레드 - JCF 심화 및 스레드 지난번에 JCF에 대해 간단하게 알아보았다. 이번에는 JCF를 좀 더 자세히 알아보고, 스레드에 대해서도 알아보자. | Map과 Collection JCF의 계층 구조를 보면, JCF에서 Collection과 Map으로 나뉘어진 것을 볼 수 있다. 그리고 다른 자료 구조들은 Collection을 상속하고 있는데, Map만 Collection을 상속 받지 않는 것을 알 수 있다. 왜 그럴까? Java에서 Map이 Collection 인터페이스를 상속 받지 않은 이유는, 두 인터페이스가 서로 다른 데이터 구조와 사용 목적을 표현하기 때문이다. Collection은 요소들의 집합으로, 단일한 요소를 다룬다. (Collection 인터페이스는 요소라는 개념을 전제로 설계 했다.)개별 객체를 추가하거나 삭.. 2024. 12. 5. JCF와 스레드 - JCF 기초 Java를 통해 개발을 하다 보면 반드시 한 번쯤은 사용하게 될 라이브러리가 있다. ArratList, HashSet, ... 등이 있는데, 이들은 JCF라고 부르는 Java에서 제공하는 데이터 구조와 알고리즘의 표준 라이브러리이다. JCF에 대해 자세히 알아보자. | JCF(Java Collection Framework) 란? Java에서 제공하는 데이터 구조와 알고리즘의 표준 라이브러리 데이터 저장, 검색, 정렬, 조작 등의 작업을 효율적으로 수행할 수 있도록 설계된 컬렉션 클래스와 인터페이스의 집합 JCF는 크게 Collection 인터페이스와 Map 인터페이스로 나뉜다. Map 인터페이스 컬렉션들은 2개의 데이터를 묶어 한쌍으로 다루기 때문에 Collection 인터페이스와 따로 분리되어 있.. 2024. 12. 4. 이전 1 2 3 4 ··· 22 다음