분류 전체보기

기타

버퍼 변환 사이트 buffer converter

서버 작업할 때, 테스트용으로 사용하면 편리한 버퍼 변환기입니다. 구글에 치면 버퍼 변환기가 나오기는 하나 이미지 확장자만 지원하는 경우가 많고 샘플 버퍼 찾기도 번거롭고, 그렇다고 매번 코드 돌리는 것보다 직접 웹하나 만들어두면 편리하게 쓸 것 같아서 만들었습니다. fkwsur.github.io/buffer_converter/ 내가 편하려고 만든 파일 버퍼 변환기 fkwsur.github.io

Database/mysql

[MySQL] 외래키 쓰면 안되는 이유

외래키(Foreign Key)는 데이터베이스에서 두 테이블 간의 관계를 정의할 때 사용하는 개념 외래키는 한 테이블의 필드(또는 컬럼)가 다른 테이블의 기본 키(Primary Key)를 참조할 때 사용 이렇게 하는 것으로 데이터의 일관성과 무결성이 보장되지만, 몇 가지 단점 또는 고려사항들이 있음 1. 성능 문제 외래키를 사용하면 INSERT, UPDATE, DELETE 작업 시 해당 테이블뿐만 아니라 참조하는 테이블까지 확인해야 함. 이로 인해 작업 속도가 느려질 수 있음. 2. 복잡성 증가 외래키 관계를 설정하면 데이터베이스 구조가 복잡해질 수 있음. 이로 인해 쿼리 작성이나 데이터베이스 관리가 어려워질 수 있음. 3. 삭제 제한 외래키로 참조되는 테이블의 데이터를 삭제하려고 할 때, 그 데이터를 참..

Node.js

[Node.js] iamport 결제 실패 시의 상황 대처법

결제시스템은 결제를 한다고 다가 아닙니다. 아이엠포트를 결제를 한다고 치면 프론트에서 결제 창이 뜨고 결제 완료가 됩니다. 그리고 그 결제완료된 내용을 서버로 보내고 서버에선 디비에 저장하게 됩니다. 그런데 프론트에서 결제 승인이 났는데 뜻밖의 이슈로 서버가 다운됐다고 쳐봅시다. 그럼 유저 입장에서 돈은 빠졌나갔는데 자신의 결제기록을 볼 수 없죠? 그러므로 안전하게 이를 핸들링하기 위해 상태값 중 결제 대기 상태를 만듭니다. 그래서 유저가 프론트에서 아이엠포트를 이용하기 전에 결제 대기 상태로 서버에 데이터를 보내줍니다. 결제 대기를 포함한 아이엠포트 서버 코드 예시들을 보여드리겠습니다. 우선 결제 대기 로직입니다. // 결재 대기 로직 WaitAccept : async (req, res) => { tr..

Elasticsearch

[Elasticsearch] 03. db연동하기

전차수들에서 엘라스틱 서치를 세팅하고 노리 형태소 분석기도 적용했습니다. 이제 데이터베이스에 있는 값을 엘라스틱 서치와 연동해서 검색해 봅시다. 일반적으로 엘라스틱 서치는 로그스태시를 사용하여 디비와 연동을 하지만, 버전을 맞춰줘야 하고 설정파일도 만져줘야 하는 등 까다롭고 m1에서 호환이 잘되지 않는 단점이 있습니다. 결국엔 로그스태시도 계속 켜놓은 상태로 일정 시간 주기로 스케줄링을 해주는 원리로 돌아가기에 배치서버 만들어서 돌리는 것과 성능에는 별 차이가 없기도 하고, 직접핸들링 하는 게 저는 더 편하기 때문에 로그스태시 같은 배치서버를 직접 만들겠습니다. 1. 서버 세팅 node 서버에 express 프레임워크 세팅해서 진행하겠습니다. 서버세팅법과 crud 부분은 아래의 링크를 참고해 주세요. h..

Elasticsearch

[Elasticsearch] 02. Elasticsearch 사용하기 (with nori)

ElasticSearch 를 사용해보겠습니다. 1. 엘라스틱 서치 설치 및 실행 우선 엘라스틱 서치를 설치해야 합니다. 저는 m1 이라 brew 로 설치했습니다. $ brew tap elastic/tap $ brew install elasticsearch-full $ brew services start elastic/tap/elasticsearch-full http://localhost:9200 브라우저로 들어가보면 { "name" : "", "cluster_name" : "", "cluster_uuid" : "", "version" : { "number" : "7.17.4", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "79878..

Elasticsearch

[Elasticsearch] 01. 검색엔진

검색엔진을 구현할때는 다양한 방법이 있습니다. 그 중에서 mysql like, mysql full-text-scan, elasticsearch 등이 있습니다. 1. MySQL Like 일반적으로 mysql 등의 디비에서 키워드를 검색할때는 like연산자를 이용하여 일치하는 값을 검색합니다. 그러나 like연산자를 이용하는 방식은 단어 또는 구문에 대한 검색에는 어느정도 한계가 있습니다. 만약 '크림 파스타' 라는 데이터가 있고, 유저가 "크림파스타" 라고 검색을 한다면 결과값은 나오지 않을 것입니다. 결과값이 나오게 하려면 select * from search_warming where REPLACE(keyword, " ", "") LIKE "%크림파스타%” 이런식으로 조회를 해야 결과가 나올 것 입니다...

