입출력 스트림 입출력이란 입력(Input)과 출력(Output)을 줄여서 부르는 것으로 두 대상 간의 데이터를 주고받는 것을 의미한다. 데이터를 주고 받을 때 스트림(Stream)이라는 것을 사용하게 되는데 데이터를 입출력하는 데 사용되는 연결 통로를 뜻한다. 하나의 스트림으로 입출력을 동시에 수행할 수 없는 단방향 통신만 가능하다. (동시에 하려면 2개의 스트림이 필요) 바이트 기반 스트림 바이트 기반 스트림은 데이터를 바이트 단위로 주고 받는다. public static void main(String[] args) throws IOException { FileInputStream fileInputStream = null; FileOutputStream fileOutputStream = null; tr..
한화시스템 BEYOND SW 캠프 2기 - 4주 차 이번 한 주는 자바로 시작해서 자바로 끝난 한 주였다. 나는 이미 자바로 프로젝트를 한 번 진행해 본 경험이 있었고, 따로 독학도 해봤기 때문에 초반에는 강사님이 내주신 과제로 대신 공부하였다. 수요일부터는 자바를 돌아본다는 생각으로 강의를 들으며 공부하였고 중간에 남는 시간 동안은 프로그래머스 코딩 테스트 문제를 풀어보았다. 공부를 하면서 궁금했던 부분이 있었는데 하나는 디자인 패턴이었고 다른 하나는 JVM이 동작하는 과정이었다. 디자인 패턴 - 싱글톤(Singleton) 싱글톤(Singleton) 먼저 디자인 패턴은 객체를 생성하는데 총 3가지 분류로 나눌 수 있는데 생성, 구조, 행위로 나눌 수 있고 여기서 싱글톤은 객체를 생성하는 디자인 패턴 중..
자바를 처음 공부했을 때 들었던 생각이 있었다. 자바 버전이 17, 21 이런 식으로 있는데 JDK는 그럼 뭐지? 자바를 사용하려면 꼭 알아야 되는 건가? 그럼 JRE는 뭐지? 자바 언어를 사용하면서 JDK나 JRE를 정확하게 알고 있을까란 의문이 들었고 그래도 내가 자바 개발자라면 꼭 알아야 되는 개념이라고 생각해서 정리를 해봤다. JDK(Java Development Kit) JDK는 자바 애플리케이션을 개발하는 데 사용되는 소프트웨어 개발 환경으로 JDK 또한 하나의 소프트웨어이다. 자바 개발자는 JDK를 통해서 자바 프로그램을 코딩하고 실행할 수 있기 때문에 javac, javadoc 등의 개발 도구들(development tools)이 포함되어 있다. 그림과 같이 JDK는 JRE와 JVM을 포함..
싱글톤(Singleton) 먼저 디자인 패턴은 객체를 생성하는데 총 3가지 분류로 나눌 수 있는데 생성, 구조, 행위로 나눌 수 있고 여기서 싱글톤은 객체를 생성하는 디자인 패턴 중 하나이다. 싱글톤 패턴의 주요 특징은 단 하나의 유일한 객체를 만드는 것이다. 이렇게 만들어진 하나의 객체를 다른 모듈들이 공유하며 사용하게 된다. 모듈 A, B, C가 어떤 작업을 하는데 필요한 객체를 생성한다고 생각해 보자. 그렇다면 위의 그림과 같이 각 모듈마다 새로운 객체를 생성하게 된다. 다르게 생각해보면 모듈이 100까지 있고 100개 다 동일한 기능의 객체가 필요하다면 100개의 객체를 새롭게 생성해 줘야 될 것이다. 그렇게 생성된 100개의 객체는 메모리를 차지하게 되므로 메모리 공간 낭비가 발생하게 된다. 여..
MySQL-Cluster 클러스터 설명 MySQL Replication은 확장의 제약을 가진다. 왜냐하면 데이터 입력 및 업데이트가 master 서버에 의존적이기 때문에 시스템 확장 시 slave 서버의 증설은 용이하지만 master 서버의 증설에는 어느 정도 제약이 따르게 된다. 하지만 MySQL Cluster는 데이터 입/출력을 모두 처리하는 형태로 구현되기 때문에 어떠한 특정 DB 서버에 의존적이지 않다. 클러스터의 장점 파이브 나인의 고가용성 시스템 구축과 운영이 가능하다. 메인 메모리 또는 하드디스크 기반의 고성능 데이터베이스 구현이 가능하다. 매우 빠르고 자동적인 FailOver 시스템을 가지고 있다. 유동적이고 병렬적인 분배 구조 시스템을 가지고 있다. 별도의 라이선스 및 제반 비용이 필요 ..
한화시스템 BEYOND SW 캠프 2기 - 3주 차 이번주는 미니 프로젝트를 해서 정말 바쁜 한 주였다. 3일간 소프트웨어 공학을 공부하면서 간단하게 프로젝트를 진행하는 방법과 진행하는 과정에서 어떤 문서를 작성하는지 학습했고, 나머지 이틀간 미니 프로젝트를 진행했다. 깃과 깃허브를 사용하는 방법도 배웠는데 이전에 내가 프로젝트를 하면서 사용해 본 경험이 있어서 수업을 따라가는 데는 별로 어려움이 없었다. 그래도 깃을 활용하는 방법을 다시 한번 공부해보니 생각보다 내가 모르는 명령어와 사용법이 많아서 정말 유익했다. 프로젝트를 진행하면서 깃을 많이 사용하게 되는데 그럴 때마다 각종 에러와 실수가 난무하여 정말 쓰기 두려운 것이 깃이었지만, 이번에 공부하면서 다시 사용해 보니 생각보다 괜찮았다. SW 공학..
Optional 클래스 자바 언어로 개발을 하다 보면 항상 조심해야 되는 예외 중에 NullPointer 예외가 있다. 개발하면서 많이 겪는 예외 중에 하나로 왜 null값이 들어올까 항상 고민하게 만드는 예외다. 이러한 문제를 해결해주는 클래스로 Optional 클래스가 있다. Optional 클래스는 T 타입 객체의 래퍼 클래스로 모든 종류의 객체를 저장할 수 있다. Optional 클래스를 사용하는 이유 null을 직접 다루는 것은 NullPointer 예외가 발생할 수 있기 때문에 상당히 위험한 행동이다. 따라서 Optional 클래스를 사용해서 null을 간접적으로 다룰 수 있게 해준다. 매개 변수로 들어오는 값이 null인지를 확인하기 위해서는 if문을 통한 검증이 이뤄져야 하고 이로 인해 코..
레디스(Redis) 레디스(Remote Dictionary Server)는 In-Memory 기반의 Dictionary 구조 데이터 관리 서버 시스템을 뜻하는데, 여기서 Dictionary 구조 데이터는 key-value를 의미한다. 다른 것은 그래도 이해가 가는데 그럼 In-Memory라는 게 뭘까? In-Memory In-Memory는 컴퓨터의 메인 메모리(RAM)에 데이터를 저장하는 것으로, 말 그대로 데이터가 메모리 안으로 들어간다고 이해하면 쉬울 것 같다. 위의 그림과 같이 CPU는 메인 메모리에 저장된 데이터만 직접 가져올 수 있다. 그렇다면 데이터를 굳이 HDD나 SSD에 저장하는 것이 아닌 메인 메모리에 저장하면 더 빠르게 데이터를 주고받을 수 있기 때문에 In-Memory라는 개념이 탄생..
람다(Lambda) 함수를 간단한 식으로 표현하는 방법이다. 람다식은 익명 함수가 아니라 익명 객체이다. 따라서 람다를 다루기 위해서는 참조변수가 필요하기 때문에 참조 변수 타입을 지정해줘야 한다. 람다식 작성하기 메서드의 이름과 반환타입을 제거하고 화살표(->)를 블록 앞에 추가한다. 반환값이 있는 경우, 식이나 값만 적고 return문을 생략한다. (세미콜론도 생략 가능) 매개변수의 타입이 추론 가능하면 생략이 가능하다. (대부분의 경우 생략이 가능함) MyFunction f1 = new MyFunction() { @Override public int max(int a, int b) { return a > b ? a : b; } }; 함수형 인터페이스에 max라는 메서드가 있다고 가정하면 위의 코드와..
제네릭(Generics) 제네릭은 컴파일 시 타입을 체크해 주는 기능이다. JDK 1.5 이후로는 꼭 타입을 지정해줘야 하는데 이때 제네릭을 사용하여 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄일 수 있다. 타입 변수 클래스를 작성할 때 Object 타입 대신 타입 변수(E)를 선언해서 사용한다. 객체를 생성할 때 타입 변수 대신 실제 타입을 지정한다. 실제 타입이 지정되면 형변환을 생략할 수 있다. 참조 변수와 생성자의 대입된 타입은 일치해야 한다. JDK 1.7부터 생성자에 타입 변수를 지정하는 것을 생략할 수 있다. public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Seria..
Git과 GitHub 우리가 개발한 서비스의 규모가 커지면 그에 따른 코드의 양도 방대해지고, 추가와 수정 혹은 변경과 같은 작업들이 계속 이루어지게 된다. 이러한 작업들을 형상관리라고 하는데 Git이라는 것은 형상관리를 쉽게 할 수 있게 도와주는 프로그램이다. 우리가 위의 사진과 같이 프로젝트를 진행했다면 어땠을까? 어떤 것이 최종 결과물인지 모르고, 또 내가 필요한 코드가 어디에 있는지 모른다. (실제 경험담이 있음...) 만약 Git을 사용했으면 하나의 폴더 안에서 계속 작업물의 버전을 높여가면서 작업을 할 수 있을 것이다. Git을 사용해서 작업이 끝나면 그것을 GitHub에 공유하여 여러 사람들이 볼 수 있게 할 수 있고, 또한 동료들과의 협업도 가능하다. Git과 GitHub의 특징들 Git은..
컬렉션 프레임워크(Collection Framework) 다수의 객체를 다루기 위한 표준화된 프로그램 방식을 뜻한다. 크게 3가지로 나눌 수 있는데 계층 구조로 보면 다음과 같다. 해당 계층 구조에서 핵심은 List, Set, Map이다. List 순서가 있는 데이터 집합으로 중복을 허용한다. List의 종류로 ArrayList, LinkedList, Stack, Vector 등이 있다. List의 예시로 대표적인 ArrayList를 사용해보자. ArrayList는 말 그대로 Array(배열)의 특징과 List(리스트)의 특징이 혼합된 자료구조를 의미한다. 먼저 ArrayList의 내부를 살펴보면 List 인터페이스를 구현하게 된다. 그 다음으로 살펴볼 것은 ArrayList의 길이는 처음 생성했을 때 ..
애너테이션(Annotation) 애너테이션은 주석처럼 프로그래밍 언어에 영향을 미치지 않으며 유용한 정보를 제공해 준다. @Override @ 로 시작하고 메타데이터를 프로그램 요소(인스턴스 변수, 생성자, 매서드, 클래스 등)에 연결하는 데 도움을 준다. 예전에는 주석을 XML로 따로 관리를 했다는데 프로그램이 변경되고 버전이 올라감에 따라 주석을 관리하는 XML도 변경해야 되는 번거로움이 존재했다. 이러한 문제를 해결하기 위한 대안으로 나온 것이 현재의 애너테이션이다. 대표적인 애너테이션 몇 개만 살펴보자 @Override 우리가 조상의 메서드를 상속받아 구현할 때 발생할 수 있는 문제로는 철자 문제가 있다. 개발자가 의도한 것은 오버라이딩이었지만 철자가 틀리면 의도와는 다르게 동작할 수 있다. cl..
한화시스템 BEYOND SW 캠프 2기 - 2주차 이번주에는 일주일간 계속 DB에 관해서 학습하였다. SW 캠프가 시작하기 전에 커리큘럼을 확인했을 때는 DB를 8일간 한다는 것을 보고 왜 이렇게 많이 하나 생각했지만, 공부해 보니 8일도 부족한 느낌이었다. 우선 지난주에 정리하지 못했던 DB 부분을 먼저 정리하고 기본적인 쿼리문도 함께 정리했다. MySQL MySQL MySQL은 관계형 데이터베이스에서 가장 많이 사용되는 무료 DBMS이다. MySQL에는 대표적으로 두 가지 버전이 있는데 하나는 8.x 버전과 또 다른 하나로 5.x가 있다. MySQL :: What’s New in MySQL 8.0? (Gene hotechstory.tistory.com MySQL - SQL SQL(Structured ..
Replication Replication은 복제라는 뜻으로 하나의 메인 DB 서버의 데이터를 그대로 복제한 하나 이상의 DB서버를 구성하는 것을 의미한다. MySQL의 Replication은 master와 slave를 구성하여 master의 데이터를 slave가 복제하는 방식으로 이루어진다. 하나의 master와 하나 이상의 slave를 두어 단방향 Replication을 구성할 수도 있고 각각의 DB 서버가 master의 역할과 slave 역할을 동시에 하는 양방향 Replication을 구성할 수도 있다. 이러한 Replication 구성은 통해서 Read/Write와 ReadOnly로 분리할 수 있어 고가용성 측면과 부하 분산 및 백업을 수행할 수 있다. Replication의 장/단점 장점 - ..