개요요즘 모의 코인 거래 사이트를 만들어보고 있다. 모의 서비스이긴 하지만 금융 거래를 테마로 하고 있기 때문에 무엇보다 데이터 정합성과 확실한 트랜잭션 처리가 중요하다고 생각하고 있다. 모의 주식 사이트를 만들고자 하였지만 24시간 실시간 데이터를 제공받기에 코인이 더 용이하여 타겟을 바꾸게 되었고 이로 인해 소수점 거래가 발생하였다. 알다시피 주식은 일반적으로 정수개의 주식만 거래가 가능하다. 요즘에서야 소수점 거래도 증권사에서 제공하긴 하지만 기본적으로는 1주가 주식의 기본 단위이다. 하지만 코인 거래에서는 1BTC 가 오늘 기준 1억을 호가하며 단위로 사용하기에는 너무 커져버렸다. 그래서 0.00001 BTC 거래처럼 소수점이 많은 것을 흔히 봤을 것이다. 이러한 소수점 가격, 소수점 수량 등을 ..
Programming/JAVA
개요모의 주식 거래 사이트를 개발하면서 WebSocket 으로 실시간 가격을 받아오고 있다. 이때 시장가 주문이 들어온다면 해당 실시간 가격으로 거래를 처리해야하기에 실시간 데이터를 기록하고 불러오는 기능이 필요했다.@Component public class PriceHolder { private BigDecimal currentPrice = BigDecimal.ZERO; public void updatePrice(BigDecimal price) { currentPrice = price; } public BigDecimal getCurrentPrice() { return currentPrice; } }그래서 PriceHolder 라는 객체를 생성하고 여기에서 매번 ws 응답마다 가격을 저장하고, 주문 처..
JAVA 만을 사용해서 웹 서버를 구성하던 중 정적 파일을 읽어 응답해주어야하는 경우가 있었다. String path = "src/main/resources/static/";File file = new File(path + uri); 위와 같이 프로젝트의 path 를 사용해서 정적 파일을 읽었다. 하지만 저 코드는 "src/main/resource/" 경로가 유지되어야한다. 굳이 말하자면 WEB-INF 나 webapp 같은 파일로 정적 파일을 관리한다면 해당 코드는 사용하지 못한다. 그리고 그런 것 보다는 기본 Path 정도는 시스템에 넣어서 쓰는 편이 좋지 않을까 싶어서 고치고자 한다. 1. Class Loader 결론적으로는 Resource 파일을 가져오기 위해서는 Class Loader 를 사용한..
1. JVM 이란?Java Virtual Machine 으로 Java 라는 언어가 플랫폼에 자유롭게 실행될 수 있는 근간이다. Write once, run anywhere 우리가 .java 형식으로 작성한 파일들은 Java Compiler 를 통해 바이트 코드로 변환된다. 그리고 JVM 은 이 바이트 코드를 읽어내고 실제 실행시키는 역할을 한다. 그림과 같이 JVM 은 크게 Class Loader, Excution, Runtime Data Area 로 나눌 수 있다. 인터넷에서는 GC 까지 4 가지로 나누는 것도 있지만 GC 는 Excution 에 포함된다고 보는 것이 맞다 생각한다. (1) Class LoaderClass Loader 는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 메모리..
Mapper이제 URL 을 통한 요청이 들어올 경우 Method 와 URL 을 사용해 필요한 요청을 각각 수행할 수 있도록 해주어야한다.결국 라우팅을 해주는 객체가 필요하다확장성을 위해 컨트롤러를 한 번 등록하면 이후에 요청이 들어왔을 때 찾을 수 있도록 하고 싶다.모든 컨트롤러들은 인터페이스를 구현해 하나의 메서드를 실행할 수 있게 한다.HttpMapperpublic interface HttpMapper { MyHttpResponse handle(MyHttpRequest httpRequest) throws IOException;}가장 기본이 되는 인터페이스를 하나 생성하자.이전에 만들었던 요청 객체를 파라미터로 받아 handle 메서드 내에서 이를 실행하고 응답 객체를 반환한다.큰 틀을 유지하며 ..
HTTP RequestHTTP 응답을 처리하기 위해서는 HTTP Request 부터 완벽하게 받아내야한다.(HTTP REQUEST - RFC2616)[https://datatracker.ietf.org/doc/html/rfc2616#section-5]HTTP 를 정의해놓은 공식 문서를 참고해보자. HTTP Request 는 총 3가지로 나눌 수 있다.Request LineRequest-headermessage-bodyPOST /cgi-bin/process.cgi HTTP/1.1User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)Host: www.tutorialspoint.comContent-Type: application/x-www-form-urlenc..
WAS 를 구현하는 과정에서 정적 파일을 String 으로 읽어 처리했었다. HTML 이나 CSS, SVG 파일같은 경우에는 모두 문자열로 표현할 수 있기 때문에 아무 문제 없었지만 ico 같은 이미지 파일같은 경우에는 바이트 단위로 이루어져있어 String 으로 읽으면 파일이 깨지는 현상이 발생했다. 추가적으로 이미지 파일은 38505 바이트인데, String 으로 받을 경우 70259 바이트가 된다는 점이 이상했다.temp1 은 이미지 파일을 String 으로 읽은 것byteArray 는 이미지를 바이트 단위로 읽은 정상 로드된 경우이다.String 도 결국에는 byte[] 인데 도대체 왜 깨지는 것인지 하나하나 알아보도록 하자!Byte to String 실제 favicon.ico 파일은 PNG 파일..
개요Spring 없이 웹 서버를 구축하는 과정이다. 이전에는 Socket 을 연결하고 HTTP Request 를 추출해 정적 파일 접근 시 해당 파일을 전달해주었다.하지만 이때, Content-Type 이 text/html 로 고정되어있기 때문에 css 혹은 이미지 파일이 정상적으로 로드되지 않는다.이번에는 다양한 타입의 파일을 전달해주도록 하자!타입 추출가장 먼저 해야할 일은 요청에 따라 타입을 추출하는 것이다."/index.html""/favicon.ico"등의 요청이 주어질 때마다 적절한 Content-Type 을 Request 헤더에 추가해 보내주어야한다.AcceptGET /index.html HTTP/1.1Host: localhost:8080Connection: keep-alivesec-ch-u..