IT
Connection reset by peer 오류 해결기
매 시간 실행되는 배치 작업 중 특정일 22:00에 java.net.SocketException: Connection reset by peer 오류와 Socket Timeout 오류가 발생했습니다. 이 문제는 일정 시간이 지나면 자연히 해결되거나, ojdbc 버전 변경으로 일시적으로 해결되었습니다 문제 상황3개의 서비스 중 A 서비스에서만 문제 발생 -> 같은 DB 참조A 서버 오류 지속 시 나머지 서비스도 영향 받음랜덤한 특정일 22:00에만 문제 발생DB 툴에서 쿼리 실행 시 정상 작동서버 재시작 후에도 문제 지속SpringBoot의 ojdbc 버전 변경할 시 일시적 문제 해결 의문점매 시간 배치도는 서비스가 총 3개이다. 각각 시스템이 다르지만 참조하는 DB는 같다. 문제가 되는 A서버는 매 시 정..
결합 인덱스란?
1. a+b+c 결합 인덱스에서 b,c만 사용하는 경우와 a,b만 사용하는 경우의 차이가 있을까?2. and조건절은 순서대로 필터링할까? 1. 결합인덱스의 사용 의의와 특징-결합인덱스란 무엇인가?결합인덱스는 인덱스의 기준이 되는 칼럼이 2개 이상인 경우를 말한다. 토이 프로젝트만 경험한 경우, 결합인덱스의 필요성을 잘 이해하지 못할 수 있다. 예를 들어, AutoIncrement 속성을 가진 기본 키를 사용하면 충분하다고 생각할 수 있다. 하지만 실제 업무에서는 여러 칼럼을 조합하여 인덱스를 설정해야 할 필요성이 자주 발생한다. -결합인덱스의 필요성실제 업무 환경에서는 검색 기준이 되는 칼럼이 여러 개인 경우가 많다. 예를 들어, 고객번호, 개설일, 번호라는 세 가지 칼럼이 있고, 40개의 테이블과 3..
도커와 도커컴포즈
배경 향수 추천 서비스를 사용하다가 부트캠프에서 제공하는 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이 떳다. 액세스토큰을 보내면 안됐나?싶어서 리프레시토큰을 담아서 보냇는데도 마찬가지였다. 뭐가 문젠지 한참을 고민..