전체 글

추운 겨울이 다가와 힘겨울지도 몰라 봄바람이 불어오면 이젠 나의 꿈을 찾아 날아
where과 having은 데이터 검색을 할 때 조건을 필터링하기 위해 사용된다. 하지만 동일한 기능을 하지 않기 때문에 상황에 맞춰 사용해야 한다. WHERE select * from 테이블명 where 조건절 항상 from절 뒤에 위치해야 하고 조건에는 다양한 비교연산자들이 사용되어 구체적인 조건을 줄 수 있다. HAVING select * from 테이블명 group by 필드명 having 조건절 항상 group by 뒤에 나오며 where 절과 마찬가지로 비교연산자들을 사용해서 조건을 줄 수 있다. group by 같은 값을 가진 행을 그룹 짓는 SQL 명령어이다. COUNT(), MAX(), SUM() 등 집계함수와 함께 사용한다. 비교 where은 기본적인 조건절로서 우선적으로 모든 필드에 ..
세 가지 명령어 모두 "삭제" 기능을 하지만, 각각 삭제하는 범위와 특징이 다르다. 하나씩 알아보도록 하자 DELETE WHERE절을 사용하여 테이블의 데이터를 하나하나 선택하여 제거하는 방식 WHERE절을 사용하지 않고 모든 테이블의 데이터를 삭제하더라도 내부적으로는 하나하나 선택하여 삭제를 진행한다. 잘못 삭제하였을 경우 commit을 하기 전이라면 ROLLBACK을 통해 되돌릴 수 있다. ROLLBACK을 하기 위한 정보를 기록하기 때문에 TRUNCATE보다는 느리다. 행을 삭제하는 것이기 때문에, 존재하는 데이터의 양이 많다면 삭제될 때마다 많은 system 자원을 소모한다. 원하는 데이터, 행만 삭제할 때는 DELETE를 사용, 전체 데이터, 행을 삭제하고 싶으면 TRUNCATE를 사용한다. D..
접근제어자 클래스와 클래스의 멤버(변수, 메서드, 생성자)를 사용할 때, 접근할 수 있는 범위를 지정해 주는 역할을 한다. 보통 접근제어자 또는 접근지정자라고 부르며 클래스나 클래스 멤버 앞에 붙어있는 public, private 등의 키워드가 접근제어자이다. 클래스의 접근제어자 클래스를 정의할 때 사용 가능한 접근제어자는 public, default 두 가지이다. public : package에 상관없이 모든 클래스에서 접근이 가능하다. default : 생략이 가능하며, 같은 package 안의 클래스에서만 접근이 가능하다. public class Sample1 {}// public 클래스, 모든 클래스가 접근 가능함 class Sample2 {}// default 클래스, 같은 package안의 클..
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)을 저장한다. 이런 형식으로 데이터를 저..
개발의 WinG
나는 나는 자라서 멋진 개발자가 될거야