JAVA 48

외부 연동 방식 변경과 어댑터 패턴 적용

외부 연동 방식 변경과 어댑터 패턴 적용최근 회사에서 외부 시스템과의 연동 방식이 변경되었다.기존에는 DB를 직접 조회해서 데이터를 받아오는 방식이었지만, 변경 이후에는 REST API를 통해 외부 데이터를 호출하도록 요구사항이 바뀌었다.이런 구조 변경은 일반적으로 기존 코드에 많은 영향을 줄 수 있다.하지만 나는 이 상황에서 기존 비즈니스 로직을 전혀 수정하지 않고도 외부 연동 방식만 바꿔치기할 수 있도록 어댑터 패턴(Adapter Pattern) 을 적용해보았다.어댑터 패턴이란?어댑터 패턴은 호환되지 않는 인터페이스를 가진 클래스를 함께 동작하게 해주는 구조 패턴이다. 기존 인터페이스를 클라이언트가 기대하는 형태로 변환해줌으로써, 서로 다른 클래스들이 함께 동작할 수 있도록 도와준다.실생활 예를 들면..

JAVA 2025.08.03

5-1 단일 책임 원칙

https://newfangled.tistory.com/164 값 객체(Value Object)를 사용해야 할 때 – Game 클래스 리팩터링 예시작은 클래스, 단순한 구조, 더 명확한 의도 표현들어가며작고 단순한 클래스를 만들기 위해 값 객체(Value Object) 를 활용할 수 있다.이번 글에서는 "게임 매출 관리 애플리케이션" 을 예시로,값 객newfangled.tistory.com 클래스를 분리하는 두 가지 방법이 있다.값 객체 (지난 포스팅 참고)단일 책임 원칙단일 책임 원칙을 사용해 클래스를 분리해보자. 예제 - 반복 일정 관리반복적인 일정을 관리하는 애플리케이션한달에 한번씩 반복되는 일정을 등록할 수 있다. 예를 들어, 월간 회의를 매달 두 번째 주 월요일 오후 2시부터 1시간까지 반복일..

JAVA 2025.05.29

동시성 문제와 해결 방안

