-
모놀리식 지옥에서 벗어나라
모놀리식 지옥에서 벗어나라 모놀리식 아키텍처의 장점 개발이 간단하다 애플리케이션을 쉽게 변경할 수 있다 테스트하기 쉽다 배포하기 쉽다 확장하기 쉽다 모놀리식 아키텍처의 단점 (커질수록) 너무 복잡해서 개발자가 주눅든다 개발이 더디다 커밋부터 배포까지 길고 험난한 여정 확장이 어렵다 갈수록 한물간 기술 스택에 발목이 잡힌다 확장 큐브와 마이크로 서비스 X축 확장 : 다중 인스턴스에 고루 요청 분산 모놀리식 애플리케이션의 확장 수단 부하분산기 뒷면에 애플리케이션 인스턴스 N개를 띄워 놓고 부하분산기가 인스턴스에 고루 분배하는 방법 ... Read More
-
마이크로서비스는 코드 작성 이상을 의미
마이크로 서비스를 구축할때 고려해야할 서비스가 실행될 환경과 확장 및 회복성에 대한 방법을 고민해야한다. 적정크기 마이크로서비스가 과도한 책임을 맡지 않도록 어떻게 적절한 크기로 만들 수 있을까? 적절한 크기의 마이크로서비스는 애플리케이션의 신속한 변경과 전체 애플리케이션의 전반적인 장애를 줄일 수 있다. 단위가 작을 수록 코드 변경에 따른 복잡성을 낮추고 코드 배포 시간이 줄어드는 유연성을 가질 수 있다. 위치투명성 다수의 인스턴스가 재빨리 시작하고 종료될 때 서비스 호출에 대한 물리적 상세 정보를 관리할 수 있는 방법 → 아직 잘 이해안가요 회복성 장애가 발생한 서비스를 우회... Read More
-
Item8- finalizer와 cleaner 사용을 피하라
finalizer와 cleaner 사용을 피하라 키워드 : finalizer, cleaner finalizer 예측할 수 없고 상황에 따라 위험할 수 있어서 일반적으로 불필요 (오작동, 낮은 성능, 이식성 문제의 원인) Java 9부터 deprecated API로 지정되어 cleaner를 대안으로 사용. cleaner finalized 보다는 덜 위험하지만 여전히 예측할 수 없고, 느리고, 일반적으로 불필요함 cleaner.register(this, state); cleaner.clean(); 문제점 finalizer와, cleaner는 실행 시점을 예측할 수 없... Read More
-
Item7 - 다 쓴 객체의 참조를 해제하라
다 쓴 객체의 참조를 해제하라 키워드 : Obsolete Reference, Garbage Collection, Memory Leak 정의 Obsolete Reference : 다시 참조 되지 않을 객체 Garbage Collection : Obsolete Reference 상태인 객체를 회수함. Memory Leak : 메모리가 할당 되었지만, 더 이상 메모리가 필요없는 객체에 대한 메모리가 릴리즈 되지 않는 현상 예시 public class Stack { private Object[] elements; // !!전역변수!! ... Read More
-
Item4 - 인스턴스화를 막으려거든 private 생성자를 사용하라
인스턴스화를 막으려거든 private 생성자를 사용하라 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것이 아니다. ex. java.lang.Math, java.util.Arrays 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어 주기 때문에 사용자는 생성자가 자동으로 생성된것인지 구분할 수 없다. 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없는데 그 이유는 하위 클래스를 만들어 인스턴스화 할 수도 있고, 사용자에게 상속해서 사용하라는 의미로 만들어놓은 것처럼 오해를 살 수 있는 문제점이 있다. 그렇다면 ... Read More
-
Item3 - private 생성자나 열거 타입으로 싱글턴임을 보장하라
private 생성자나 열거 타입으로 싱글턴임을 보장하라 싱글턴(singleton) 정의 : 인스턴스를 오직 하나만 생성할 수 있는 클래스 생성 생성 자는 private 으로 감춰두고, public static 멤버가 final필드인 방식 private 생성자는 public static final 필드인 Elvis.INSTANCE를 초기화할 때 딱 한번 호출된다. API에 명백히 해당 객체가 싱글턴임이 드러난다. public class El... Read More
-
Item2 - 생성자에 매개변수가 많다면 빌더를 고려하라
생성자에 매개변수가 많다면 빌더를 고려하라 정적 팩터리와 생서자에 동일한 제약은 선택적 매개변수가 많다면 적절히 대응하기 어렵다는 점이고, 해결하기 위한 방법은 다음과 같다. 점층적 생성자 패턴 (telescoping constructor pattern) 원하는 매개변수를 모두 포함한 생성자 중 가장 짧은 것을 골라 호출하면 된다. 보통 사용자가 원치않는 매개변수까지 포함하기 쉬워, 그런 매개 변수에도 값을 지정해 주어야 한다. 필드 수가 늘어나면 그 만큼 시그니처가 다른 생성자가 늘어나게 되고, 매개변수를 맞게 넣었는지도 주의해야 한다. 실수로 매개변수의 순서를 바꿔서 넣는 경... Read More
-
Item1 - 생성자 대신 정적 팩터리 메서드를 고려하라
생성자 대신 정적 팩터리 메서드를 고려하라 인스턴스 얻는 방법 public 생성자 public Dog (String name) { this.name = name; } 정적 팩터리 메서드 (static factory method) public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 정적 팩터리 메서드의 장점 1) 이름을 가질 수 있다. 반환될 객체의 특성의 쉽게 묘사할 수 있다. java BigInte... Read More
-
쿠버네티스 클러스터 구축
Google Kubernetes Engine 환경 설정 GCP에서 제공하는 관리형 쿠버네티스 서비스를 GKE(Google Kubernetes Engine)를 사용 GKE는 쿠버네티스의 개발을 주도하는 구글이 제공하는 가장 널리 사용되는 관리형 쿠버네티스 서비스 중 한가지. Step1. GCP 계정을 만든다. Step2. 프로젝트를 만든다. 프로젝트명은 중복 가능성이 있기 때문에 프로젝트를 유일하게 식별하기 위해 프로젝트 ID가 추가로 설정된다. Step3. GCP SDK를 설치한다. https://cloud.google.com/sdk/docs/install 설치가이드에 gc... Read More
-
Kotlin Ktor로 간단한 HTTP 목서버 만들기
연동 테스트를 하고 싶은데 아직 연동을 하지 못하는 경우가 있어서 간단히 목서버를 만들어서 다음을 검증하고 싶었다. Request 가 잘 가는지 Response 가 내가 만든 객체로 잘 받아지는지 응답을 받은 이후 로직이 잘 수행이 되는지 python으로 목서버를 만드는 경우도 보았는데, 그동안 관심이 있었던 코틀린을 공부겸 활용해보고자 Kotlin + Ktor를 활용하여 목서버를 만들어보았다. 사용 IDE는 인텔리제이이다. Spring은 Spring Initializer가 있는데 코틀린도 Ktor Project Generator라는 것이 있다. ktor.io 사이트에 ... Read More
-
스웜을 이용한 실전 애플리케이션 개발
Chapter04 스웜을 이용한 실전 애플리케이션 개발 이 장을 이해하고 나면 컨테이너 중심의 애플리케이션 개발에 대한 기초적인 기술을 습득할 수 있다. 웹 애플리케이션 구성 아키텍처 오케스트레이션 시스템으로 도커 스웜을 사용 (도커 스웜 클러스터 구축 참고 : https://heejeongmin.github.io/docker/2021/11/07/docker-container_best_practice.html) nignx : 애플리케이션 프론트엔드 서버 및 API 앞단에 리버스 프록시 역할을 한다. 캐싱, 백엔드에 대한 유연한 라우팅, 접근 로그 생성등의 역할을 한다. ... Read More
-
컨테이너 실전 구축 및 배포
Chapter03 컨테이너 실전 구축 및 배포 컨테이너 1개의 하나의 관심사 하나의 컨테이너는 한 가지 역할이나 문제 영역에 집중해야한다. 2장의 젠킨스 마스터와 슬레이브를 각각 컨테이너로 분리하였을때 슬레이브의 인스턴스가 부족한 경우 슬레이브만 늘리면된다. 웹 어플리케이션 스택에서도 프록시, 애플리케이션, 데이터베이스가 각자의 역할이 있고 이를 각자의 컨테이너로 나눈다고 생각하면 된다. 컨테이너의 이식성 도커의 큰 장점은 이식성에 있지만, 단점 또한 존재한다. 커널 및 아키텍처의 차이 도커에서 사용되는 컨... Read More
-
도커 컨테이너 배포
Chapter02 도커 컨테이너 배포 01 컨테이너로 애플리케이션 실행하기 도커 이미지 vs 도커 컨테이너 도커 이미지 = 도커 컨테이너를 구성하는 파일 시스템 설정 + 실행할 애플리케이션 설정 도커 컨테이너 = 도커 이미지가 구체화돼 실행되는 상태 도커 이미지 다운로드 docker image pull gihyodocker/echo:latest 처음 받으면 모든 레이어 이미지를 받는 것을 볼수 있다. 도커 명령어 모음 도커 명령어 용도 rem... Read More
-
레플리케이션과 그 밖의 컨트롤러 - 관리되는 파드 배포
Chapter4. 레플리케이션과 그 밖의 컨트롤러 : 관리되는 파드 배포 파드를 안정적으로 유지하기 파드가 노드에 스케줄링되는 즉시, 해당 노드의 Kubelet은 파드의 컨테이너를 실행하고 파드가 존재하는 한 컨테이너가 계속 실행되게 된다. 컨테이너의 주 프로세스가 크래시가 발생하면 Kubelet이 컨테이너를 다시 시작하는데 이때 쿠버네티스가 어플리케이션을 다시 실행해 준다. 하지만 다시 시작되길 원치않는 크래시가 발생하는 경우 (ex. oome) 쿠버네티스가 다시 실행하지 않도록 알려줄 수도 있지만, 이렇게 자동으로 말고, 외부에서 어플리케이션의 상태를 체크하면 좀더 유연하게 어플리케이션을 다시 시작해야하... Read More
-
파드 - 쿠버네티스에서 컨테이너 실행
Chapter3. 파드: 쿠버네티스에서 컨테이너 실행 컨테이너는 단일 프로세스를 실행하는 목적을 설계되었다. (프로세스가 자기 자신의 자식 프로세스 생성하는 것 제외) 여러 프로세스를 단일 컨테이너로 묶지 않기 때문에, 컨테이너를 함께 묶고 하나의 단위로 관리할 수 있는 또 다른 상위 구조가 필요하고, 그게 파드이다. 컨테이너 모음을 사용 밀접하게 연관된 프로세스를 함께 실행하고 단일 컨테이너 안에서 모두 함께 실행되는 것 처럼 (거의) 동일한 환경을 제공할 수 있으면서도 이들을 격리된 상태로 유지 할 수 있다. 같은 파드에서 컨테이너 간 부분 격리 단일 컨테이너를 격리하는 것이 아닌, 컨테이너 그룹을 ... Read More
-
Kubernetes intro
쿠버네티스 클러스터 설치 이 책에서는 로컬머신에 단일 노드 쿠버네티스 실행하는 방법과, 구글 쿠버네티스 엔진에 실행중인 클러스터에 접근하는 방법을 다룬다. Minikube를 활용한 단일 노드 쿠버네티스 클러스터 실행 Minikube는 로컬에서 쿠버네티스를 테스트하고 애플리케이션을 개발하는 목적으로 설치를 도와주는 도구이다. Minikube 설치 a. http://github.com/kubernetes/minikube 의 문서를 따라 설치 나는 homebrew 로 설치하는 방식을 선택함. b. 설치 후 쿠버네티스 클러스터를 바로 시작할 수 있다. m... Read More
-
Docker intro
도커 명령어와 동작방식 docker run <image> docker run <image>:tag docker run 을 실행하였을 때 도커가 하는 일 로컬 머신에 이미지가 저장되어 있는지 확인 로컬에 이미지가 없으면 레지스트리(도커허브)로 부터 이미지를 pull 격리된 컨테이너에서 이미지를 실행 :tag가 없다면 최신본을 사용하는 것으로 간주된다. 이미지를 위한 Dockerfile 생성 애플리케이션을 이미지로 패킹하기 하려면 Dockerfile 이라는 파일을 생성한다. ... Read More
-
Kubernetes Intro
Chapter1. 쿠버네티스 소개 1장에서 다루는 내용 - 최근 소프트웨어의 개발과 배포의 변화 이해 - 애플리케이션을 격리하고 컨테이너를 사용해 실행환경 차이 줄이기 (실행환경 : 개발/스테이징/프로덕션) - 쿠버네티스에서 사용되는 컨테이너와 도커의 이해 - 쿠버네티스로 개발자와 시스템 관리자의 작업 간소화하기 1. 쿠버네티스와 같은 시스템이 필요한 이유 – 모놀리스 애플리케이션에서 마이크로 서비스로 전환 모놀리스 애플리케이션 모놀리스 애플리케이션은 모든 것이 서로 강하게 결합 ... Read More
-
Lambda
람다란 ? 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행할 수 있는 서버리스 컴퓨팅 서비스 다른 AWS 서비스에서 코드를 자동으로 트리거하도록 설정하거나, 웹 또는 모바일 앱에서 직접 코드를 호출해서 사용할 수 도 있음. 사용한 컴퓨팅 시간에 대해서만 비용을 지불함으로, 코드가 실행되지 않을 때에는 요금이 부과되지 않음 람다의 모든 호출의 실행시간은 15분으로 제한된다. 비용은 호출 건 마다 100ms 단위로 측정하여 부과된다. 단순한 리소스 모델로 128MB ~ 10GB의 용량(메모리) 선택이 가능하며, 메모리량에 따라 나머지 설정을... Read More
-
SQS
Amazon SQS 대기열 유형 하루에 수십억 건의 메세지를 처리할 수 있다. 대기열 종류 표준 대기열 : 대기열에는 최소 1회 전송 및 최선의 정렬을 제공한다. (순서보장 안함, 중복 가능) API작업당 거의 무한한 수의 초당 트랜잭션을 가짐. FIFO 대기열 : 선입선출의 방식으로 메시지가 전송된 순서대로 정확히 한번 처리될 수있도록 설계되어 있다. 일괄 처리 초당 최대 3,000개 메시지 지원, 일괄 처리 아닌 api작업별은 초당 최대300개 배달 못한 편지 대기열 (DLQ) : 처리되지 못한 메시지 대기열로, 최대 처리 시도 수가 도달한 후에 실패시 메... Read More
-
API Gateway
Amazon API Gateway 란 ? Amazon API Gateway를 이용하면, 개발자가 AWS Lambda 함수와 같은 API를 생성, 게시, 유지 관리, 모니터링을 보호할 수 있다. (외부에서 다이렉트로 리소스에 접근하지 않기 때문) 리소스 정책은 지정된 보안 주체 (보통 IAM 사용자 또는 역할)가 API를 호출할 수 있는지 여부를 제어하기 위해 API에 연결하는 JSON 정책 문서이다. 이런 정책을 API 메서드와 연결항ㄹ 수 있고 다음 두가지 유형의 정책을 지원하여 보호할 수 있다. API 생성, 배포 및 관리 API의 메서드 호출 및 캐시 새로 ... Read More
-
IAM (AWS Identity and Access Management)
Triple A 에 대한 관리 Authentication Authorization Auditing IAM 소개 사용자 그룹 역할 정책 인증 (내가 누구인지 Authorization) 사용자 (USER) username / password AccessKey → 로그인 하는 방법에 따라서 필요한 정보가 다를 뿐. 사용자는 로그인을 통해 인증. → AccessKey공유하지 말것! CloudTrail에 한 기록이 모두 그 사람의 AccessKey로 남음 ... Read More
-
RDS/DDS (Dynamo DB) / 데이터베이스 캐싱
AWS의 관리형 데이터베이스와 비관리형 데이터베이스 차이 완전 관리형 데이터베이스인 경우는 사용자는 쿼리 최적화에 신경쓰면된다.! Amazone Aurora 완전 관리형, 관계형 데이터베이스로 MySQL과 PostgreSQL과 호환된다. - MySQL 처리량의 최대 5배, PostgreSQL의 처리량의 최대 3배까지 처리 - 오픈소스이면서 상용수준의 performance를 내는 것이 목적이다. - 자동으로 3개의 가용 영역에 6개의 복제본을 생성한다. 이런 이유로 생성시 multi AZ를 선택하는 옵션이 없음. - DB도 내부적으로 EC2 기반으로 만들기 때문에... Read More
-
VPC 네트워크 계층
public/private cloud VPC (네트워크 격리) VPC Peering (여러 환경을 연결하는 네트워크 확장) VPC AWS 계정 전용 가상 네트워크 Region 레벨 서비스 IPv4, IPv6 주소 범위 안에 존재 점유 리소스에 대한 특정 CIDR 범위를 생성할 수 있다. (서브넷) 보통 소규모 단일 애플리케이션인 경우 VPC한개를 사용하지만 보통은 다중 VPC, 복수 계정(meshlabs, meshtools)을 사용한다. 기본적으로 계정당 5개의 vpc가 가능하나, 요청하면 늘릴 수 있다고 한다. 서브넷을 사용한 VPC ... Read More
-
VPC 고가용성
네트워크 연결 VPC 엔드포인트 로드 밸런싱 고가용성 VGW (Virtual (Private) Gateway) on-premis에서 aws로 넘어갈때 과도기라던가, DB는 on-premis에 있다던가 하는 이유로 클라우드와 온프레미스를 연결해야하는 경우가 있다고 한다. 이때 사용할 수 있는것이 VGW(Virtual Private Gateway)라고 한다. Private 하긴 하지만 인터넷을 사용하기 때문에 보안이 걱정된다면, AWS Direct Connect를 사용할 수 있다고 한다. AWS Direct Connect를 사용하면, 전용 광케이블을 사용할 수 있다고 ... Read More
-
라우팅
라우터 이더넷, 무선 랜은 같은 네트워크 안에서 데이터를 전송할 수 있다. 다른 네트워크에 데이터를 보내려면 네트워크를 서로 연결해야 하는데 이때 라우터를 통해 데이터를 전송 할 수 있다. 라우터는 데이터의 목적지가 어느 네트워크에 접속해 있는지 판단하여, 연결된 네트워크의 라우터로 전송하는 라우팅을 수행한다. 데이터 전송 전송 대상은 IP 패킷으로 TCP/IP 계층의 인터넷 계층에 속하기 때문에 라우팅은 인터넷 계층에서 동작하게 된다. IP패킷의 IP 헤더 안의 목적지 주소를 확인한 후, TTL과 헤더 체크섬만 변경한다. (NAT 주소 변환이 이루어질때만 IP주소도 변환) 그리고, 네... Read More
-
S3
S3 : Simple Storage Service AWS 가장 오래된 서비스 중 하나 (S3, EC2, SQS) Serverless. 사용자가 구축이 따로 필요없다. 리전레벨 서비스로 이름은 전세계에서 유니크 하다 Object Storage로 파일 일부 변경은 안되고, 전체 override 되는 형식이며 계층 구조 아님 저장하면 객체마다 접근 가능한 주소를 제공해 주는데 S3는 리전레벨 서비스 이지만, 주소는 Global하게 고유하다. 저장하는 객체 건당은 5TB 를 넘을 수 없지만 전체 데이터의 용량은 필요한 만큼 저장 가능 저장시 자동으로 3개의 AZ에 중복 저장하여 한 AZ에 ... Read More
-
EC2
EC2 : Elastic Computing Cloud 서버가 처리할 수 있는 모든 것을 한다. 정적 사이트 호스팅은 s3로 가능하지만, 동적 웹사이트 호스팅은 EC2 필요 EC2 서버라고 부르지 않고, EC2 인스턴스라고 부르는 이유는 일회용(?) 처럼 교체/증설/축소 가능해서이다. 그래서 가상머신과 물리적 서버를 비교할때 가축과 애완이라고 함. 반복성/재사용성/복구성/백업 EC2 인스턴스 유형 세대가 높을 수록 인스턴스 성능이 더 좋고 더 좋은 가격 대비 가치를 제공받을 수 있다. t타입 : 범용 인스턴스인 T타입의 경우, credit이라는 개념이 있는데, 기준 cpu보다 낮게 ... Read More
-
이더넷과 무선 LAN
네트워크의 기본 구성 및 데이터 전송 방법 네트워크의 기본적인 구성은 레이어2 스위치로 하나의 네트워크를 구성하고, 라우터 또는 레이어3 스위치로 각 네트워크를 서로 연결한다. 다른 네트워크에 접속된 서버까지의 데이터 전송은 같은 네트워크 내의 전송을 반복 우선 같은 네트워크상에 있는 라우터로 데이터를 전송한 다음 그 라우터기준으로 같은 네트워크에 있는 라우터로 전송하여 최종적으로는 원하는 목적지에 데이터를 전송 네트워크 내에서 전송을 반복하는 데에 필요한 프로토콜이 네트워크 인터페이스층에 속한 이더넷과 무선 LAN(WIFI) 이다. 이더넷으로 연결되면 유선이고,... Read More
-
웹사이트의 동작 원리
웹사이트는 어떻게 생겼을까? 웹사이트란 웹서버 애플리케이션이 공개하는 다양한 웹페이지의 집합이다. 웹사이트를 만들려면 웹서버에 애플리케이션을 설치하고 공개할 웹페이지를 결정하고 페이지는 다음과 같은 정적 리소스들을 가지고 만든다. HTML(Hyper Text Markup Language) CSS (Cascading Style Sheet) URL 의 의미 <스킴>://<호스트명>/<경로명> 스킴 : 웹브라우저가 웹서버의 데이터에 접속하기 위한 프로토콜 호스트명은 호스트명에서 IP 주소로 변환하는 DNS 이름해석이 내부적으로 이루어진다. ... Read More
-
네트워크의 공통언어 Part 2
인터넷에서 사용하는 주소와 사설 네트워크에서 사용하는 주소 공인 IP 주소 (퍼블릭 IP 주소, 물리적 주소) 인터넷에서 사용하는 IP 주소로, 인터넷에서 통신하기 위해서 반드시 공인된 주소가 필요하다. 중복되지 않도록 관리되며, 인터넷 접속 서비스를 계약하면 할당되게 된다. 사설 IP 주소 사내 네트워크등 사설 네트워크에서 이용하는 IP 주소로 범위는 다음과 같다. - 10.0.0.0 ~ 10.255.255.255 → A class 대역 (40억대) - 172.16.0.0 ~ 172.31.255.255 → B class 대역 (65,000 대 정도) - 192.168.0.0 ~ 19... Read More
-
Thread
Process 운영체제로부터 자원을 할당받은 작업의 단위. 프로그램을 수행하는데 필요한 데이터, 메모리, 자원, thread로 구성되어 있다. 운영체제 관점에서는 프로세스가 최소 작업단위이다. (스레드는 CPU 입장에서 최소 작업단위이다) 안정성을 위해 운영체제는 프로세스가 자신에게 할당된 메모리내의 정보만 접근할 수 있도록 강제하지만, 컴퓨터 프로세스간 통신 프로세스인 IPC(Inter-Process Communication)를 사용하면 프로세스간 정보를 주고 받는 것이 가능하다. Thread 프로세서의 자원을 이용하여 실제로 작업을 수행하는 주체이기 때문에 모든 프로세스는 하나 이상의 Thr... Read More
-
네트워크의 공통언어 Part 1
호스트 : TCP/IP로 통신하는 PC와 스마트폰, 각종 네트워크 기기전반을 호스트라고 부른다. 데이터를 전송하는 역할을 하는 계층 (TCP/IP 모델 기준) 네트워크 접근 계층 역할 같은 네트워크 안에서 데이터를 전송. 하나의 네트워크는 라우터와 레이어3 스위치로 구획되는 범위 또는 레이어 2 스위치로 구성하는 범위이다. (네트워크를 만드는 것 : 구체적인 네트워크 구성 사진) 프로토콜 유선 이더넷 무선 LAN(Wi-Fi) PPP (Point-to-Point Protocol) **점대점 프로토콜(영어: Point-to-Point Protocol, PP... Read More
-
SOLID
설계 원칙 5가지 단일 책임 원칙 (Single Responsibility principle : SRP) 개방-폐쇄 원칙 (Open-closed principle : OCP) 리스코프 치환 원칙 (Liskov substitution principle : LSP) 인터페이스 분리 원칙 (Interface segregation principle : ISP) 의존 역전 원칙 (Dependency Inversion principle : DIP) 1. 단일 책임 원칙 (SRP: Single responsibility principle) 정의 : 클래스는 단 한개의 책임을 가져야 한다. ( ... Read More
-
네트워크를 만드는 것
네트워크를 구성하는 기기 라우터 레이어 2 스위치 레이어 3 스위치 위 3가지 기기의 공통점 : 데이터를 전송한다. 위 3가지 기기의 차이점 : 데이터에 부가된 제어정보를 감지하여 전송할 곳을 결정한다. 데이터 전송 처리 절차 : 데이터 수신 : 물리적인 신호를 다시 디지털신호로 (0, 1) 변경한다. 데이터 보낼 곳 결정 : 데이터에 부가된 제어정보를 감지하여 전송할 곳을 결정한다. 데이터 전송 : 디지털 신호를 다시 물리적 신호로 변경한다. 스위치와 라우터의 차이 스위치 작동... Read More
-
Java 8 JVM
JVM (Java Virtual Machine) 자바 가상 머신으로 자바의 바이트코드를 OS에 맞게 해석해주는 역할을 한다. 자바의 바이트 코드는 Java Compiler에 의해서 .java 에서 .class 라는 Java byte code로 변환이 된다. 기계어가 아니기 때문에 OS에서 바로 실행되지 않고 JVM이 OS에 맞게 해석을 해준다. ( → OS에 상관 없이 실행될 수 있음) JVM의 구성 Class Loader 자바 클래스를 JVM에 동적로드하는 자바 런타임 환경 (JRE)의 일부이다. 런타임 시점에 클래스를 로딩하게 해주며 클래스의 인스턴스를 생성하면 클래스 로더를 통해 ... Read More
-
스프링 시큐리
Spring Security? 인증(Authentification)과 인가(Authorization) 기능을 제공하는 프레임워크 인증(Authentification) : 유효한 사용자인지 확인 인가(Authorization) : 유효한 사용자가 수행할 수 있는 권한을 확인 Spring Security의 필터기반 동작 Spring Security에서 FilterChainProxy를 제공하는데 해당 프록시가 을 통해 인증을 위한 여러 필터들을 사용할 수 있다. (참고 : https://docs.spring.io/spring-security/site/docs/5.4.5/reference/html5/... Read More
-
네트워크의 기본
무엇을 위해서 네트워크를 이용할까 ? PC, 정보 단말기기, 서버 간에 네트워크를 통하여 데이터를 주고 받을 수 있게 한다. 누가 이용할 수 있는 네트워크인가? 네트워크 사용 주체를 기반으로 크게 사설네트워크와 공용네트워크 2가지로 나뉜다. 사설 네트워크 (Private Network) 사설 네트워크란 ? 특정 집단에만 접속할 수 있도록 제한한 사설 IP 주소로 구축된 네트워크로 회사에서는 인트라넷이라고 부르기도한다. 주로, 비인가자가 접근하지 못하게 하기 위한 보안측면에서 사용한다. 공개 범위에 따라 인트라넷과, 엑스트라넷으로 나뉘기도 한다. 인트라넷... Read More
-
Filter & Interceptor는 언제 작동할까 ?
작동순서 : Filter → Interceptor → AOP 공통 프로세스 관리를 위해 스프링에서 사용할 수 있는 기능으로는 다음 3가지가 있다. 하는 역할이 비슷한데 언제/어떻게 작동하는지는 다음과 같다. Filter : DispatcherServlet 이전에 실행되며 스프링의 자원에 도달하기 이전에 처리된다. 주로 인증처리 / URL에 따른 처리 / HTTP 요청과 응답을 변경가능하다. 필터가 여러개인 경우, FilterRegistration에 등록하여 순서를 정할 수 있고, filterChain에 의해서 순서대로 실행된다. Interceptor : 스프링 컨텍스트내부에서... Read More
-
Junit4에서 Junit5
Junit4에서 Junit5로 넘어갈때 어떤 변화 ? Junit5는 다음과같이 세가지 모듈로 구성되어 있고, JUnitPlatform 위에 Jupiter를 통해서 API를 제공받는다. Junit5에서도 Junit4는 기본적으로 동작하는데, 그 이유는 JUnit Platform 위에 Vintage 구현체를 통해서 가능하다. JunitPlatform : 테스트를 실행해주는 런처 및 TestEngine API 제공 Jupiter : TestEngine API의 구현체로 JUnit 5 제공 Vintage : Junit 4와 3을 지원하는 TestEngien 구현체 ... Read More
-
Java 8 Stream
Stream? 데이터를 담고 있는 저장소 스트림 데이터는 오직 한번만 처리 가능 스트림이 처리하는 데이터 소스는 변경되지 않는다. (Functional in nature) 병렬처리가 가능하다 Stream’s operation Intermediate Operation Stateless / Stateful (sorted 와 같이 source를참조해야 하는 경우) Terminate Operation Lazy Invocation of Intermediate Operation Terminate Operation 없이 Intermediate Operatio... Read More
-
Java 8 Optional
Optional instead of Null Reference null을 리턴하는 상황이거나, null 체크를 개발자가 하지 않고, 참조하는 경우 NullPointerException이 발생할 수 있다. 유연하게 에러를 대처하고자 나온 것이 Optional로 값이 들어 있을 수도 있고, 없을 수도 있는 컨테이너. Optional Return 방법 Optional.empty() Optional.of() Optional.ofNullable() of() null을 가질 수 없어서, null을 반환하는 경우 NPE 발생. null 일 가능성이 있는 경우에는 ofNullable()을 사용하여야 한다. ... Read More
-
Java 8 Lambda
함수형 인터페이스 추상메서드를 딱 하나만 가지고 있는 인터페이스 @FunctionalInterface 어노테이션을 가지고 있는 인터페이스 Static & Default Method 인터페이스에 추상메서드 외에 Static, Default 메서드를 사용할 수 있게 되었다. Default 메서드의 큰 장점은 해당 인터페이스를 구현하는 구현체에서는 필수로 override하지 않아도 된다는 점이다. 자바의 함수형 프로그래밍 함수를 일급객체로 사용할 수 있다. (First-class citizen) 객체... Read More
-
JPA 영속성 컨텍스트
영속성 컨텍스트 (persistence context) 개념 : Entity를 보관/관리하는 환경으로, Entity Manager를 생성할때 1개가 생성되는 논리적인 개념이다. 특징 영속성 컨텍스트에서 관리되는 Entity는 식별자 값으로(@Id) 구분하기 때문에 값이 반드시 있어야 한다. (Id 생성 전략이 IDENTITY를 사용하는 경우의 예를 뒤에서 확인하면 좀더 이해가 됨) 영속성 컨텍스트에서 관리되는 Entity는 트랜잭션이 커밋되면 데이터베이스에 반영된다. 영속성 컨택스트에서 관리되는 Entity에 대해서는 다음과 같은 기능을 사용 가능하다 ... Read More
-
JPA
ORM 용어 : Object-Relation Mapping 개념 : 객체(클래스)와 관계(관계형 데이터 베이스)와의 매핑을 의미 합니다. 객체 지향 프로그래밍은 클래스를 사용하고 관계형 데이터 베이스는 테이블을 사용하는데, 두 모델간의 불일치를 해소하기 위해 객체간의 관계를 바탕으로 SQL을 자동생성하여 불일치를 해소 종류: Hibernate, EclipseLink, DataNucleus 가 있고, 이중 Hibernate가 가장 성숙한 프레임워크로 많이 사용됨. JPA 용어 : Java Persistance API 개념 : Hibernate를 기반으로 만든 신표준 ORM 기술로,... Read More
-
디코딩 경험 (sun.misc.Base64Encoder와 java.util.BASE64 및 디코딩 한글깨짐)
sun.misc.BASE64Encoder의 문제 첫 번째 작업은 회원 인증강화 작업이었는데, 인증파트에서 암호화된 값을 넘겨주면 나는 그것을 디코딩해서 사용하는 작업이었다. 암호화된 값은 {key:value, key:value} 로 되어 있었고, 이 값이 처음에는 base64 인코딩 후 Seed암호화를 한번 더 거친 값이었다. 따라서 나는 반대로 SEED로 복호화를 먼저 하고 BASE64 디코딩을 하면 되는 작업이었는데, 문제는 BASE64로 디코딩을 했을때였다. 결론 부터 말하지면, BASE64로 인코딩을 하는 쪽에서 SUN 패키지를 사용했기 때문에 발생하였는데, 현상은 이랬다. SEED로 복호화를 하면 아... Read More
-
스프링 싱글톤 사용시 주의하기
스프링의 빈은 싱글톤으로 기본 작동하기 때문에 빈에 전역 변수가 있으면 스레드에 걸쳐 값이 공유가 되게 된다. 아래 참고한 사이트 들을 기반으로 빈의 Scope을 달리하여 각각 Singleton, Prototype, Request, Session Scope을 테스트 해보았다. 참고한 사이트 https://www.baeldung.com/spring-bean-scopes https://stackoverflow.com/questions/13802636/bean-marked-with-prototype-scope-not-working-in-spring 싱글톤(Singlet... Read More
-
주입받은 객체가 왜 null일까?
스프링 빈이 아닌 객체에 스프링빈을 사용하여야 하면, 스프링 컨텍스트에서 관리하지 않기 때문에 주입으로는 해결할 수가 없다. 그래서 스프링에서 주입이 된 bean을 들고 올 수 있게 ApplicationContext를 사용할 수 있다. 문제 코드 아래처럼 MutlThread라는 객체에서 BeanOne을 주입받아 호출을 하면 NullpointerException이 발생한다. MultiThread를 제외하고 모두 스프링 빈인 상태이다. (@RestController, @Component) 해결 방법 왼쪽처럼 ApplicationContextAware를 구현하는 BeanUti... Read More