분류 전체보기 87

useValue, useClass, useFactory

{ provide: 'CONFIG', useValue: { apiUrl: 'http://api.example.com', timeout: 3000 }}1. useValue 직접 적인 값 주입 설정값, 상수 주입 혹은 테스트용 mock 객체 , 이미 생성된 인스턴스를 주입할 때 사용한다.  { provide: PaymentService, useClass: StripePaymentService}2. useClass클래스의 인스턴스를 주입인터페이스 구현체를 주입할 때, 환경에 따라 다른 구현체를 사용할 때  { provide: 'DATABASE', useFactory: (config: ConfigService) => { return config.isDev ? new Dev..

공부/NestJs 2025.01.11

트랜잭션과 잠금 1

트랜잭션은 작업의 완전성을 보장해주는것이다. 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우 원 상태로 복구해 작업의 일부만 적영되는 현상이 발생하지 않게 만들어주는 기능. 잠금은 동시성을 제어하기 위한 기능이고 트랜잭션은 데이터의 정합성을 보장하기위한 기능 MySQL에서의 트랜잭션 MyISAM 엔진에서는 Transaction 이 적용되지 않는다. Transaction이 필요할 경우 InnoDB와 같은 스토리지 엔진을 사용하자  트랜잭션 사용시 주의사항1. 꼭 필요한 최소한의 코드에만 적용하자 - 메일 전송이나 FTP 파일 전송 작업 또는 네트워크 통신 같은 작업에서는 어떻게서든 DBMS의 트랙잭션 내에서 제거하는편이 좋다. 프로그램이 실행되는 동안 메일서버와 통신할 수 없는 상황이 발..

책/RealMySQL8.0 2024.10.10

10장 예외

효과적으로 예외를 다루는 지침  예외는 진짜 예외 상황에서만 사용하라 예외 처리를 통해 프로그램 코드를 작성하지말자 -> 예외가 터져야 끝나는 형식의 코드...흐름의 제어용으로 예외를 터트리지말자 복구할 수 있는 상황에는 Checked 예외를, 프로그래밍 오류에는 Runtime 예외를 사용하라호출하는쪽에서 복구할 수 있는 상황에서는 checked Exception을 사용하자API 사용자 ( 호출자 ) 에게 다시 복구하라고 요구하는것. 복구할 수 있는지 없는지 확신이 안간다면 런타임 예외를 사용하자  필요없는 Checked Exception 사용을 피하라 컴파일 상에서 예외를 처리하기때문에 checked 예외를 사용하는 메서드를 호출할 경우 해당 메서드에서 try catch를 하던지 상위 메서드로 thro..

책/EffectiveJava 2024.09.05

Raspberry Pi HomeServer 구축

홈서버를 구축하며 대표적인 보안설정인UFWFail 2 BanSSH 설정 등을 설정해보자. 1. UFW (Uncomplicated Firewall) 설정설치sudo apt install ufw기본 정책 설정sudo ufw default deny incomingsudo ufw default allow outgoingUFW 활성화sudo ufw enable 2. Fail 2 Ban 설치sudo apt install fail2ban설정 파일 수정`/etc/fail2ban/jail.local` 파일에 다음 내용 추가:[DEFAULT]ignoreip = 127.0.0.1 211.106.151.39bantime = 7200maxretry = 3findtime = 600backend = systemd[sshd]enab..

공부/Linux 기초 2024.09.03

4장 클래스와 인터페이스

추상화의 기본 단위인 클래스와 인터페이스는 자바 언어의 심장과도 같다. 클래스와 멤버의 접근 권한을 최소화 하라.잘 설계된 컴포넌트는 외부 세계로부터 내부 로직을 얼마나 잘 숨겼느냐로 갈린다.  오직 API를 통해서만 외부 세계와 소통하는 캡슐화는 소프트웨어 설계 근간이 되는 원리. 정보 은닉 ( 캡술화의 장점 )시스템 개발 속도를 높인다.시스템 관리비용을 낮춘다. ( 내부 로직 파악 없이도 빠르게 컴포넌트 사용이 가능해 디버깅 및 교체 비용이 적다 )성능 최적화 ( 캡슐화를 통해 결합도를 낮추고 응집도를 높여 해당 컴포넌트만 최적화가 가능 )컴포넌트의 재사용성을 높인다. ( 외부에 의존하지않고 독자적으로 동작하기때문 )자바는 모든 클래스와 접근성을 가능한 한 좁혀야 한다. 라는 기본 원칙이 존재한다. ..

책/EffectiveJava 2024.08.31

1장 객체의 생성과 파괴

정적 팩토리 메서드를 고려하라 public class Boolean { public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE = new Boolean(false); private final boolean value; private Boolean(boolean value) { this.value = value; } public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); }} 정팩 팩토리 메서드가 생성자보다 좋은 이유 다섯가지이름을 가질 수 있다.이름을 잘 지으면 객체의 특성..

