전체 글 235

Linux에서의 1024 이하의 포트 사용

👣 개요 Ubuntu를 이용해서 http 통신을 수행하는 APP을 구동시키려고 했다. 이 때, application.properties에 server.port=80라고 설정해서 별다른 포워딩 없이도 서버를 구동시키려고 했다. 하지만 분명 Local에서는 작동했던 서버가 EC2 내부에서는 작동되지 않았다. 이유를 찾아보니 Linux는 1024 이하의 포트는 관리자 권한의 사용자만 이용할 수 있었다. 때문에 sudo를 앞에 더해서 jar 파일을 돌렸다. 나의 경우, 민감한 설정 정보를 숨기기 위해 환경 변수를 활용하고 있었는데 이 경우, sudo 명령어엔 환경 변수가 자동으로 적용되지 않았다. 결국, -E 옵션으로 환경 변수를 의도적으로 받아들였고 "sudo -E java -jar ~~~~.jar" 라는 코..

프로젝트 회고 2023.10.15

WebSocket - SockJs

👣 개요 WebSocket은 HTML5 기반으로 만들어진 기술이기에 모든 브라우저에서 호환되지 않을 수 있다. 때문에 이런 한계점을 극복하고자 Node.js와 Spring 진영에선 각각 우회하는 기술을 만들었다. Node.Js는 Socket.io를 이용하고 Spring은 SockJs를 사용한다. 두 기술은 결국 아래와 같은 방식으로 WebSocket을 지원하지 않는 브라우저에게 실시간 통신 기법을 구현한다. 만약 Web Browser가 WebSocket을 지원하지 않으면 Polling, Long Polling 등등의 방식으로 우회해서 서비스를 제공한다.

네트워크 2023.10.05

채팅 기능 구현을 위한 이론적 공부

👣 개요 단순히 기능 구현만을 위해 인터넷에서 코드 레퍼런스를 찾는 것과 서적 등을 찾아보며 기술의 이론적 배경을 찾고 이후에 코드를 공부하는 것의 퀄리티 차이가 꽤 많이 난다는 것을 깨달은 후에 단순히 코드를 찾는 것은 이 후 기술 적용에는 도움이 되지 않는다는 것을 깨달았다. 때문에 프로젝트에 채팅 기능을 당장 구현하기 이전에 채팅 시스템에 대한 이론적 공부를 수행하고자 한다. 👣 WebSocket 이전의 채팅 구현 1. Polling 단순히 HTTP 프로토콜 위에서 작동하는 구현 방법 중 하나다. 특정 주기마다 요청-응답을 수행하며 데이터의 상태를 체크하는 방식으로 리소스 낭비가 매우 심하다. 불필요한 트래픽을 끊임없이 생성할 뿐만 아니라 요청 주기가 크다면 실시간 채팅이란 말이 무색해질 수도 있다..

네트워크 2023.10.04

Spring Security Configuration 실험

