전체 글 33

리눅스 진단 명령어

리눅스 진단 명령어개발을 하다 보면 OS 상황을 모니터 해야 할 경우도 있다. 시스템 장애가 애플리케이션에만 있는 것이 아니기 때문이다. 리눅스 진단에 사용할 수 있는 명령어를 알아보고 OS 상황을 모니터링할 때 활용해 보자. 위에는 Brendan Gregg의 블로그에서 가져온 리눅스 분석 도구 표이다. 중요한 분석 도구부터 차례대로 알아보도록 하겠다.CPU 모니터링CPU를 모니터링할 때 mpstat을 사용한다. mpstat이란 사용 가능한 CPU 사용 상황을 제공한다. 데이터 출력 간격과 수행 횟수를 지정할 수 있다.mpstat 5 3명령어 [데이터 출력 간격] [데이터 수행 횟수] 순으로 지정해야 한다. 출력된 결과는 다음과 같다. 사진 속 결과 의미는 다음과 같다.%usr : 애플리케이션에서 수행되..

Java 2025.06.17

Java 메모리 진단

Java는 Garbage Collector(GC)가 알아서 사용하지 않는 객체를 메모리에서 제거한다. 그래서 메모리 릭 현상이 간간히 발생하고, 원인을 잡기 쉽지 않다. 메모리 릭이 발생하면 원인을 어떻게 찾아야 하는지 알아보겠다.Java 메모리 영역자바의 메모리 영역은 다음과 같다.PC 레지스터 : 스레드의 JVM인스트럭션 주소가 저장되어 있다. 스레드별 각각 보유한다.JVM 스택 : 지역 변수와 부분 결과를 저장한다. 메서드 호출 및 리턴 정보 보관된다. 스레드별 각각 보유한다.힙 : 인스턴스와 배열이 할당된다. GC에 의해 관리된다.메서드 영역 : 모든 JVM 스레드 공유하며, 클래스 구조 정보 저장한다.런타임 상수 풀 : 클래스 및 인터페이스에 대한 constant_pool 테이블을 실행 시 참고..

Java 2025.06.11

[자바 트러블 슈팅] 스레드 진단

Java 프로세스에서 스레드 단면을 분석하고 문제를 해결하는 방법을 알아보자.스레드에서 발생할 수 있는 문제스레드를 처리할 때 발생할 수 있는 문제는 다음과 같다. 1. 레이스 컨디션멀티 스레드 환경에서 ‘공유 데이터’에 아무런 록 처리를 하지 않을 경우 문제 발생여러 스레드에서 동시에 수정 시 공유 데이터 꼬여서 무한 대기 or 무한 루프 2. 데드록두 개 이상의 스레드에서 서로의 록이 풀리기 기다리는 상황4가지 조건이 필요[비선점, 상호배제, 점유와 대기, 순환 참조]예시) 스레드 A에서 Data1에 록을 건 상태에서 Data2에 접근하려 한다. 스레드 B에서 Data2에 록을 건 상태에서 Data1에 접근하려 한다. 3. 스타베이션스레드가 CPU로부터 일할 기회를 받지 못하는 경우 4. 라이브 록응..

Java 2025.05.26

인덱스 스캔 효율화

인덱스 스캔 효율화 과정인덱스 스캔 효율성은 인덱스 칼럼을 등치(=) 조건으로 사용할 때 가장 좋다. 만약 인덱스 칼럼 중 일부가 등치 조건이 아니더라도 그 칼럼이 뒤쪽 칼럼일 경우에는 비효율이 없다. 왜 그런지 내가 실제 업무에서 인덱스 스캔 효율화를 한 과정을 통해 살펴보도록 하겠다.로그 테이블 인덱스 개선 과정팀에서 새로운 로그 테이블을 만들었고, 그 로그 테이블에서 PK 인덱스만 있었다. PK 인덱스는 다음과 같이 설정되었다...., LOG_DT(로그 날짜), LOG_HMS(로그 시간), ... 로그 테이블에서 주로 사용되는 쿼리를 알아보니 처리일자를 등치 조건(=), 처리시간을 BETWEEN 조건으로 사용하고 있었다. 또한 PK에 없는 GUID라는 필드는 IN 조건으로 활용되고 있었다. se..

데이터베이스 2025.04.21

리팩터링

리팩터링https://product.kyobobook.co.kr/detail/S000001810241 리팩터링 | 마틴 파울러 - 교보문고리팩터링 | 개발자가 선택한 프로그램 가치를 높이는 최고의 코드 관리 기술 마틴 파울러의 『리팩터링』이 새롭게 돌아왔다.지난 20년간 전 세계 프로그래머에게 리팩터링의 교본이었던 이 책product.kyobobook.co.kr마틴 파울러의 리팩터링 2판을 읽어보았다. 책 1장은 리팩터링 예시를 설명하고 있다. 2장은 리팩터링이 무엇인지 왜 해야 하는지를 설명하고 있다. 3장은 리팩터링이 필요한 코드 스멜 부분을 설명하고 있으며 4장은 리팩터링에 필요한 테스트를 설명하고 있다. 나머지 부분은 리팩터링 기법을 설명한 카탈로그이다. 책의 저자도 카탈로그는 필요할 때마다 찾아..

