멋진 개발자

Java에서 문자열을 다루는 클래스로는 String, StringBuffer, StringBuilder 가 있다. 연산이 많지 않을 때에는 어떠한 클래스를 사용하더라도 문제가 발생할 가능성은 없지만, 연산 횟수가 많아지거나 멀티스레드, Race Condition 등의 상황이 자주 발생한다면 각 클래스의 특징을 이해하고 상황에 맞는 클래스를 사용하여야 한다. String String 객체의 가장 큰 특징은 immutable(불변)이다. String str = "hello"; str = str + " world"; System.out.println(str);// "hello world" 위 코드를 보면 단지 "hello"가 저장되어 있는 str에 " world"를 붙인 걸로 착각하기 쉽다. 물론 틀린 말은 ..
Concurrent Collection이란 (병렬 컬렉션) Concurrent(병렬/동시성)이란 단어에서 알 수 있듯이 Synchronized 컬렉션과 달리 여러 스레드가 동시에 컬렉션에 접근할 수 있다. (Thread-safe 하다) Synchronized 컬렉션은 하나의 스레드가 접근 시 다른 스레드는 아예 접근이 불가능하지만, Concurrent 컬렉션은 보관하고 있는 데이터를 여러 부분으로 나눠서 Lock을 걸어 다른 부분에 접근 중이라면 여러 스레드가 동시 접근이 가능하다. 여러 스레드가 한 번에 접근 가능하기 때문에 스레드 대기 시간을 줄여주며, Synchronized 컬렉션보다 성능이 높다. 하나 이상의 스레드가 병렬적으로 read, write 연산을 할 수 있다. 종류 java.util.c..
Thread Pool (스레드 풀) 우리는 프로그램을 개발할 때 다양한 이유로 스레드를 생성한다. 비동기 처리의 일환일 수도 있고, 연산 처리의 효율을 높이기 위함일 수도 있다. 하지만 스레드를 계속해서 생성하고 회수하는 일은 시스템적으로 오버헤드가 상당히 큰 일이다. 스레드를 한 번 생성할 때마다 OS가 해당 스레드를 위한 메모리 영역(스택 등)을 확보해 주고, 스레드가 더 이상 필요 없을 땐 다시 이 메모리 영역을 회수하는 작업이 일어난다. 이 작업은 상당히 큰 비용이 발생하는 작업이기 때문에, 스레드를 계속 생성하고 회수하는 작업을 하게 되면 퍼포먼스에 영향을 끼칠 수밖에 없다. 위와 같은 문제를 해결하기 위해 등장한 것이 바로 Thread Pool이다. 스레드가 모여있는 풀장이라고 생각하면 되는데..
직렬화란? 객체를 바이트 스트림으로 바꾸는 것, 즉 객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 serial 데이터로 변환하는 것이다. 직렬화의 주된 목적은 객체를 상태 그대로 저장하고 필요할 때 다시 생성하여 사용하는 것이다. 역직렬화(Deserialization)는 직렬화의 반대말로, 네트워크나 영구저장소에서 바이트 스트림을 가져와서 객체가 저장되었던 바로 그 상태로 변환하는 것이다. Java 직렬화 사용 법 기본 타입(primitive type)과 java.io.Serialiable 인터페이스를 상속받은 객체는 직렬화를 위한 기본 조건을 충족한다. public class Member implements Serializable { private String name; private String..
단위테스트 단위 테스트를 작성해야 하는 핵심적인 이유는 다음과 같다. 코드를 수정하거나 기능을 추가할 때 수시로 빠르게 검증할 수 있다. 리팩토링 시에 안정성을 확보할 수 있다. 개발 및 테스팅에 대한 시간과 비용을 절감할 수 있다. 테스트 코드를 작성하면 우리가 작성한 코드들에 대해 수시로 빠르게 검증을 받을 수 있으며, 유지보수 및 리팩토링을 할 때에도 안정성을 확보할 수 있다는 장점이 있다. 하지만 그것보다 큰 장점으로는 개발 및 테스팅에 대한 시간과 비용을 절감할 수 있다. 우리는 개발이 끝난 뒤에 문제가 없는지 확인하기 위해 애플리케이션을 실행하고, 직접 수동 테스트를 진행해야 한다. 단위 테스트를 작성하지 않은 코드들은 그렇지 않은 코드들보다 버그가 있을 확률이 높은데, 직접 테스트하는 비용이..
Redis란? 풀네임에서 알 수 있듯이 Dictionary(key-value) 구조로 데이터를 저장하고 관리하는 서버를 말한다. Redis 공식 홈페이지(https://redis.io/docs/about/)에서는 Redis를 이렇게 소개하고 있다. Redis is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine. Redis는 데이터베이스, 캐시, 메세지브로커 및 스트리밍 엔진으로 사용되는 오픈소스, In-Memory 데이터 구조 저장소입니다. Redis provides data structures such as strings, h..
현재 Java 버전은 6개월마다 릴리스 되고 있다.(저번달에 22 버전이 릴리스 되었다.) 로드맵을 보면 LTS, non-LTS가 각각 붙어있다. LTS는 Long Term Support로, 오랜 기간 지원하는 특별한 버전의 에디션을 뜻한다. (대부분 LTS 버전을 사용한다.) Java 8 버전을 사용하여 프로젝트를 진행한 회사들이 많이 있고, 최신 IDE나 프레임워크를 사용하는 곳에서는 11, 17 버전을 사용하는 경우가 있다. (Java와 빠질 수 없는 짝꿍인 SpringBoot는 3.0 버전부터 Java 17 이상만 지원한다고 한다.) Java의 하위 호환성 Java는 하위 호환성이 매우 높게 때문에 8, 11, 17 버전 등과 같이 특정 버전만을 학습하지 않아도 된다. Java 5, 8 버전의 프..
OSI 7 계층이란? 1984년 국제표준화기구(ISO)에서 개발한 모델로서, 네트워크 프로토콜 디자인과 통신 과정을 7개의 계층으로 구분하여 만든 "표준 규격"이다. 초창기의 네트워크는 각 컴퓨터마다 시스템이 달랐기 때문에 하드웨어와 소프트웨어의 논리적인 변경 없이 통신할 수 있는 표준 모델이 나타나게 되었다. OSI(Open System Interconnection)은 개방형 시스템으로, 누구나 참조 및 부가적인 추가가 가능하다. OSI 7 계층이 필요한 이유 계층을 나눈 이유는 통신이 일어나는 과정을 단계별로 파악할 수 있기 때문이다. 흐름을 한눈에 알아보기 쉽고, 사람들이 이해하기 쉽고, 7단계 중 특정한 곳에 이상이 생기면 다른 단계의 장비 및 소프트웨어를 건들지 않고도 이상이 생긴 단계만 고칠 ..
HTTP의 상태 코드는 클라이언트가 보낸 HTTP 요청이 성공했는지 실패했는지를 서버에서 알려주는 숫자 코드다. HTTP 상태 코드는 3자리 숫자로 이루어져 있으며, 총 100 ~ 500번대까지 존재한다. 그리고 각 상태 코드의 첫 번째 자리는 최상위 코드가 되어 다음과 같이 5개의 그룹으로 나뉘어 관리된다. 1XX : 요청이 수신되어 처리 중 2XX : 요청 정상 처리 3XX : 요청을 완료하려면 추가 행동이 필요 4XX : 클라이언트 오류, 잘못된 문법등으로 서버가 요청을 수행할 수 없음 5XX : 서버 오류, 서버가 정상적으로 요청을 처리하지 못함 1XX (정보 전달) 100 Continue (계속) 요청자는 요청을 계속해야 한다. 서버는 이 코드를 제공하여 요청의 첫 번째 부분을 받았으며 나머지를..
프로세스 (Process) 프로세스는 실행 중인 프로그램이라고 할 수 있다. 프로그램은 컴퓨터에 저장되어 있는 코드 덩어리이며, 아직 실행되지 않은 정적인 상태를 말한다. 프로그램을 더블클릭하여 실행하면 메모리에 올라가고 동적인 상태가 되는데 이를 보고 프로세스라고 한다. 위 그림과 같이 프로세스는 Code, Data, Stack, Heap의 형식으로 독립된 메모리 영역을 할당한다. 각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다. 스레드 (Thread) 스레드는 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위이다. 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍된 명령의 가장 작은 시퀀스이다. 하나의 프로세스는 하나 이상의 스..
'is a kind of ~ 추상클래스', 'be able to ~ 인터페이스' 추상클래스 public abstract class 추상클래스 { private String name;// Field public 추상클래스(String name) {// Constructor this.name = name; } public void 메서드() {};// Method public abstract void 추상메서드();// Abstract Method } class 앞에 'abstract' 키워드를 사용하여 정의하며, 하나 이상의 추상 메서드를 가지는 클래스를 말한다. 추상 메서드를 선언하여 상속을 통해 하위 클래스에서 반드시 구현하도록 강제하는 클래스이다. (추상 메서드를 포함하지 않는 클래스도 abstrac..
HashTable HashTable은 Hash를 이용하여 연관 배열을 구현한 자료구조이다. 해시 함수를 통해 key를 해시값으로 매핑하고, 이 해시값을 인덱스로 하여 value값을 key와 함께 저장하여 검색을 빠르게 하기 위한 자료구조이다. 아래 그림과 같이 key는 이름, value는 전화번호를 저장한다고 가정해 보자 위 그림을 보면 John Smith의 데이터를 저장할 때 index = hash_function("John Smith") % 16을 통해서 index값을 구해내고, array[index] = "521-1234"를 저장한다. hash_function를 통해 key에 대한 index값을 구하고 해당 index값을 주소로 buckets에 값(value)을 저장한다. 이런 형식으로 데이터를 저..
제네릭 (Generic) 자바 제네릭(Generic)은 "데이터의 클래스 타입을 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것"을 의미한다. ArrayList list1 = new ArrayList(); ArrayList list2 = new ArrayList(); ArrayList list3 = new ArrayList(); 위와 같이 List마다 안에 들어갈 객체들이 각각 다를 경우 제네릭을 통해 다양한 자료구조를 사용할 수 있다. 만약 제네릭이 없었다면 String클래스, Integer 클래스 등 하나하나 타입에 맞게 자료구조를 만들어야 한다. 하지만, 제네릭은 이러한 문제를 해결해 준다. 특징 제네릭은 다이아몬드 표기법으로 타입 파라미터를 지정한다. 데이터 타입은 클래스 혹은 인..
HTTP Method는 클라이언트와 서버 사이에 이뤄지는 요청과 응답 데이터를 전송하는 방식이다. 서버에 주어진 리소스에 수행하길 원하는 행동, 서버가 수행해야 할 동작을 지정하는 요청을 보내는 방법이다. 총 9가지가 있으며 주로 GET, POST, PUT, PATCH, DELETE를 사용한다. 주요 메서드 GET : 리소스 조회 POST : 요청 데이터 처리, 주로 등록에 사용 PUT : 리소스를 대체(덮어쓰기), 해당 리소스가 없으면 생성 PATCH : 리소스 부분 변경 (PUT이 전체 변경, PATCH는 일부 변경) DELETE : 리소스 삭제 기타 메서드 HEAD : GET과 동일하지만 메시지 부분(body 부분)을 제외하고, 상태 줄과 헤더만 반환 OPTIONS : 대상 리소스에 대한 통신 가능..
Primary Key(기본 키) SQL 데이터베이스에서 특정 레코드를 유일하게 식별하기 위해 사용되는 필드 또는 필드의 집합 테이블에서 각 레코드를 식별하는 데 사용되며, 테이블의 각 레코드에는 Primary Key 값이 반드시 있어야 한다. 특징 각 레코드에 대해 고유하기 때문에 중복이 불가능하다. NULL 값이 허용되지 않는다. 레코드를 식별하는 데 사용, 테이블 당 하나의 기본키만 가질 수 있지만 경우에 따라 1개 이상의 기본키를 정의할 수도 있다. (다수 열 기본 키, 복합 기본 키) 생성 // 방법 1 CREATE TABLE USER ( id INT PRIMARY KEY, name VARCHAR, password VARCHAR ); // 방법 2 CREATE TABLE USER ( id INT ..
개발의 WinG
'멋진 개발자' 카테고리의 글 목록 (3 Page)