java

    [우아한 테크 캠프 팀 프로젝트] File Upload 구현하기. 효율적인 I/O처리를 위한 InputStream과 OutputStream의 분리 My-Storage(1)

    우아한 테크 캠프에서 3주 동안 진행하는 팀 프로젝트를 시작하게 되었다. 3주라는 짧은 시간 안에 아이디어를 내고 기능 구현도 하고 발표까지 해야 했다. 팀은 제비 뽑기로 결정했다. 제비 뽑기로 할 줄은 생각도 안 해서 나처럼 CS 공부가 중요하다고 생각하는 분과 팀을 하기로 했었고, 어떤 주제를 할지 미리 정했었다. 조작한 것처럼 제비 뽑기에서 그 분과 한 팀이 되었고 다른 팀원들에게 해당 주제와 대략적인 기능들을 설명해 주었는데 긍정적인 반응이라서 시작하게 되었다.주제와 주제 선택 이유주제는 네이버의 MyBOX, 구글의 Google Drive와 같은 클라우드 스토리지 서비스이다.이 주제를 선택한 이유는 클라우드 스토리지도 일종의 파일 시스템이고, 그렇다면 CS를 많이 활용할 수 있지 않을까?라는 생각..

    코드리뷰 적용, 다시 Redis로.. - MiniPay(5)

    코드 리뷰이전에는 굳이 Redis를 사용할 필요가 없다고 생각해서 MySQL을 사용하여 기능을 구현했다. 해당 기능은 이체 트랜잭션을 분리하여 발생한 데이터 정합성 문제를 해결하기 위해 이체 발생 로그를 저장하는 기능이다. 하지만 코드 리뷰에서 데이터가 오래 유지되지 않고 금방 사라져도 되는 데이터라는 점에서 Redis와 같은 메모리 기반의 DB 사용하면 좋겠다는 리뷰를 받았다. 이전에도 Redis를 사용하면 된다고 생각했지만 delete 연산 때문에 사용하지 않은 것인데 뭔가 다른 방법이 필요했다. 현재 producer, consumer 구조를 사용하고 있기에 Redis를 해당 구조에서 사용할 방법을 찾아보았다.Redis Stream찾아보니 Redis가 지원하는 많은 데이터 형식 중 Stream이라는 ..

    Java 양방향 Socket 통신시 발생한 에러(socket is closed, 무한 readLine)

    문제 Socket 공부하면서 client -> server 단방향 통신만 있길래 그대로 응답도 보낼 수 있지 않나? 해서 server에서 OutputStream을 사용해서 client에 보내니 socket is closed 에러 발생 위의 이슈 해결 이후에는 sever에서 client의 데이터를 받지 못하는 문제 발생 문제 코드 클라이언트 코드 public void sendAndReceiveSocketData(String data) { Socket socket = null; try { System.out.println("Client: Connecting"); socket = new Socket("127.0.0.1", 9999); System.out.println("Client: Connect status..

    [Java] 가비지 컬렉션(Garbage Collection)과 5가지 알고리즘

    가비지 컬렉션(Garbage Collection) 최근 친구가 전화로 자바에서 생긴 메모리 이슈 관련 도움을 구한 적이 있었다. 친구랑 같이 원인을 찾다 보니 계속 새로운 객체를 생성하여 참조된 객체를 Garbage Collection이 제거하지 않아 생기는 문제일 수 있음을 알게 되었다. 이런 것을 방지하기 위해 싱글톤 패턴으로 코드를 작성하고 Spring에 와서는 Bean을 생성하고 DI를 적용하여 자동으로 싱글톤 패턴이 적용되었다. 그래서 항상 하던 대로 코드를 작성하다 보니 Garbage Collection을 신경 쓰지도 않았고 어떻게 동작하는지도 몰라서 궁금하여 찾아보고 정리하게 되었다. 특히 나도 나중에 저런 메모리 이슈가 생길 수 있고 지금 공부하는 내용이 도움이 될 것 같다고 생각된다. G..

    [Java] 불변 객체와 final을 사용해야 하는 이유(feat.정적 팩토리 메소드)

    불변 객체(Immutable Object) 불변 객체란? 말 그대로 변하지 않는 객체로 객체 생성 이후 내부의 상태가 변하지 않는 객체를 의미한다. 불변 객체는 읽기만 가능하고 내부 상태를 제공하지 않거나 방어적 복사를 통해 제공한다. Java에서 대표적인 불변 객체로는 String이 있다. 불변 클래스이기 때문에 아래와 같이 char형 배열로 받아서 수정해도 바뀌지 않는다. String test = "Test"; char[] testArray = test.toCharArray(); testArray[0] = 'B'; System.out.println(test); System.out.println(Arrays.toString(testArray)); 방어적 복사란? 흔히 주소 값을 복사하는 얕은 복사와 전..

    Java 정리(JVM, 객체지향, 싱글톤 패턴)

    JVM(Java Virtual Machine) 말 그대로 자바를 실행하기 위한 가상 기계 C, CPP은 운영체제에 종속적이라 컴파일한 코드를 바로 실행시킴 → 윈도우에서 만든 것을 맥이나 리눅스 등에서 사용 불가능함 Java의 경우 컴파일을 하면 바이트 코드(바이너리 코드)로 변하고 JVM이라는 가상 머신이 실행시킴. 메모리에서 JVM이 동작하다보니 아직까지 하드웨어를 사용하지 않았기 때문에 JVM만 설치되어 있다면 OS에 종속적이지 않게 실행시킬 수 있음 즉 플랫폼에 독립적임. Write Once, Run Anywhere 가상환경인 JVM 위에서 동작하기 때문에 실행 속도가 상대적으로 느린 단점이 있음 💡 바이너리 코드? 컴퓨터가 인식할 수 있는 0과 1로 구성된 이진 코드 가비지 컬렉션(Garbage..