JVM JVM(Java Virtual Machine)은 자바 프로그램을 실행하기 위한 가상 머신(VM)입니다. JVM은 자바 프로그램을 컴파일된 바이트 코드 형태로 실행하고, 이를 하드웨어와 운영 체제에 맞게 해석하여 실행합니다. 이를 통해 자바 프로그램은 특정 플랫폼에 종속되지 않고 다양한 환경에서 실행될 수 있습니다. 바이트 코드 실행: JVM은 자바 컴파일러에 의해 생성된 바이트 코드를 실행합니다. 이 바이트 코드는 자바 소스 코드를 컴파일한 결과물로, 플랫폼 중립적이며 특정 운영 체제나 하드웨어에 종속되지 않습니다. 메모리 관리: JVM은 자바 프로그램이 사용하는 메모리를 관리합니다. 이는 객체의 생성 및 소멸, 가비지 컬렉션 등을 포함합니다. JVM은 힙(heap) 영역과 스택(stack) 영역..
Java에서 List.of와 Arrays.asList는 리스트를 생성하는 방법이지만 두 메서드의 차이점이 있다. 불변성 List.of: 생성된 리스트는 불변(immutable)하며, 요소를 추가, 제거 또는 변경할 수 없다. add, remove, set 등의 메서드를 사용할 수 없다. Arrays.asList: 생성된 리스트는 크기는 변경할 수 있지만, 요소를 추가하거나 제거하는 등의 변경 작업은 안된다. set은 가능하고, 변경은 원본 배열에 반영된다. List listOf = List.of("A", "B", "C"); try { listOf.add("D"); // UnsupportedOperationException 발생 } catch (UnsupportedOperationException e) {..
CPU 바운드 작업 CPU 바운드 작업은 주로 계산이 많이 필요한 작업으로, CPU의 처리 능력이 주요 병목 지점이 되는 상황입니다. 이러한 작업들은 주로 CPU 연산이 많이 필요하며, I/O 작업이 상대적으로 적은 경우입니다. CPU 바운드 작업에서는 CPU의 성능이 주요 제약 요소가 되므로, 다중 코어를 활용하여 병렬처리를 하는 것이 성능 향상에 도움이 될 수 있습니다. 계산적인 작업: 수학적 계산이 많이 필요한 작업은 CPU 바운드 작업에 해당합니다. 예를 들어, 대규모 행렬의 곱셈, 복잡한 수학적 함수의 계산 등이 여기에 속합니다. 이미지/비디오 처리: 이미지나 비디오 처리 작업 중에서 CPU를 많이 사용하는 작업은 CPU 바운드 작업에 해당할 수 있습니다. 예를 들어, 이미지 필터링, 변환, 비..
Enum 특징 JVM에서 인스턴스를 단 한 번만 생성하기 때문에 인스턴스의 제어가 용이 Enum 상수가 프로그램 내에서 오직 한 번만 생성되고, 그 이후에는 항상 동일한 인스턴스를 참조 JVM에서 스레드 안전(thread-safe)하게 초기화 자동으로 직렬화되며, 역직렬화될 때도 항상 동일한 인스턴스를 반환 Enum Singleton Pattern Enum의 특징을 활용해서 각 Enum 상수에 대해 특정 비즈니스 객체를 생성하도록 코드를 작성해서 싱글톤으로 생성된 비즈니스 객체를 재사용할 수 있도록 구현한다. 구현 객체 생성을 Enum에 위임해서 Client에서는 Interface를 통해서 사용할 수 있다. Calculator enum에 비즈니스 객체를 생성하는 요소 public enum Calculat..
함수 추출하기 '목적과 구현을 분리'하는 방식 함수의 목적이 눈에 확 들어오고, 본문 코드에 대해서는 더 이상 신경 쓸 일이 거의 없다. 함수를 짧으면 캐싱하기가 더 쉽기 때문에 컴파일러가 최적화하는 데 유리할 때가 많다. #AS-IS function printOwing(invoice) { printBanner(); let outstanding = calculateOutstanding(); console.log('고객명: ${invoice.customer}'); console.log('채무액: ${outstanding}'); } #TO-BE function printOwing(invoice) { printBanner(); let outstanding = calculateOutstanding(); prin..
리팩터링을 제대로 하려면 불가피하게 저지르는 실수를 잡아주는 견고한 Test suite가 뒷받침돼야 한다. 컴파일할 때마다 테스트를 함께하면 디버깅 시간이 크게 줄어든다. 테스트 스위트는 강력한 버그 검출 도구로, 버그를 찾는 데 걸리는 시간을 대폭 줄여준다. 테스트를 작성하기 가장 좋은 시점은 프로그래밍을 시작하기 전이다. 기능을 추가해야 할 때 테스트부터 작성한다. 원하는 기능을 추가하기 위해 무엇이 필요한지 고민하게 되고 구현보다 인터페이스에 집중하게 된다는 장점 TDD(Test Driven Development) 처음에는 통과하지 못할 테스트를 작성하고, 이 테스트를 통과하게끔 코드를 작성하고, 결과 코드를 최대한 깔끔하게 리팩터링하는 과정을 짧은 주기로 반복한다. 테스트-코딩-리팩터링 실패해야 ..
CloudWatch Logs의 로그그룹에 로그 데이터를 게시해서 실시간으로 로그를 확인할 수 있다. 로그 종류 별로 게시가 되는데 설정은 DB 파라미터 그룹에서 할 수 있다. 로그 요구 사항 감사 로그 DB 인스턴스는 MARIADB_AUDIT_PLUGIN 옵션과 함께 사용자 지정 옵션 그룹을 사용해야 합니다. 일반 로그 DB 인스턴스는 파라미터 설정 general_log = 1과 함께 사용자 지정 파라미터 그룹을 사용하여 일반 로그를 활성화해야 합니다. 느린 쿼리 로그 DB 인스턴스는 파라미터 설정 slow_query_log = 1과 함께 사용자 지정 파라미터 그룹을 사용하여 느린 쿼리 로그를 활성화해야 합니다. 로그 출력 DB 인스턴스는 파라미터 설정 log_output = FILE과 함께 사용자 지정..
언제 샤딩해야 하나 사용 가능한 메모리를 늘릴 때 사용 가능한 디스크 공간을 늘릴 때 서버의 부하를 줄일 때 한 개의 mongod가 다룰 수 있는 처리량보다 더 많이 데이터를 읽거나 쓸 때 서버 시작 구성 서버는 클러스터 구성을 저장하는 일반 mongod 서버 클러스터 구성은 샤드를 호스팅하는 복제 셋, 샤딩된 컬렉션, 각 청크가 위치한 샤드 등을 포함 구성 서버 구성 서버는 어떤 서버가 무슨 데이터를 갖고 있는지에 대한 모든 메타 데이터를 보유 mongos가 구성 서버로부터 구성을 가져오므로, 구성서버는 mongos 프로세스 앞서 시작해야함 3개의 개별 시스템에서 구성 서버 시작 --configsvr 옵션은 mongod를 구성 서버로 사용하겠다는 뜻 config 와 admin 이외의 데이터베이스에 데이..
MySQL에서 JSON 데이터에서 값을 추출하려면 JSON_EXTRACT() 함수를 사용 JSON_EXTRACT(json_column, path) json_column: JSON 데이터가 저장된 컬럼 path: 추출하려는 값의 경로 SELECT JSON_EXTRACT(json_column, '$.name') AS extracted_name FROM your_table; MySQL에서는 JSON 형식의 데이터를 VARCHAR 타입의 컬럼에 저장할 수 있습니다. JSON 데이터를 VARCHAR 컬럼에 저장하면 JSON 문자열이 그대로 저장되며, JSON 함수 및 연산을 사용하여 JSON 데이터를 다룰 수 있습니다. 주의할 점은 JSON 데이터의 크기가 VARCHAR의 최대 크기를 초과하지 않도록 해야 합니다..
리팩터링 정의 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 기법 여러가지 리팩터링 기법을 적용해서 소프트웨어를 재구성한다. 리팩터링하는 동안에는 코드가 항상 정상 작동하기 때문에 전체 작업이 끝나지 않아도 언제든 멈출 수 있다 누군가 "리팩터링하다가 코드가 깨져서 며칠이나 고생했다"라고 한다면, 리팩터링한 것이 아니다 두개의 모자 소프트웨어를 개발할 때 목적이 '기능 추가'냐, 아니면 '리팩터링' 이냐를 명확히 구분해 작업 기능을 추가할 때는 '기능 추가' 모자를 쓴 다음 기존 코드는 절대 건드리지 않고 새 기능을 추가하기만 한다. 리팩터링할 때는 '리팩터링' 모자를 쓴 다음 기능 추가는 절대 하지 않기로 다짐한 뒤 오로지 코드 재구성에만 전념한다...