실험 1 만약 authorizeHttpRequests 를 연거푸 호출하면 모든 설정이 제대로 반영될까? 정확한 실험 이유는 다음과 같다. 💡 만약 authorizeHttpRequests 를 연거푸 호출하면 모든 설정이 제대로 반영될까? 혹시 마지막에 사용된 authorizeHttpRequests 만 반영되는 구조인 것인가? @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { // 만약 덮어씌우기라면 사라져야 할 설정 1. http.authorizeHttpRequests(b -> b.requestMatchers(AntPathRequestMatcher.antMatcher(HttpMethod.GET,..

Spring Security 2023.09.30

9/26

👣 개요 오늘은 프로젝트의 SSL 적용을 끝마무리하고 RestTemplate에 ErrorHandler를 등록해 오류 로깅을 위한 장치를 마련했다. 대부분의 SSL 적용을 위한 Certbot 관련 게시글들은 StandAlone 방식을 이용해서 인증서를 발급받았다. 이러한 게시물들은 간단히 아래 명령어를 입력하고 몇 가지 문답을 통해 쉽게 발급을 수행했다. certbot certonly --standalone 문제는 해당 방식은 게시글에 나열된 방식과 다르게 작동하지 않았다. 따라서 StandAlone 방식이 아닌 Manual 방식으로 Challege를 진행하고자 했다. 이것은 직접 Let's encrypto가 제시하는 토큰을 개발자가 직접 전달하는 방식으로 이뤄져 있었다. 직접 임시 Controller를 ..

TIL 2023.09.26

9/25

👣 개요 오늘은 API 서버를 실제로 배포하기 위한 활동을 했었다. 대략적으로 EC2에 서버를 가동시키고 도메인을 취득하고 해당 도메인을 이용해서 https를 적용하는 작업을 했었다. 아래는 시간순으로 했던 일을 나열했다. 1. EC2에 3.36.132.42 IP로 웹 서버 띄웠습니다. 테스트를 위해 사용했던 서버기도 해서 APP 자체에는 문제가 없습니다. 2. '내도메인 한국' 사이트를 통해 무료 도메인을 취득했습니다. Domain : miniproject.kro.kr 3. Route 53을 통해 해당 도메인과 IP를 매핑해줬습니다. 그 결과 해당 도메인으로 EC2의 서버로 접속됨을 확인했습니다. 4. 이제 Https를 적용하기 위해 Certbot을 이용해서 SSL 인증서를 받고 있습니다. 문제는 Ch..

TIL 2023.09.25

주특기 프로젝트 중 소셜 로그인 회고

👣 개요 나는 주로 OAuth2 인증 과정을 Spring Boot 내에서만 사용해봤지 React와 함께 사용해본 적은 없었다. 때문에 Redirect URI는 당연히 백엔드 서버를 향하게 설정해왔고 React 팀과 함께하는 주특기 프로젝트 또한 Redirect URI를 백엔드 서버를 향하게 설정했다. 우선 OAuth2 인증 과정을 어찌 구현했는지 코드와 함께 이야기해야 어떤 문제가 있었는지 표현할 수 있을 것 같다. 👣 OAuth2 인증 과정 Authorization Code 취득 - 과정 1~3 우선 React 컴포넌트 내에 3번 과정을 수행할 Authorization Code 취득 링크를 클릭할 수 있도록 a 태그를 작성한다. 이 때, fetch가 아닌 a 태그로 이동하게 해야 한다. 왜냐 하면, f..

프로젝트 회고 2023.09.24

주특기 프로젝트 중 QueryDSL 도입 회고

👣 개요 항해 99에서 최종 프로젝트 전에 수행하는 주특기 프로젝트 중 QueryDSL을 도입한 과정을 회고하고자 이 게시글을 적게 되었다. 해당 프로젝트는 '블라인드' 사이트와 같이 회사에 대해 평가하고 정보를 나눌 수 있는 커뮤니티라고 볼 수 있다. 구현해야 하는 API 중 특정 회사명을 입력하면 해당 회사명이 포함된 회사들을 출력하는 API가 있었다. 👣 Query Method를 통한 검색 구현 우선 주특기 프로젝트를 수행하기 앞서 이번 프로젝트에서의 나의 각오는 프론트엔드 팀의 요구사항을 재빠르게 수용하고 결과를 내놓는 백엔드 개발자가 되는 것이었다. 이것을 위해선 유지보수가 매우 용이한 구조의 코드를 짜야 했었고 확장성을 염두해서 코드를 작성해야 했다. 검색 기능을 구현하는 것은 JPA에서 제공..

프로젝트 회고 2023.09.24

9/23

👣 개요 오늘은 그렇게 고생스러웠던 카카오 인증 과정을 끝내 구현하는 날이었다. 카카오 인증 과정 중 서버로서의 기능은 이미 구현되어 있었다. [사용자가 이미 Authorization Code를 받은 이후, 서버로 리다이렉션 되었을 때를 가정하고 그 이후의 과정인 Access Token 취득, User 정보 조회, DB 저장, JWT 발급을 구현한 상태.] 하지만 프론트쪽에서 Authorization Code를 받고 해당 token을 지닌 채로 리다이렉션 요청을 보낼 때, 리다이렉션 응답을 가로채는 방법에서 애먹고 있었다. 이미 Redirect Url로 자동으로 리다이렉트 되고 있기에 도저히 JWT 토큰을 받을 만한 방법이 보이지 않았다. 왜냐 하면, 이전까지 나의 OAuth2 인증 과정은 항상 Redi..

TIL 2023.09.23

9/22

👣 개요 오늘은 검색 기능의 페이징 구현과 소셜 로그인을 구현 완료하는 날이었다. 검색 기능의 페이징은 QueryDSL을 이용해서 해결했다. 해당 기능을 위해 기존 쿼리에 limit과 offset을 설정했다. 그리고 TotalElements 갯수를 찾기 위해 Count Query를 따로 작성했다. 처음에는 기존 코드에 단순히 fetchCount()를 이용해서 count 쿼리를 보내려고 했으나 이것은 이미 deprecated된 기능이어서 직접 select 파라미터에 count를 이용해서 카운트 쿼리를 보내게 했다. 문제는 소셜 로그인이었다. 로컬 서버에서 소셜 로그인을 수행할 때는 분명 문제가 없었다. redirect_url도 정확히 설정했고 Cors 설정도 정확히 했고 실제로 소셜로그인에 의해 acces..

TIL 2023.09.22