TIL
-
Express staticTIL 2024. 5. 25. 15:05
Express static 미들웨어 express 에서 기본적으로 제공하는 미들웨어이고, express 객체안에서 바로 꺼내 쓸 수 있다정적파일인 이미지, css, javascript등 파일을 쓸때 사용한다 지정된 디렉토리에서 파일을 찾아서 클라이언트에게 제공한다 이 미들웨어를 통해 정적파일에 restful한 방식으로 접근할 수 있다. 사용법 예시1)app.use('요청경로', express.static('실제경로'));app.use('/', express.static(path.join(__dirname, 'public'))); app.use('/', express.static(path.join(__dirname, 'public')));ㄴ 현재 위치한 파일에 대한 절대경로 + '/public' => 이..
-
[DB] 트랜잭션 동시에 실행해서 성능올리기 ( confilct serializable한 nonserial schedule을 허용하기 )TIL 2024. 4. 8. 17:25
- nonserial schedule(논시리얼 스케쥴) : 트랜잭션이 순차적이지않고 겹쳐서 실행되는 스케쥴 장점) 트랜잭션이 겹침 동시성이 올라간다 (성능이 향상된다) I/O작업마다 다음 트랜잭션 동작 실행한다 (I/O 입출력 작업은 CPU가 유휴상태로 있는 작업이다. 그래서 CPU가 유휴상태로있는 시간동안 다른 트랜잭션의 동작을 실행함으로써 CPU의 유휴시간이 줄어들고 성능이 좋아진다.) 단점) 결과가 이상해질 수 있다 (동시에 트랜잭션을 수행하다보니 잘못된 값을 읽거나 써서 결과가 이상해질 수 있다) - serial schedule(시리얼 스케쥴) : 트랜잭션이 순차적으로 수행되는 스케쥴 장점) 결과가 이상해질 가능성이 없다 (하나의 트랜잭션이 완전히 끝나고 다음 트랜잭션이 수행되기때문에 결과가 이상..
-
[DB] soft delete 논리삭제TIL 2024. 4. 5. 22:32
프로젝트를 진행하던 중, 실제 서비스에서 쓰이는 바와 같이 soft delete를 사용하자는 의견이 나왔다. db에 저장된 내용을 물리적으로 삭제(hard delete)하는 것이아니라, 논리적으로만 삭제함으로써, 데이터 삭제요청이 들어오더라도, 그 요청을 서비스 내에서 수행함과 동시에, 실제 DB에는 과거에 생겼던 데이터 목록들 도 볼 수 있게된다. 그 결과 문제가 생겼을때, 데이터 복원이 가능하고, 데이터 변경이력, 데이터 삭제시간 등을 확인할 수 있는 장점이 있다. 구현이 어렵지도 않기때문에 바로 기획단계에서 바로 프로젝트에 도입했다. DB에 테이블을 만들때 삭제여부를 확인할 수 있는 데이터속성 1개만 추가하면된다 (is_deleted) 데이터 속성 1개 만으로 데이터의 삭제여부, 삭제시간을 모두 알..
-
N+1 문제 해결하기TIL 2024. 4. 5. 22:06
프로젝트를 진행하던 중, 위키를 수정할때마다 기존에 수정한 이력이 있는 사용자들 모두에게 알림을 보내는 기능을 구현 해야했다. 기존에는 SELECT문으로 해당 위키를 수정한 사람들의 목록을 출력하고 그 숫자만큼 반복문으로, 알림을 추가 하는 Insert 쿼리를 돌려주었다. 그렇게 N+1 문제를 안게되었다. N+1 문제란 SELECT문으로 나온 데이터의 개수만큼 다른 쿼리문(update, insert, delete)을 반복하는 경우를 말한다. 그래서 실제로는 1+N에 더 가깝다고 볼 수 있다. 문제가 되는 이유) 그래서 이게 왜 문제가되냐면, DB에 연결하는 작업은 프로그램에서 가장 느린 작업이다. 그런데 SELECT문으로 가져온 데이터의 결과수 만큼 새로운 쿼리문을 반복한다는 것은 가져온 데이터의 수가 ..
-
3계층구조)TIL 2024. 4. 5. 17:47
(Req.DTO) / (Res.DTO) --- 1계층 : 컨트롤러 (HTTP통신, 라우터등과 같이 통신을 담당하는 부분 ) --- BO(비즈니스 오브젝트) 2계층 : 서비스 (하나의 비즈니스로직) ㄴ 하나의 비즈니스 로직을 이행하기위해서 유저정보, 결제 정보등 데이터조회가 필요하므로 뒷단의 데이터계층에서 데이터를 조회하거나 참조하는 기능도 수행한다 ㄴ트랜잭션 계층, 비즈니스 로직계층 이라고도한다 --- 엔티티 3계층 : 레포지토리( db작업을 담당하는 부분) ㄴ 하나의 비즈니스로직에 필요한 데이터 조회,입력,수정등을 지원하는 단계 비즈니스 로직을 수행할때, 데이터 기입이나 변동이 필요할때, 이에대한 작업을 지원하고, 정보를 보관하는 계층 이렇게 3계층 구조로 나누는 이유는 뭘까?) ->응집도를 높이고 결..
-
[DB] DB에서 특정한 형식으로 출력하기(시간, 문자열) (TO_CHAR()이용하기), 타임존 설정하기TIL 2024. 4. 5. 17:02
프로젝트를 진행하던 중 해당 게임의 위키 수정내역(히스토리) 목록을 보여줘야 했다. 각각의 히스토리들의 제목은 작성된 의 형태로 보여줘야했고, 이와 같은 형태로 API 내에서 값을 후처리해서 반환해줘야 했다. DB에서 SELECT 해온 값을 타임존설정하기, 특정한 시간 형식으로 바꾸거나 특정한 문자열 형식으로 변환해서 반환하는 법을 알아보았다. 1.특정한 시간형식으로 변경하기) TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD HH24:MI:SS'); 첫번째 매개변수에 시간 값, 두번째 매개변수에 출력형식을 입력한다. 여기서 주의할점은 시는 HH24로 해줘야 24시간 형식으로 출력이되고, 분은 MI로 해줘야한다는것. 월(MM)과 분(MI)을 잘 분리해줘야한다 2.타임..
-
페이지네이션 & 무한스크롤 구현하기TIL 2024. 4. 3. 16:58
프로젝트를 진행하는 도중 필요한 기능이 생겼다. 서비스내에 있는 게임들을 가나다순으로 정렬하여 사용자들에게 보여줘야했다. 하지만 한번에 모든 게임목록들을 가져다 보여주는 것은 게임 수가 많아질 수록 효율성이 떨어진다. 사용자가 한번에 볼 수 있는 게임의 숫자를 적절히 정해서 필요한만큼만 그때그때 보여주는 것이 효율적이다. 게시판에 게시글목록을 볼때도 마찬가지. 그래서 게임목록을 가나다순으로 20개씩 끊어서 보여주기로했고, 페이지네이션을 이용하게되었다 FE는 게임목록을 요청할때 page를 1부터 2, 3, 4... 하나씩 올려가며 요청하면된다. BE는 전달받은 page에 X20을 해서 그만큼을 생략하고( OFFSET ), 추가 20개만 보여주면된다( LIMIT ) **DB의 OFFSET과 LIMIT를 이용..
-
이미지가 포함된 게시글 작성하기(게시글 이미지 업로드 기능구현하기)TIL 2024. 4. 3. 00:38
프로젝트 진행중 티스토리같이 게시글을 쓰는 공간에 유저들이 이미지까지 첨부하는 기능이 필요했다 게시글에 이미지를 업로드하는 기능을 구현해보았다. 이 기능은 일반적으로 프론트엔드로부터 html코드 자체를 넘겨받아 백엔드에서 통째로 저장한다. 이미지의 위치를 이미지 태그의 위치로 기억할 수 있기 때문이다. 백엔드는 게시글 내용을 반환해줄때도 html코드를 통째로 넘겨주면된다. 그리고 이미지 업로드API를 별도로 만들어서 유저가 게시글 작성도중 이미지를 업로드하면, 백엔드는 바로 이미지를S3(혹은 서버)에 저장하고, 그 url을 프론트엔드에 반환해주면된다. 여기서 이미지는 게시글에 업로드하는 순간 바로 S3에 저장되기 때문에 유저가 게시글에 작성도중 이미지를 첨부하고 뒤로가기등을 하여 나가버릴경우, 의미없는 ..