Life 85

Http통신에서의 InputStream에 대하여

교훈 : 모르는 것은 당연하거니와 아는 것도 그냥 사용하지 말고 개념과 그 구현 방식을 확실히 숙지하고 사용하자 프로젝트를 진행하던 중 이미지 파일 전송과 관련하여 Java로 Http통신을 구현하고 데이터를 InputStream에 담아서 프론트엔드와 백엔드가 통신을 해야할 일이 생겼다. 사실 해당 파트에 충분히 학습하지 않고 검색을 통해 "이렇게 이렇게 하면 된다."정도만 확인한 후 프로젝트 코드에 대입을 하였다. 별 이상없이 동작해서 우선 다른 할 일도 많았기에 커밋을 한 후 다른 작업을 시작하였다. 하지만 커밋 후에 팀원이 동기 처리를 하지 않은 상태에서 getInputStream을 하게 될 경우 아직 응답이 오지 않았는데 없는 데이터가 잡힐 수도있지 않느냐는 질문을 하였고 생각해보니 그 부분에 대해..

개발 지식 2020.12.24

Spring Boot 프로젝트 Docker image 및 container화

1. 프로젝트 Run Configurations 들어가서 Gradle Task > Name: 플젝명 주고 Gradle Tasks에 clean, jar, build 주기. Working Directory는 Workspace누르고 현재 디렉토리 선택(변경사항이 있을 때 마다 새로 만들어야 됨) 2. Dockerfile 작성 3. Dockerfile이 있는 프로젝트 최상단디렉토리에서 cmd 실행 4. docker image생성 [-t 옵션 Docker Hub 아이디/이미지 이름] : docker build -t dongmin94/test-backend-server . 5. Docker Hub에 Docker image 업로드 : docker push dongmin94/test-backend-server 6. 이..

Docker 2020.12.14

쿼리 성능과 관련하여

재택근무를 하며 각 백엔드 서버들을 클라우드 컴퓨터를 이용하여 띄워두었다. 기존의 다른 프로젝트를 로컬이나 아마존 EC2를 이용할 때도(해당 프로젝트 또한) 속도와 관련된 별다른 애로사항이 없었기에 이번에도 잘되려니했다. 그런데 이게 왠걸, Batch 작업에서 500개 가량의 레코드를 DB에 삽입할 일이 생겼는데 매번 돌때마다 실행 시간이 증가하다가 결국 14분씩이나 걸리고 말았다. 겨우 500개가 넘는 데이터를 삽입한다고 실행시간이 이렇게나 많이 걸린다는 것은 분명 문제가 있다고 생각했다. 해당 이슈를 해결하기 위해 백엔드 팀원과 함께 여러모로 방법들을 생각해보았다. DB를 거치지 않고 백엔드 서버단에서 HashSet, HashMap 등을 이용하여 중복 데이터들을 정리한 후 DB에 쿼리 날리는 횟수를 ..

Spring Boot에서 save 메소드의 동작 원리

entity 가 이미 영속성에 등록 되있으면 merge를 없으면 persist 를 실행하게 돼있다. merge 는 해당 ID 가 영속성에 존재하면 update 를 수행. 없으면 INSERT 를 수행한다. 여기서 주의할 점은 ID 가 없을 경우 SELECT 를 시도하는 경우가 있을 수 있다는 것. 기본키 생성 전략이 없을 경우 (애플리케이션에서 생성) SELECT 를 수행한 후, INSERT 를 실행하기에 쿼리가 2배로 실행됨. persist 의 경우 INSERT 쿼리만 실행 됨. 즉, 정리하면 merge 는 기존의 객체가 존재할 경우 사용하면 좋고, persist 는 새로운 객체를 생성할 때 좋음. 출처 : https://insanelysimple.tistory.com/155

개발 지식 2020.12.07

MinIO 서버 환경 세팅

MinIO 실행 명령어 docker pull minio/minio docker run -p 9000:9000 --name hanzari_minio -v C:\minio:/data -e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" -e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" minio/minio server /data #호스트 OS의 설치경로 및 container filesystem의 /data 디렉토리를 연결시켜주는 작업을 해야기에 ~경로:/data라고 써준다. #KEY값은 프로젝트에 맞춰 추후 변경 #실행 후 브라우저에서 MinIO 서버 접속 후 Create bucket을 해서 bucket을 생성하거나 연결된..

Docker 2020.11.30

Json을 읽어올 때 BufferedReader.readLine() 사용을 조심해야하는 이유

서버로부터 Json을 읽어올 때 BufferedReader의 readLine()을 사용하였다. 콘솔에 잘 가져오나 찍어보아도 Json 데이터 모두를 가져오기에 이상이 없는 줄 알았다. 하지만 팀장님이 말씀하시길 이 메소드를 사용하면 문제가 발생할 수도 있다고 하였다. 한 줄로 서버가 Json을 전송하였기에 readLine()을 사용할 경우 한 줄을 읽을 때 끝까지 읽을 수 있는 것이지 이렇게 줄을 분리하여 Json 데이터를 보낼 경우 readLine()을 사용하면 첫 줄 데이터("{")만 읽게 되는 문제가 발생한다. 따라서 사전에 이러한 문제를 방지하기 위해서는 다른 방법을 사용할 필요가 있다. 위의 예시와 같이 만들어 주어 한 줄씩(readLine이기에 다음 번에 호출 시 마지막 호출 된 다음 줄 부터..

개발 지식 2020.11.23

JavaScript의 배열 선언 방식과 그에따른 '==', '===' 연산자 사용시 다른 점 정리

JavaScript 배열 선언하는 방식은 2가지가 있음 Array 객체를 이용한 선언 : let arr = new Array(); 객체 리터럴을 이용한 선언 : let arr = []; new Array()보다 []의 선호도가 높다. new Array의 constructor에 하나의 숫자만 넣으면 배열의 크기로 인식하지만, 두 개 이상의 숫자를 전달하면 전달받은 값으로 배열을 초기화한다. 따라서 하나의 숫자만 넣은 배열은 만들 수가 없다. '==' 연산자 : 서로 다른 유형의 두 변수 '값'만 비교한다. 0 == '' //true 0 == '0' //true 1 == true //true false == '0' //true null == undefined //true false == null //fals..

개발 지식 2020.11.22