자바에서의 동시성 문제란?자바에서 동시성 문제는 여러 스레드가 동시에 공유 자원에 접근 할 때 발생할 수 있는 문제.Race Condition : 둘 이상의 접근 흐름이 동시에 자원에 같은 자원에 접근해서, 실행 순서에 따라 결과가 달라지는 문제Deadlock: 여러 스레드가 서로 자원을 기다리며 영원히 대기 상태에 빠지는 문제  동기화(Synchronization)란? 여러 프로세스나 스레드가 공유자원에 동시에 접근하는 것을 제어하여, 데이터의 일관성과 무결성을 보장하는 기법 동시성을 제어하기 위해 뮤텍스, 세마포어 ,  BlockingQueue 가 있다.세마포어의 목적과 동시성 제어의 방법 차이점을 알아보자.뮤텍스나 세마포어는 동시성 제어를 위한 자료 구조이다. 동시성 제어를 위한 자료구조 뮤텍스(M..

JAVA 2025.04.09

Java 예외 처리, 제대로 알고 쓰자

예외 처리는 프로그램을 작성할 때 필수적인 부분이지만, 어떻게 예외를 처리할지에 대한  기준을 명확히 해야 합니다.잘못된 예외 처리 방식은 오히려 코드의  가독성을 떨어뜨리고 성능을 저하시킬 수 있다.이 글에서는 예외를 잘못 사용했을 때 발생할 수 있는 문제점과 올바른 예외 처리 방법을 정리해보겠습니다.예외는 예외적인 상황에서만 사용하자예외를 활용한 분기 처리는 절대로 사용하지 말아야 합니다. 예외는 예측 불가능한 문제를 처리하는데 사용해야 하며, 일상적인 제어 흐름에는 사용되지 않아야 합니다.  예외를 활용한 조건문 대체 (잘못된 반복문 종료 방식) try { int[] arr = {1, 2, 3}; int i = 0; while (true) { System.out.prin..

JAVA 2025.03.26

바이트코드 조작

스카우터는 어떻게 우리 코드를 '감시'할까?"스카우터(Scouter)는 어떻게 애플리케이션의 XLog를 실시간으로 측정할까?" APM 툴은 어떻게 내 코드를 건드리지 않고도 실행시간을 측정하고 성능을 모니터링할까? 코드 커버리지 도구는 어떻게 테스트가 어느 부분을 실행했는지 알아낼까? 답은 바이트코드 조작(Bytecode Manipulation)에 있다. 이는 자바 생태계의 가능 흥미로운 기능 중 하나로, 실제 코드를 수정하지 않고도 프로그램의 동작을 바꿀 수 있는 마법같은 기술이다. https://github.com/hek316/java-meta-playground바이트 코드 조작이란?자바 코드는 컴파일되면 .class 파일이 된다. 이 파일안에는 JVM 이 이해할 수 있는 바이트코드가 들어있다...

JAVA 2025.03.24

클래스 로더란?

jvm 내부에서 자바 바이트코드를 전달받아 동작하는 클래스 로더에 대해 알아보자! 클래스 로더의 개념자바는 동적 로드, 즉 컴파일 타임이 아니라 런타임(바이트코드를 실행할 때) 에 클래스를 링크하고 로드하는 특징을 가진다. 자바의 클래스 로딩은 클래스 참조 시점에 JVM 에 코드가 링크되고, 실제 런타임 시점에 로딩되는 동적 로딩을 거친다.자바는 클래스 로딩은 클래스 참조 시점에 JVM 에 코드가 링크되고, 실제 런타임 시점에 로딩되는 동적 로딩을 거진다. 런타임에 동적으로 클래스를 로딩한다는 것은 JVM 이 미리 모든 클래스에 대한 정보를 메소드 영역에 로딩하지 않았다는 것을 의미합니다. JVM 내에서 자바 바이트코드를 전달받는 클래스 로더가 자바가 동적으로 로드될 수 있도록 해주는 소프트웨어입니다. ..

JAVA 2025.03.24

JVM, JDK, JRE 의 차이, JVM의 동작방식

자바 JVM, JDK, JRE 의 차이가 무엇인지 확인해보자 JVM (Java Virtual Machine)자바 가상 머신으로 자바 바이트 코드(.class 파일) 를 OS 에 특화된 코드로 변환(인터프리터와  JIT 컴파일러)하여 실행한다.바이트 코드를 실행하는 표준 (JVM 자체는 표준) 이자 구현체 (특정 밴더가 구현한 JVM) 다.JVM 밴더: 오라클, 아마존, Azul,...특정 플랫폼에 종속적.(os 에 맞는 native 코드로 맞춰서 호출) JRE (Java Runtime Environment) : JVM + 라이브러리자바 애플리케이션을 실행 할 수 있는 배포판.jre 배포판의 목적은 자바 애플리케이션을 실행하는 것이다. 실행을 하기 위해 바이트 코드를 변환하는 jvm 과 java 의 핵심 ..

JAVA 2025.03.23

자바 네트워크 프로그래밍 - TCP/IP 소멧으로 클라이언트-서버 구축하기

네트워크 프로그래밍은 현대 소프트웨어 개발에 필수적인 기술이다.네트워크 프로그래밍은 서버와 클라이이언트가 데이터의 주고 받는 기술로, 자바에서는 매우 쉽게 구현할 수 있다.이번 포스팅에서는 TCP/IP 기반의 클라이언트-서버 구조를 단계별로 구현하며, 단일 연결, 지속적 메시지 처리, 다중 클라이언트 처리까지 확장해 보겠다.목차기본 클라이언트-서버 프로그램반복적인 메시지 통신다중 클라이언트 처리핵심 개념 정리 TCP/IP란?TCP/IP는 인터넷 통신에서 가장 기본이 되는 프로토콜이다. 자바에서는 Socket, ServerSocket 클래스를 통해 TCP 기반의 통신을 손쉽게 구현할 수 있다. [예제1] 단일 메시지 클라이언트-서버 이제 본격적으로 자바 네트워크 프로그램을 작성해 보자.여기서는 TCP/IP..

JAVA 2025.01.29

자바 - IO 기본 (buffer)

데이터 통신을 다루다 보면 버퍼라는 개념이 나온다. 버퍼는 왜 쓰이는 것일까?버퍼에 목적에 대해 알아보자!핵심 요약버퍼는 데이터를 일시적으로 저장하는 메모리 영역데이터 처리 속도가 서로 다른 장치나 프로세스 간의 속도 차이를 조율하거나, 입출력 성능을 향상시키기 위해 사용되는 중간 저장소버퍼(Buffer)의 목적 (임시 저장소로서의 큐 구조)입출력 데이터를 일정량 모아 두었다가 처리함으로써 시스템 전체의 효율과 안정성을 높이는 장치입니다.I/O 호출 횟수 감소로 인한 속도 향상데이터를 버퍼에 모아 한 번에 디스크나 네트워크로 전달I/O 오버헤드 감소 → 병목 완화속도 차이 조정 (Speed Mismatch Absorption)빠른 주체(CPU 등)와 느린 주체(디스크/네트워크 등) 간 속도 불일치 해소빠..

JAVA 2025.01.28

자바 - IO 기본 (InputStream, OutputStream)

자바에서 데이터를 파일이나 네트워크 등을 통해 주고 받을 때 어떤식으로 통신하는지 알아보자  데이터의 통신 과정은 스트림으로 통신한다  자바가 가진 데이터를 hello.dat 라는  파일에 저장하려면 어떻게 해야할까?자바 프로세스가 가지고 있는 데이터를 밖으로 보내려면 출력 스트림을 사용하면 되고, 반대로 외부 데이터를 자바 프로세스 안으로 가져오려면 입력 스트림을 사용하면 된다. 참고로 스프트림을 단방향으로 흐른다. 스트림 시작 스트림 시작 - 예제1package io.start;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class StreamStartMain1_1 { ..

JAVA 2025.01.28