Language \ Framework 5

SOLID 원칙

시작작년에 회사에 입사를 하고, 이번에 추가 기능에 대한 프로젝트를 하나 맡았는데, 기존 구조나 코드가 조금 복잡한 감이 없지 않았다.개발 진행 중에, CTO님도 이 부분에 대한 문제를 기존부터 염두에 두고 계셔서, 이 참에 조금 대대적인 리팩토링을 하기로 했다.기존 로직을 건드리는 것이 어떻게 보면 조금 위험하긴 하다보니, 여태 이렇게 운영이 된 것 같다. 그런데, 하다보니 어떤식으로 리팩토링 하는 것이 좋은지에 대한 고민이 항상 있다보니 가끔은 머리가 아프기도 했다.개발을 하다보면 불필요한 로직이나 코드, 혹은 어느 한줄만 없어지면 다음 로직이 조금 간단해질 수 있는 여지가 있는 코드 등등 뭔가 조금 거슬리는 코드 들이 있는데, 이런 부분들을 좋게 개선하려다 보니 SOLID 원칙이 생각이 났다.생각이..

[JAVA] ReentrantLock, ReentrantReadWriteLock

1. 개념동시성을 제어할 수 있는 객체.synchronized 와 유사하나, 더 세밀한 제어와 확장된 기능을 제공함.2. 차이점ReentrantLock은 단일 잠금을 제공하고, ReentrantReadWriteLock의 경우는 읽기와 쓰기의 잠금을 별도로 관리할 수 있음.ReentrantLock은 선택적으로 공정한 잠금정책을 제공할 수 있지만, ReentrantReadWriteLock은 지원하지 않음.읽기 작업이 많은 경우, ReentrantReadWriteLock이 더 나은 성능을 보여줌.재진입의 의미!ReentrantLock에서 '재진입’이란 이미 특정 스레드에 의해 잠금이 획득된 상태에서 같은 스레드가 다시 그 잠금을 획득하는 것을 의미.3. ReentrantLockReentrantLock lock..

[JAVA] CompletableFuture

1. 개념자바에서 비동기 프로그래밍을 가능하게 하는 클래스.기존 Future 라는 인터페이스를 Implements📓 사용 이유자바에서 비동기 프로그래밍을 사용해야 하는 상황에 해당 클래스를 사용한다.그리고 Future라는 인터페이스가 있으나, 반드시 예외 처리를 해줘야 하는 부분이 있고,get() 함수를 사용하거나, 타임아웃을 걸어주기 전까지는 다른 작업을 할 수 없다.CompletableFuture의 경우는 다양한 상황의 비동기적 프로그래밍을 할 수 있고,때에 따라서는 동기적 흐름을 만들 수 있다.예를 들어, 메소드 A와 메소드 B의 관계에서, A와 B의 반환 값이 모두 필요한 상황이라면 A와 B를 동시에 실행하고, 두개의 메소드가 전부 완료되는 시점에 반환값들을 처리할 수 있다.다른 상황으로는, A..

[Javascript] Promise, async, await

0. Promise - Promise는 비동기 처리에 사용되는 객체이다. 일반적으로 Javascript 에서 비동기 처리시에 함수내에서 Rest api 호출했을 때라던가, DB 데이터를 조회하기 위해 요청을 보냈을때, 응답이 오지않았는데도 프로세스를 끝내버려 겉으로는 정상동작으로 보이나, 실제로는 값이 반환되지 않는 경우가 종종 있다. Promise는 이 처럼 비동기 프로세스를 마치 동기 프로세스처럼 사용할 수 있는 객체이다. Promise는 다음 중 하나의 상태를 가진다. 대기(pending) : 말 그대로 대기 상태이다. Promise 객체를 console.log로 확인해보면 이라는 문구를 볼 수 있을 것이다. 이행(fulfiled) : 해당 Promise 객체가 정상적으로 처리되었음을 의미한다. 거..

[Nodejs] - Mysql 연동

0. 프로젝트 진행 중 Mysql DB를 사용할 일이 생겨서 Nodejs와 연동을 해야했다. 기존에 MS Sql만 연동되어 있어, Mysql과 연동할 라이브러리가 필요했다. 1. 먼저 npm을 통해 mysql을 설치해준다. npm install mysql 이후 datasource를 작성하여 연결한다. const mysql = require('mysql'); let pool; // mysql connect pool = mysql.createConnection({ host: 'DB HOST', user: 'user id', password: 'password', database: 'DB name' }); pool.connect(); pool.query('SELECT 1', function (error, re..