💻 개발209 동시성 프로그래밍 - 심화 Java의 동시성에 대해서 좀 더 알아보자. | 여러 스레드가 모두 한 CPU의 캐시 메모리를 읽으면? 여러 스레드가 모두 한 CPU의 캐시 메모리를 읽으면 *가시성 문제가 해결될까? 모든 스레드가 동일한 CPU 캐시를 참조한다면 데이터가 항상 동기화 상태를 유지할 것이므로 가시성 문제는 발생하지 않는다. 하지만, 실제 시스템에서는 멀티코어 CPU 환경에서 각 코어가 자신의 L1/L2 캐시를 독립적으로 관리한다.ex. 스레드 A는 CPU1의 캐시에서 작업하고, 스레드 B는 CPU2의 캐시에서 작업하는 경우, 두 캐시간의 데이터 동기화가 이루어지지 않으면 가시성 문제가 발생한다. 이에 대한 해결 방법은 Java에서 volatile 키워드와 같은 동기화 메커니즘을 통해 변수의 변경사항을 즉시 다른 스레드.. 2024. 12. 19. 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. 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. 12/2 - TIL : Fallback Resilience은 시스템이 예기치 않은 장애, 오류, 네트워크 문제 등의 상황에서 안정적으로 작동하거나 복구할 수 있는 능력이다. Resilience design pattern 중 하나로 Fallback이 있다. Fallback은 시스템에서 오류 상황이나 예외적인 상태를 처리하기 위해 준비된 대체 동작이다. 시스템의 안정성과 신뢰성을 보장하기 위해 자주 사용되며, 특히 마이크로 서비스 아키텍처나 분산 시스템에서 중요한 역할을 한다. 시스템 안정성 확보: 다른 서비스나 시스템으로 장애가 전파되지 않도록 방지한다. 사용자 경험 개선: 오류를 숨기고 사용자에게 유용한 대안을 제공한다. Fallback은 다양한 시나리오에서 활용될 수 있다:외부 API 호출 실패: 외부 시스템이 응답하지 않을 경우, 캐.. 2024. 12. 2. Java 모의 면접 후기 Java에 대한 공부와 동시에 모의면접을 하면 좋겠다라는 생각을 했었다. 그때, 우연히 JSCODE 모의면접이라는 것을 알게되었다. 올해 6월, 7월에 걸쳐서 기업 면접을 봤던 경험이 있었지만, 감이 조금 흐려진 것 같아 면접 경험을 되살리고 Java 공부도 함께 할 수 있을 것 같아 신청하게 되었다. 매주 모의면접 질문에 답변을 준비하며, 단순히 답변을 작성하는 데 그치지 않고 Java를 깊이있게 공부하는 것을 기본으로 삼고, 그 위에 면접 답변을 쌓아 올리는 것을 목표로 했다. 따라서, 매주 나오는 면접 질문들에 대해 질문들의 흐름을 파악하려고 했었다. 왜 이 질문이 나오게 되었고, 어떤 질문과 연관이 되어있을까? 를 항상 의식하면서 공부를 했었던 것 같다. 이런 방식으로 공부를 해보니, 매주 .. 2024. 12. 1. 12/1 - TIL : 모듈이란? 공부를 하던 도중 모듈이라는 용어가 나와 궁금했다. 모듈에 대해 알아보자. | 모듈(Module)모듈은 프로그래밍에서 코드의 재사용성과 관리 효율성을 높이기 위해 논리적으로 관련된 코드들을 하나의 단위로 묶은 것을 말한다. 프로그램을 구성하는 시스템을 기능 단위로 독립적인 부분으로 분리한 것이기 때문에 하나 이상의 논리적인 기능을 수행하기 위한 명령어의 집합이다. 모듈은 독립적인 프로그램 그 자체일 수 있고, 함수나 메서드일 수도 있다. 모듈의 특징은 다음과 같다. 독립적인 기능 : 모듈은 다른 것들과 구분되는 명확하고 독립적인 역할이나 기능을 가져야 한다. 고유한 이름 : 모듈은 고유한 이름을 가져야 하며, 다른 모듈과 충돌하지 않도록 네이밍이 중요하다. 호출 가능성 : 모듈은 다른 프로그램이나 .. 2024. 12. 1. 이전 1 2 3 4 ··· 18 다음