반응형

Programming 362

SELECT FOR UPDATE / JPA를 사용한 비관적 잠금

'동시성(Concurrency)' 웹 서비스에서는 다수의 사용자들이 데이터베이스에 동시에 접근하는 경우가 빈번하게 발생합니다. 때문에 데이터의 일관성에 대한 처리가 필요한데요. 이를 '동시성(Concurrency) 문제'라고 합니다. 동시성 문제란, 공통된 자원에 동시에 들어온 여러 개의 요청이 모두 읽고 쓰는 작업(Read -> Write)을 하려고 하는 경우에 발생할 수 있는 문제를 말합니다. *** 동시성 문제는 '완전한 해결'이 아닌 '적절한 해결(제어)'에 더 적합합니다. '동시성'과 '일관성'은 하나가 증가하면 다른 하나는 감소하는 트레이드오프의 관계이기 때문에 해당되는 로직의 특성에 따라서 적절하게 균형을 설정하는 것이 중요합니다. '비관적 락(Pessimistic Lock)' 자원에 대한 ..

Java 주식 API (대신증권 사이보스 플러스) 연동하기

Java로 대신증권 사이보스 플러스 API 사용하기 프로그래밍을 통한 자동 매매를 구현하기 위한 대부분의 증권사 api가 C, C++ 또는 Python에서는 사용하기 쉽게 되어있습니다. 하지만 공식적으로 Java 언어를 통해 사용할 수 있는 증권사 api는 찾을 수 없었습니다. 그러던 중 구글링을 통해 대신증권 사이보스 플러스 api의 .dll 파일을 com4j 라이브러리로 .java 파일로 변환해서 사용하는 것을 보고 참고하여 작업하며 정리한 내용입니다. - 작업 환경 Windows10 64비트(x64), Java8 32비트(x86), IntelliJ 32비트 런쳐(18.3.6) 환경에서 작업하였습니다. (작업 중 64비트에서는 오류가 발생하고, 32비트에서만 동작하는 부분이 있어서 32비트 설치 후 ..

Programming/Java 2022.02.05

Windows10 Java8 32bit 설치하기 jdk8(x86)

윈도우10 Java8, JDK8 32비트(x86) 버전 설치하는 방법입니다. (Windows10 64비트 환경에서 설치를 진행하였으며, 개발상 필요에 의해 32비트 jdk를 설치하게 되었습니다.) 일반적으로 대부분의 운영 체제가 64비트(x64)를 사용하겠지만 간혹 특별한 상황에서 32비트를 사용해야 하는 경우가 발생합니다. 32비트의 Java8을 설치하기 위해서는 아래 Oracel 사이트를 통해 Java SE Development Kit 8u202, Windows x86 버전을 다운로드합니다. Java SE (Standard Edition) https://www.oracle.com/kr/java/technologies/javase/javase8-archive-downloads.html (JDK 다운로드..

Programming/Java 2022.02.03

데이터베이스 연동 원리 JDBC, DataSource, Connection Pool

JDBC, Connection Pool, DataSoucre 개념과 원리 살펴보기 각각의 WAS에서 돌아가는 여러 개의 프로젝트들이 하나의 DB에 있는 데이터를 사용할 때 'Dirty Read', 'Non Repeatable Read', 'Phantom Read' 같은 문제점이 발생할 수 있다는 것을 알게 되고, 문제를 해결하기 위한 여러 가지 방법을 찾아보면서 Spring Boot에서 DB와 연결되어 데이터를 주고받는 동작 원리에 대한 이해가 부족하다고 느껴서 정리하게 된 내용입니다. 먼저 JDBC JDBC는 Java Database Connectivity의 약자로 스프링 프레임워크를 사용하기 전에 일반 Java 언어에서 DB 연결을 위해 사용하는 것으로 자바와 데이터베이스를 연결하기 위한 Java 표..

트랜잭션에 락을 사용하는 경우 (격리 레벨 Isolation Level)

트랜잭션(Transaction)의 이론적 개념과 특성, 먼저 트랜잭션의 이론적 개념은 데이터베이스 관리 시스템(DBMS)에서 '데이터를 조작하는 최소한의 작업(unit of work)'을 이야기합니다. 그리고 트랜잭션은 'ACID'라는 특성을 보장해야 하는데요. 원자성(Atomicity) - 원자 단위로서 더 이상 쪼갤 수 없는 논리적 최소 단위임을 말합니다. - 한 트랜잭션 내에서 실행한 작업들은 하나로 간주하는 것으로 모두 성공하거나 모두 실패해야 합니다. (All or Nothing) 일관성(Consistency) - 트랜잭션이 성공했다면 데이터베이스는 항상 일관성 있는 상태로 유지되어야 한다는 것을 말합니다. 격리성(Isolation) - 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격..

자바 소켓 통신(Socket)을 사용하는 이유와 동작 원리 및 코드

Java 소켓 통신(Socket)을 사용하는 이유 먼저 자바에서 소켓 통신은 C 또는 C++ 언어로 구현된 프로젝트와의 통신에 많이 사용됩니다. 이유는 Java와 C의 데이터 개념이 다르기 때문인데요. C에서는 구조체를 사용하는데 반해서 Java에는 구조체가 없습니다. 이처럼 Java의 Object 구조를 C에서 이해하지 못하고 C의 구조체를 자바에서 이해하지 못하기 때문에 서로 통신을 위해서는 byte 단위로 정보를 주고받아야 합니다. (Socket을 사용한 전문 통신) Http 통신과 Socket 통신의 차이점 - 단방향 통신인 Http 통신 Http 통신은 Client의 요청(Request)이 있을 때만 서버가 응답(Response)하여 해당 정보를 전송하고 곧바로 연결을 종료하는 방식입니다. Cl..

Programming/Java 2022.01.25

LocalDateTime toString() 메서드 사용 시 주의해야 할 점(00초 사라짐)

LocalDateTime의 toString() 메서드 사용 시 00초가 사라지는 경우 먼저 LocalDateTime은 java.time 패키지에 있는 시간을 다루는 클래스이며 jdk1.8부터 사용되었고 기존의 Date와 Calendar 클래스의 단점을 보완하기 위해서 나오게 되었습니다. 프로젝트 진행 중 LocalDateTime 타입의 값을 toString() 메서드로 문자열 형태로 가지고 와서 사용하는 과정에서 LocalDateTime의 기본 형태인 'yyyy-MM-ddTHH:mm:ss'에서 저장된 데이터의 마지막 ss 초 값이 00 일 경우에 값이 아예 출력되지 않고 'yyyy-MM-dd T HH:mm' 까지만 나오는 경우가 발생하였습니다. ex) mariaDB에 저장된 DateTime 값 '2022..