책/EffectiveJava 2024.08.24

실행 계획 2

책에서는 가독성이 좋은 테이블 포맷으로 실행계획을 살펴본다.각각의 실행계획 테이블 컬럼들의 역할을 알아보자, 1. id 각각의 셀렉트를 분리해 구분할 수 있다. 이것을 단위 쿼리라한다.예를 들어 셀렉트절에 서브쿼리가 존재한다면 셀렉트절이 두개이므로 실행 계획에는 셀렉트절의 아이디가 1 , 2 두개가 존재할것이다.  2.select_type 각각의 select 쿼리가 어떤 타입의 쿼리인지 알려주는 컬럼simple UNION이나 서브쿼리를 사용하지 않는 단순한 셀렉트 쿼리 아무리 복잡한 쿼리라도 실행 계획에서 simple 단위 쿼리는 단 한개만 존재한다.  일반적으로 가장 바깥 쿼리가 simple로 표시된다.PRIMARYUINON이나 서브쿼리를 가지는 셀렉트 쿼리에서 가장 바깥쪽에 있는 단위쿼리 UNIONU..

책/RealMySQL8.0 2024.08.05

실행 계획 1

MySQL Engine 의 Optimizer는 사용자의 쿼리를 최적으로 처리할 수 있게 계획을 수립하지만,매번 옵티마이저가 최적의 쿼리 실행 계획을 수립하는것은 아니다.  때문에 Explain 명령어로 쿼리 사용자가 옵티마이저가 수립한 쿼리 실행 계획을 확인 할 수 있다.  비용 기반 최적화에서 가장 중요한것은 통계 정보다. 통계 정보란 만약 1억건의 데이터가 담겨져 있는 테이블이 존재하지만, 1억건이란 데이터의 통계 정보가 갱신되지않아 옵티마이저가 10건 미만의 테이블로 인식한다면  옵티마이저는 해당 테이블을 10건 미만의 테이블로 인식하고 실행 계획을 수립하게 된다.( 이럴 경우 인덱스를 활용하지않고 테이블 풀스캔으로 성능 저하가 우려 된다.  부정확한 통계 정보로인해 0.1초만에 끝낼 쿼리가 1시간..

책/RealMySQL8.0 2024.08.04

MySQL Engine Architecture

mysql 서버는 사람의 머리 역할을 담당하는 MySQL Engine손발 역할을 담당하는 storage Engine 으로 구분 가능. SQL Parser , Optimizer ... -> MySQL EngineData 를 Disk에 저장하거나 Disk에서 읽어오는 역할 -> Storage Engine MySQL Engine은 단 한개지만 Storage Engine은 여러개를 동시에 사용 가능. 따라서 CREATE TABEL Query에서 각각의 Storage Engine을 지정해 사용이 가능하다. CREATE TABLE inno_db_table (foo INT) ENGINE=INNODB; MySQL Engine 작업 중 데이터를 쓰거나 읽기가 필요할 때 Storage Engine에 쓰기 또는 읽기 요청을..

책/RealMySQL8.0 2024.08.03

MacOS Apache를 통한 VirtualHost 간단 설정.

VirtualHost 란,한대의 서버에서 두개 도메인을 운용하게 해주는 방법.같은 IP로 접속 요청을보내도 Apache 설정상에서 도메인명(정확히는 ServerName)이 다르다면 해당 ServerName으로 접속을 연결해준다. 보통은 Linux환경에서 진행하지만 집에서 복습겸 맥북 로컬환경에서 진행해보겠다.( 회사에서 진행했었던 RockyLinux 와 큰 차이가 없다.. 어차피 )각설하고 간단하게 가상호스트를 설정해보자. 우선 apache 설정파일인 httpd.conf 에서1. 직접 VitualHost를 등록하는방법과2. VirtualHost 설정파일을 Include하는 방법이 있다. 난 간편하게 후루룩 하고싶어서 두번째 방법으로 진행하겠다. httpd.conf에서 주석처리 되어있던 Include ht..

공부/Server 2024.06.06