카테고리 없음 2025.04.11

[객체지향 프로그래밍] 블랙잭 카드 구현

블랙잭 게임 만들기https://okky.kr/questions/358197 초보 개발자에게 권장하는 객체지향 모델링 공부 방법 | OKKY Q&A원래 다른 글타래의 답글로 적던 내용인데 다른 분들에게도 혹시 도움이 될까 싶어서 별도 글타래로 옮깁니다. 따라서 다소 맥락이 어색한 부분이 있는 점 양해부탁 드립니다. 아마도 '객체지향okky.kr위 글을 읽고 객체지향 프로그래밍 연습을 위해 블랙잭 게임을 만들어보게 되었습니다. 챗 지피티에게 블랙잭 룰을 물어보았고, 다음과 같이 정리했습니다.Blackjack Game1️⃣ 게임 기본 요구사항✅ 카드 관련- 카드 덱(Deck)은 52장의 카드(4개의 문양 × 13개의 값)로 구성된다.- 카드는 랜덤하게 섞인 상태에서 게임이 시작될 때 사용된다.- 각 카드는 ..

카테고리 없음 2025.03.09

소프트웨어 테스트 원칙

소프트웨어 테스트 원칙단위 테스트단위 테스트 : 코드의 개별 구성 요소(주로 메서드나 함수)가 올바르게 동작하는지 검증하는 테스트 단위 테스트 특집독립적: 단위 테스트는 가능한 한 외부 종속성이나 환경의 영향을 받지 않고 개별 단위의 동작만을 검증작은 범위: 단위 테스트는 함수, 메서드 또는 클래스와 같은 작은 단위를 테스트자동화 가능: JUnit같은 테스트 프레임워크를 사용하여 자동화public class Calculator { public int add(int a, int b) { return a + b; }}public class CalculatorTest { @Test void testAdd() { Calculator calculator = new C..

Test 2024.11.10

[헤드퍼스트 디자인패턴] 프록시 패턴

프록시 패턴을 알아보자.프록시 패턴프록시 패턴특정 객체로의 접근을 제어하는 대리인(특정 객체를 대변하는 객체)을 제공한다. 프록시 패턴은 실제 객체에 대한 접근을 제어하고, 추가적인 기능(로깅, 캐싱, 접근 제어 등)을 제공할 때 유용하다. 프록시 패턴 개념과 목적프록시 패턴은 실제 객체와 그 객체의 대리자 역할을 하는 객체(프록시 객체) 사이에 인터페이스를 정의하여, 클라이언트가 직접 실제 객체에 접근하지 않고, 프록시 객체를 통해 접근하도록 만든다. 프록시 객체는 클라이언트의 요청을 실제 객체로 전달하고, 그 결과를 클라이언트에게 반환하는 역할을 한다. 프록시 패턴의 주요 목적은 다음과 같다.접근 제어: 클라이언트가 실제 객체에 접근하기 전에 특정 조건을 확인하거나, 특정 사용자의 접근을 제한할 수 ..

디자인패턴 2024.08.30

[헤드퍼스트 디자인패턴] 상태 패턴

상태 패턴을 알아보자. 상태 패턴상태패턴내부 상태가 바뀜에 따라 객체의 행동이 바뀔 수 있도록 해준다. 마치 객체의 클래스가 바뀌는 것 같은 결과를 얻을 수 있다. 요구사항뽑기 기계가 있다고 가정해 보자. 뽑기 기계에는 '동전이 없는 상태(초기 상태)', '동전이 있는 상태', '뽑기가 나온 상태', '뽑기가 매진된 상태'가 있을 것이다. 또한 '동전 투입', 동전 반환', '손잡이 돌림', '알맹이 내보냄'과 같이 4가지 상태를 바꾸는 행동도 있다. 이것을 프로그래밍으로 어떻게 구현해야 할까? 다음과 같이 현재 상태를 저장하는 인스턴스 변수를 만들고 각 상태의 값을 정의한다고 가정해 보자. // 뽑기 매진 상태 final static int SOLD_OUT = 0; // 동전이 없는 상태 ..

디자인패턴 2024.08.27

[헤드퍼스트 디자인패턴] 반복자 패턴과 컴포지트 패턴

반복자 패턴과 컴포지트 패턴을 알아보자. 반복자 패턴과 컴포지트 패턴반복자 패턴컬렉션의 구현 방법을 노출하지 않으면서 집합체 내의 모든 항목에 접근하는 방법을 제공한다. 컴포지트 패턴객체를 트리구조로 구성해서 부분-전체 계층구조를 구현한다. 컴포지트 패턴을 사용하면 클라이언트에서 개별 객체와 복합 객체를 똑같은 방법으로 다룰 수 있다. H3 중제목배열, 리스트, 맵 자료구조를 각각 3개의 클래스에서 저장한다고 가정해 보자. Client라는 객체에서 배열, 리스트, 맵 3개를 모두 조회하려면 3개의 자료구조 형태에 맞춰 코드로 구현해야 할 것이다. Client가 배열, 리스트, 맵 등의 자료구조를 직접 조회해야 한다면, 클라이언트 코드에서 각각의 자료구조에 대해 다른 방식으로 요소에 접근해야 한다. 이는 ..

디자인패턴 2024.08.23