Programming/Java 2022.01.20

전문통신이란? Java 전문통신(Fixed Length Format) 문자열 길이 맞추는 메서드

전문 통신이란, 먼저 'Fixed Length Format'은 전문을 구성하는 field들의 길이를 입력받을 수 있는 최대 사이즈로 고정시키는 방식입니다. 대규모의 프로젝트를 진행하다 보면 서로 다른 시스템끼리 데이터를 주고받아야 하는 상황이 생깁니다. 이 경우 시스템 간의 통신에서 데이터 송수신 format을 정하는 것도 중요한데요. 일반적으로 데이터를 송수신하는 전문의 형태는 JSON, XML, Fixed Length 등 여러 가지로 구성할 수 있습니다. (요즘은 XML, JSON 등의 format 형태가 많이 사용되지만 C언어와의 통신에서는 데이터 송수신 format으로 C언어에서 사용하기 편리한 형태인 Fixed Length 형태도 많이 사용됩니다.) 전문은 일정한 크기의 공통된 데이터를 가진 h..

Programming/Java 2022.01.19

Spring Cache 캐시 추상화 기본적인 사용법 @Cacheable @CachePut @CacheEvict

'Spring Boot 프로젝트 Cache 캐시 추상화 기본적인 사용법' 먼저 캐시(Cache)란, 캐시란 서버의 부담을 줄이고, 성능을 높이기 위해 사용되는 기술입니다. 예를 들어서 어떤 요청을 처리하는데 DB에서 조회하는 시간이 오래 걸리거나 계산이 복잡한 경우에 적용하여 요청 결과를 저장해 두고 가져옴으로써 빠르게 처리할 수 있는 기술입니다. 아래에서 살펴볼 Spring 프로젝트의 캐싱 사용법에서는 메서드에 캐싱을 적용함으로써 캐시에 보관된 정보로 메서드 실행 횟수를 줄여 주는 것을 볼 수 있습니다. 즉, 대상 메서드가 실행될 때마다 추상화되어 적용된 캐싱이 해당 메서드가 같은 인자로 이미 실행되었는지 확인하는 동작을 합니다. 해당 메서드가 실행되어 저장된 데이터가 존재한다면 실제 메서드를 실행하지..

Java 대출 이자 계산기 구현하기 (원금균등, 원리금균등, 만기일시)

'자바 대출 이자 계산기 구현하기 (원금균등상환, 원리금 균등상환, 만기 일시상환)' 대출 시 이자 상환 방식에는 원금균등상환, 원리금 균등상환 그리고 만기 일시상환 세 가지가 있으며, 각 방식에 따라서 이자 금액에 차이가 있을 뿐만 아니라 재정 계획에 영향을 줄 수 있습니다. 아래에서는 각 방식에 대한 간단한 내용과 구현된 코드를 볼 수 있습니다. '원금균등상환' 매월 동일한 원금과 남은 잔금에 상응하는 이자를 더한 금액을 매월 상환하는 방식입니다. 즉, 1천만 원을 3%의 이율로 12개월간 대출한 경우 매월 833,333원의 원금을 상환하며, 대출 잔금에 3% 이자율을 적용한 이자를 함께 상환합니다. 잔금이 매월 줄어들기 때문에 그에 따른 이자가 줄어들어 3가지 방식 중 총이자 금액이 가장 저렴하다는..

Programming/Java 2022.01.13
반응형