Node.js

[Node.js] prototype 사용예시

1. 클래스 선언을 한다. class User{} 2. 객체를 가져오는 방법은 아래의 양식이 된다. const user = new User() 이 객체의 프로토타입은 User.prototype 이 된다. 3. 객체에 새로운 프로퍼티를 추가해줄 수 있다. User.prototype.Hello = () => { console.log('user') } Hello라는 메소드가 프로퍼티로써 추가되었다. 이 프로퍼티는 콘솔에 user 를 출력해준다. 4. user라는 이름으로 선언된 User 프로토타입 안에 있는 Hello 프로퍼티를 콘솔로 찍어본다. console.log(user.Hello()) user가 출력될 것이다.

Node.js

[Node.js] prototype 이란

원문 : http://www.tcpschool.com/javascript/js_object_prototype 자바스크립트의 모든 객체는 프로토타입(prototype)이라는 객체를 가지고 있습니다. 모든 객체는 그들의 프로토타입으로부터 프로퍼티와 메소드를 상속받습니다. 이때 상속되는 정보를 제공하는 객체를 프로토타입(prototype)이라고 합니다. 프로토타입 체인(prototype chain) 자바스크립트에서는 객체 이니셜라이저를 사용해 생성된 같은 타입의 객체들은 모두 같은 프로토타입을 가집니다. 또한, new 연산자를 사용해 생성한 객체는 생성자의 프로토타입을 자신의 프로토타입으로 상속받습니다. var obj = new Object(); // 이 객체의 프로토타입은 Object.prototype입니다..

Database/mysql

[MySQL] 메모리 낭비 없이 전화번호 저장

int 형으로 전화번호를 적재하는 컬럼을 생성하고, 전화번호 01012345678 을 저장하면 1012345678 로 변환되어 저장된다. 그래서 보통 데이터 타입을 varchar 로 선언하는 경우가 많은데, zerofill 설정을 해주면 값이 없으면 공백을 0으로 채워주기 때문에 01012345678가 정상적으로 출력된다. 그리고 전화번호는 절대 음수가 될 일이 없으므로 UNSIGNED-ZEROFILL 으로 설정해준다. 예시 : alter table user modify column number int(11) unsigned zerofill not null; 이 방식으로 하면 vachar 보다 메모리를 절약할 수 있어서 효율적이다.

Database/mysql

[MySQL] Count 성능 비교

쿼리문 성능 볼 수 있는 명령어는 EXPLAIN 1. count(*) over() as 2. (select count(*) from TABLE) as count + group by 결론 => 서브쿼리 없이 count(*) over() as 하는 것이 성능이 더 좋음

Server

[nginx] ssl 연동하여 배포한 서버 socket 연결하기

서버에 ssl 연동하여 배포하고 소켓에서 https로 통신을 시도하면 에러가 납니다. 소켓 요청에 대한 프록시 설정을 따로 해주지 않았기 때문입니다. 소켓 공식문서를 보시면 https://socket.io/docs/v3/reverse-proxy/#nginx nginx 연동을 어떻게 해야하는지 나와있습니다. location ^~ /socket { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_pass http://localhost:3000; // 포트번호를 소켓을 배포한 서버의 포트로 작성합니다. proxy_http_version 1.1; proxy_set_header Upgrade..

AWS

[aws] react 를 aws cli 이용해서 s3에 연동

1. cli 사용을 위한 패키지 다운 : https://awscli.amazonaws.com/AWSCLIV2.pkg 2. 잘깔렸나 확인 : sudo ln -s /folder/installed/aws-cli/aws /usr/local/bin/aws 3. aws configure --profile [설정할 이름] 5. AWS Access Key ID [None]: [엑세스 아이디] AWS Secret Access Key [None]: [엑세스 키] Default region name [None]: [지역] //ap-northeast-2 Default output format [None]: json 6. 입력 후 프론트 package.json에 scripts 추가 "deploy": "aws s3 sync ./..

AWS

[aws] 도메인+ elb + ssl

nginx + docker + ec2 배포 과정은 올려두었으니 생략하고 진행하겠습니다. 1. aws 도메인 등록페이지에서 도메인을 구입합니다. 2. Route 53 > 호스팅 영역 > 호스팅 영역 생성 순으로 진행합니다. 아래 설정대로 하고 생성완료를 누르시면 됩니다. 등록된 도메인으로 통신테스트를 해보면 정상적으로 등록된걸 확인할 수 있습니다. 3. 로드밸런서를 생성합니다. EC2 > Load balancers > Select load balancer type 저는 Application Load Balancer 옵션으로 진행하겠습니다. 상황에 맞게 선택해서 진행하시면 됩니다. 설정은 아래 이미지를 참고해주세요. 4. 보안그룹은 아래 형식으로 만들어둔 보안그룹으로 선택하였습니다. https를 허용해주는 ..

Database/mysql

[MySQL] auto_increment 쓰면 안되는 이유

