IT
도커와 도커컴포즈
배경 향수 추천 서비스를 사용하다가 부트캠프에서 제공하는 EC2서버가 만료됐고 도메인을 유지하고 싶어서 서버 이전 작업을 했다. 기존 서버에 설치했던 파일의 버전을 일일이 찾아서 설치하고 이후 세팅을 메모해놓은 뒤 하나하나 설치하는 게 여간 불편한 게 아니었다. 그래서 아래와 같이 여러 이슈들이 발생했다. https://tte-yeong.tistory.com/127 AWS EC2 서버 이전시 발생한 이슈들 -SQLGrammarException: could not extract Result Set 상황 부트캠프에서 제공해주는 EC2의 기간이 끝났다. 이 서버를 aws 프리티어로 옮기는 과정에서 여러 이슈들이 발생했다. 서버에서 설치한 파일, 설정한 명령어 모두를 기록해놔서 어려움이 없 tte-yeong.t..
CI CD with 젠킨스
배경 향수 추천 서비스를 개발하면서 수동 배포를 사용했다. 인간 젠킨스라고 불리며 push 할 때마다 sh파일을 실행시켜서 빌드를 하면서 여간 불편한 게 아니었다. 다음 프로젝트는 반드시 CI CD를 사용해보자 결심했고 애니메이션 추천 서비스에서 젠킨스를 사용했다. CI CD 젠킨스를 하기 전 CI와 CD에 대해서 간단히 짚고 넘어가자 CI란 무엇인가? 지속적 통합이라는 뜻으로 여러 명이 하나의 코드에 대해서 수정을 진행해도 지속적으로 통합하면서 관리할 수 있음을 의미한다. CI가 있기 전엔 Merge Day라는 날짜를 정해서 개발자들이 모여서 별도로 합치는 작업을 했다. CI를 사용한다면 기능을 잘게잘게 쪼개서 코드 작성이 완료될 때마다 이를 병합할 수 있다. CD란 무엇인가? 지속적 배포라는 뜻으로 ..
JWT 토큰
배경 애니메이션 추천 서비스를 개발하면서 JWT를 사용했다. 사용자가 로그인할 때 인증할 필요가 있었고 여러 방법을 비교해본 결과 토큰을 사용한 방식이 그나마 가장? 안전했고 대표적인 토큰 방식인 JWT를 사용했다. JWT토큰 이전에는 어떤 방식으로 인증했는지 그리고 왜 JWT가 탄생했는지에 대해 간단히 알아보자 인증과 인가 들어가기에 앞서 인증과 인가에 대한 개념을 잡고 가야 한다. 인증이란 식별 가능한 정보로 서비스에 등록된 유저의 신원을 입증하는 과정이다. 풀어서 설명하면 회사의 사원증과 같은 개념으로 닉네임이나 사진 같은 정보로 어떤 회사의 회원인지 확인하는 절차이다. 인가란 인증된 사용자에 대한 자원 접근 권한을 확인하는 것이다. 사원증을 예로 들면 인턴의 경우 회사 내에 접근 불가능한 곳이 몇..
도커컴포즈 + 스프링부트 + nginx + mysql connection refused
상황 프론트에서 백으로 요청 시 400 에러가 발생했다. Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection 에러와 함께 Connection refused에러도 함께 발생했다. 시도해본 방법 spring.datasource.url=jdbc:mysql://mysql_chu:3303/chuanione?useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Seoul mysql_chu는 도커컴포즈의 컨테이너 이름이다. 로컬에서 테스트할 땐 mys..
도커컴포즈 + 스프링부트 + nginx + react 404 에러
상황 로컬에서 테스트를 한 뒤 서버에 푸시를 하고 프론트에서 백으로 요청을 보내면 404에러가 발생했다. 404에러면 url이 잘못된건데 눈씻고 찾아봐도 잘못된 url이 보이지 않았다. 시도해본 방법 굉장히 많은 방법을 시도했지만 기억나는 것만 서술하겠다. package.json에 proxy 추가 "proxy": "http://{스프링 도커 컨테이너 이름}:8080", 또는 서버 url axios경로에는 서버url 설정 baseURL: "http://{url}/api/v1/", nginx.conf location /api { proxy_pass http://백엔드도커컨테이너 이름:8080; 그 외에 도커컴포즈파일들을 이리저리 만져보고 network도 추가해봤다. 최종 docker-conpose.yml s..
DockerCompose + SpringBoot + Mysql Connection refuse에러
상황 도커컴포즈를 사용해서 부트와 mysql을 띄우려고 하니 connection refuse에러가 발생했다. 당시의 코드 docker-compose.yml version: "3.7" services: db: image: mysql:5.7 environment: MYSQL_USER: master MYSQL_DATABASE: chuanione MYSQL_PASSWORD: rnlaufdmlzkfskf! MYSQL_ROOT_PASSWORD: emforhsqhftbvj TZ: Asia/Seoul volumes: - "./db_data:/var/lib/mysql" ports: - "3305:3306" container_name: mysql_chu networks: - backend-network spring-boo..
스프링시큐리티 + JWT 로그인 시 토큰 유효성검사 에러
상황 시큐리티와 JWT토큰을 사용해서 구현하던 중 로그인 시 유효하지않은 토큰이라는 에러가 발생했다. 로그인을 하면 토큰을 발급하고 인증이 필요한 요청에 토큰을 담아서 유효성검사를 하는데 인증이 필요하지 않는 로그인때부터 갑자기 토큰검사를해서 도대체 뭐가 문젠가 싶어서 한참을 헤맸다. 시도해본 방법 시큐리티Config 최하단에 .and() .apply(new JwtSecurityConfig(tokenProvider)); 아래와 같이 돼있는 코드를 addBeforeFilter로 수정하려고 했는데 JwtSecurityConfig안에 이미 addBeforeFilter가 구현돼있었다. 이후 TokenProvider와 로그인시 Service함수에서 수행하는 doLogin등을 다 수정해봤지만 도통 무슨에런지 찾을 ..
스프링시큐리티 401에러와 body가 빈 상태코드 200리턴
상황 스프링시큐리티, JWT를 사용해서 로그인을 구현했다. SecurityConfig와 JwtFilter, JwtSecurityConfig등 필요한 파일을 추가하고 가입과 로그인하면 토큰이 발급되는지도 확인했다. 문제는 .do가 붙지않은 요청을 보낼 때 401에러가 발생했다. 인증이 되지 않아서 발생한 문제고 무엇이 문제인지 확인해보았다. 시도한 방법 로그인해서 발급한 토큰을 postman에 등록했다. tests에 변수를 등록하면 자동으로 등록이 된다는데 임시로 이렇게 했다. 저기 토큰에 들어가는건 로그인했을 때 발급한 토큰을 넣으면 된다. 토큰정보를 담아서 요청을 보냇는데 마찬가지로 401이 떳다. 액세스토큰을 보내면 안됐나?싶어서 리프레시토큰을 담아서 보냇는데도 마찬가지였다. 뭐가 문젠지 한참을 고민..
AWS EC2 서버 이전시 발생한 이슈들 -SQLGrammarException: could not extract Result Set
상황 부트캠프에서 제공해주는 EC2의 기간이 끝났다. 이 서버를 aws 프리티어로 옮기는 과정에서 여러 이슈들이 발생했다. 서버에서 설치한 파일, 설정한 명령어 모두를 기록해놔서 어려움이 없을 줄 알았는데 굉장히 많은 시행착오가 발생했다. 기존과 달라진 것들 프리티어 무료 버전이라는 것과 기존에는 ec2에 mysql을 설치해서 workBench로 연결 후 사용했다면 이번에 옮길 때는 AWS RDS를 연결해서 사용했다. 이슈 1. 프리티어 램 용량 부족 - 자바파일을 빌드하기에 프리티어 램 용량이 부족했다. 램과 ec2저장공간의 메모리 스왑을 해서 이슈를 해결했다.(최대 2기가인데 1기가만 스왑 하니 메모리가 부족했다.) 2. 프론트 빌드 메모리 부족 - 기존에 빌드 방식은 sh파일을 사용해서 npm ru..
SQL 조인 개념
조인은 다른 테이블을 연결할 때 사용한다. 조인조건을 기준으로 두 테이블을 하나로 합친다. Inner Join 서로다른 테이블에 있는 데이터를 가져올 때 사용한다. ex) 특정 게시글에 작성된 댓글내용을 가져온다. 1번 게시글에 달린 댓글내용과 사용자명을 가져오자 SELECT 댓글내용, 사용자명 FROM comments JOIN users ON users.id = comments.id WHERE comments.posts_id = 1 작동방식 JOIN~ON절에서 =기호로 같은 조건인 복수개의 데이터만 남는다. users.id 1, comments.posts_id 1 ~~~ user.id 1, comments.posts_id 2 ~~~~ user.id 1, comments.posts_id 1 ~~~~ us..