EC2컨테이너에 deploy.sh 파일을 만든다. - vim deploy.sh 아래 내용을 작성한다. REPOSITORY=/home/ubuntu PROJECT_NAME= 백엔드_디렉토리명 PROJECT_NAME2= 프론트엔드_디렉토리명 echo "> 백엔드 프로젝트 디렉토리로 이동" cd $REPOSITORY/$PROJECT_NAME/ echo "> Git Pull 백엔드 프로젝트" git pull echo "> 백엔드 프로젝트 Build 시작" ./gradlew build echo "> 기본 디렉토리로 이동" cd $REPOSITORY echo "> Build 파일 복사" cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/ echo "> 프론트엔드 ..
putty에서 EC2키를 로드하고 EC2 인스턴스 주소에 ssh로 접속한다. 이 포스팅에서는 자바 11버전을 설치한다. sudo apt-get install openjdk-11-jre 를 입력한다. 설치할 것이냐고 묻는 질문에 Y를 입력한다. sudo apt-get install openjdk-11-jdk 를 입력한다. 설치할 것이냐고 묻는 질문에 Y를 입력한다. java -version 을 입력해서 설치된 java 버전을 확인한다. JRE(Java Runtime Environment)와 JDK(Java Development Kit)가 모두 설치 완료 되었으면, 환경변수를 추가한다. which javac 명령을 통해 javac의 위치를 검색한다. 심볼릭링크를 위의 위치로 읽는다. sudo vi /etc/..
EC2 로그인 후 우측 상단의 지역이름을 누른다. 위와 같은 목록에서 아시아 태평양(서울) ap-northeast 를 누른다. 리전(Region)을 서울로 바꾸는 것으로, 서울리전을 사용하는 것이 다른 곳의 리전을 이용하는 것보다 속도가 빠르다. 서울로 변경 후, 검색창에서 EC2를 찾고 들어간다. 위와 같은 창이 뜨면 인스턴스 시작을 누른다. EC2 인스턴스에서 사용할 운영체제를 선택해야 한다. Window에 비해 리눅스를 사용하는 것이 약 절반정도 저렴하다.(아마도 Window를 사용하면 Window 라이센스료도 포함되기 때문에..?) Ubuntu Server 20.04 LTS 를 선택했다. EC2 인스턴스의 성능을 정해야한다. 프리티어로 사용하는 사람들은 t2.micro를 사용한다. 이후 추가 설정..
AWS에서 IAM기능은 거의 필수적으로 적용해야 하는 서비스이다. AWS의 서비스를 이용하는 것은 사용 요금이 부과된다. 혹시나 생길 수 있는 일(해킹)을 방지하기 위해 IAM 설정을 하는 것이 좋다. 스마트폰 OTP를 이용하여 MFA(멀티 팩터 인증)을 추가한다. MFA는 AWS에서 Id와 Password로 로그인 한 후, 스마트폰 OTP 인증까지 받아야 로그인 할 수 있는 서비스이다. 먼저 스마트폰에 OTP앱을 설치한다. 안드로이드폰의 경우 Google OTP앱을 설치하면 된다. AWS의 우측 상단의 내 정보를 클릭 후, 내 보안자격 증명을 클릭한다. 보여지는 화면에서 아래로 내리면 멀티 팩터 인증(MFA) 추가하는 부분이 보인다. 가장 보편적으로 사용하는 '가상 MFA 디바이스'를 이용한다. QR코..
스프링부트로 REST API를 만들던 중 다음과 같은 에러를 만났다. No serializer found for class ... and no properties discovered to create BeanSerializer @responseBody로 사용자 정의 클래스를 반환했는데 생긴 에러였다. @Getter가 있지 않아서 JSON으로 파싱이 불가해서 발생했다. (JSON으로 파싱하기 위해 사용하는 Jackson의 입장에서는 값을 읽을 수가 없기 때문이다) 해당 클래스에 @Getter를 적는 것으로 해결했다. 참고 : https://stackoverflow.com/questions/59578802/jackson-no-serializer-found-for-class-and-no-properties-d..
스프링 프로젝트를 하면서 REST API를 만드는 도중 다음과 같은 에러를 만났습니다. "org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation... 기존 방식에서는 http body에 데이터 하나밖에 넘겨줄 수 없었기에, 제네릭을 이용한 공통 리스폰스 객체를 만들고 싶었습니다. @PostMapping(value = "/login") public ResponseEntity login(@RequestBody AuthRequest authRequest) throws Exception { //생략 String token = "token"; return ResponseEntity.sta..
Explan SQL SELECT / UPDATE / INSERT / DELETE 등의 쿼리가 어떻게 수행되는지 내부를 보여주는 SQL 명령이다. MySQL이 해당 쿼리를 어떻게 실행할 지 실행 계획을 보여준다. 이를 바탕으로 느리게 동작하는 쿼리의 최적화가 가능해진다. 느린 쿼리의 경우 문제가 되는 테이블에 인덱스를 만드는 것이 일반적이다. EXPLAIN SELECT 문; Index 인덱스는 테이블에서 특정 찾기 작업을 빠르게 수행하기 위해 별도로 만드는 데이터 구조를 말한다. 컬럼별로 만들어진다. Primary Key나 Foreign Key로 지정된 컬럼은 기본적으로 Index를 갖게 된다. 특정 컬럼을 바탕으로 검색을 자주 한다면, 인덱스 생성이 큰 도움이 될 수 있다. 인덱스는 B+ 트리구조로 만들..
View 자주 사용하는 SQL 쿼리(SELECT)를 가상의 테이블처럼 만들고, 쉽게 사용할 수 있게 하는 것이다. SELECT 결과가 테이블로 저장되는 것이 아니라 View가 사용될 때마다 해당 SELECT 쿼리가 실행된다. MySQL 서버단에 저장된다. CREATE OR REPLACE VIEW 뷰이름 AS SELECT .. SELECT .. FROM session s JOIN channel c ON c.id = s.channel_id; -- 위의 쿼리를 뷰로 만든 SQL문 CREATE OR REPLACE VIEW session_detials AS SELECT .. FROM sessino s JOIN channel c ON c.id = s.channel_id;