1. 데이터베이스 이전시킬 때, 중간에 끊기는 숫자가 있으면 그 숫자부터 다시 센다. (데이터가 많을때, 예를 들면 1~100까지 데이터가 있었다고 치고, 52가 없는 상태면 새로 이전하는 db에서 데이터가 새로 들어올 때, 101번을 안매겨주고 52번을 매겨준다. 그 다음에 101번을 매겨줘야 하는데 53번을 매겨준다. 근데 53번은 이미 있으니 에러를 밷는다.) 2. 카운트가 1억 정도까지 가면 index 메모리 낭비가 심해진다.

Database/mysql

[MySQL] 파티션

데이터가 많아지면 mysql에 부하가 걸리므로 파티션을 나눠줘야 한다. MySQL에서는 4가지 파티션 종류를 지원한다. - Range 파티션 - List 파티션 - Hash 파티션 - Key 파티션 Range 파티션 (출처 : https://hoing.io/archives/8527) 파티션 키의 연속된 범위로 파티션을 정의 하는 방식 이며 가장 일반적으로 사용 되는 파티션 종류 입니다. MAXVALUE 파티션을 이용해 정의 되지 않은 값의 범위의 키 값을 저장을 하게 됩니다. Range 파티션에서 NULL은 어떤 값보다 작은 값으로 간주 됩니다. 날짜 컬럼의 값으로 파티션 할 경우 다음의 예시 를 주의 해야 합니다. - UNIX_TIMESTAMP() 이용한 변환 식을 파티션 키로 사용 - 날짜를 문자열로..

AWS

인스턴스 보안그룹 best 설정 방법

이렇게 하는 방법이 베스트입니다. 전에 aws 인스턴스 생성할 때, 이렇게 하는 방법으로 알려드렸었는데, 위아래 둘 다 상관은 없습니다. 그러나 ::/0으로 하면 리소스가 그만큼 낭비되는 거라서 위에 캡처로 하는 것이 개인적으로 더 나은 것 같습니다.

Server

Linux 환경에서 서버작업 순서(Docker 설치하기)

아래 순서에 맞게 설치하면 됩니다. 서버 시작 후 1. 우분투 접속 2. ls로 디렉토리 확인 후 cd로 디렉토리 이동 3. git pull origin master 도커설치 1. curl -fsSL https://get.docker.com/ | sudo sh 2. sudo docker build -t image_name . 3. sudo docker images (도커 이미지 생성 확인) 4. sudo docker create --name container_name -p 8081(포트포워딩포트):8081(앱 포트) image_name //필요한 갯수만큼 생성 =>도커 이미지 생성 80포트는 nginx가쓰고 있으니 8081:8081 =>sudo docker create --name container_na..

Server

Linux 환경에서 Nginx 설정하기

Linux 환경에서 Nginx를 배포하는 방법입니다. 내 프로젝트를 ubuntu에 git clone 합니다.(Nginx 설치를 먼저해도 순서는 상관없습니다.) 아래의 순서대로 Nginx를 설치하고 설정파일로 접속합니다. 1. sudo apt-get update 2. sudo apt-get upgrade -y 3. sudo apt-get install nginx 4. cd /etc/nginx/sites-enabled 5. sudo nano default 6. change default file to git code(.conf) / 본인 환경에 맞게 아래와 같이 작성합니다. 7. sudo service nginx restart 이 순서로 하면 끝입니다. 생각보다 간단하죠

Java

[Java] 3. JWT와 bcrypt 적용하기

JWT와 bcrypt를 사용하기 위해 pom.xml에 // bcrypt관련 org.springframework.security spring-security-web 5.5.2 // JWT관련 io.jsonwebtoken jjwt 0.9.1 com.googlecode.json-simple json-simple 1.1.1 이 내용을 추가합니다. 자바 새 버전에서는 이것도 추가해야 jwt오류가 안난다네요. org.glassfish.jaxb jaxb-runtime 2.3.2 JWT와 bcrypt를 사용하기 위해 service 폴더에 JWTManager.java와 Bcrypt.java 파일을 만들어줍니다. Bcrypt부터 진행하겠습니다. Bcrypt.java package daily.coding.service; i..

Java

[Java] 2. RestController 작성

세팅된 환경이 잘 켜지는지 확인해봅시다. 디렉토리는 밑줄 친 demo까지 이동해야 합니다. 터미널에 아래 명령어를 입력합니다. ./mvnw spring-boot:run 짜잔 에러가 나네요. 포트가 없어서 그러니 포트 설정을 해줍니다. application.properties 파일로 이동합니다. 다른 언어에서 .env파일과 같은 역할입니다. 자신의 디비 정보를 입력해주세요. 그래도 에러가 날거에요 pom.xml에 mysql을 추가해줘야하기 때문입니다. mysql mysql-connector-java runtime 이 부분을 추가해줄게요. 다시 서버를 실행해보면 제대로 실행되는 것을 확인할 수 있네요. 이제 crud를 작성하기 위한 디렉토리 세팅을 하겠습니다. demo>src>main>java|daily|c..

hyun_ji
'분류 전체보기' 카테고리의 글 목록