본문 바로가기

개발일지/TIL

(89)
[230809] 알림 기능 구현 알림 기능 구현 기술 선택 💬 알림 기능은 실시간으로 이루어져야 합니다. 서버에서 클라이언트 방향으로만 데이터가 전송이 됩니다. 서버의 부담이 상대적으로 적게 들어가야 합니다. ✅ 실시간을 보장하며, 서버에서 클라이언트로 단반향 데이터 통신을 사용할 수 있는 SSE를 선택하기로 했다. 뿐만 아니라 양방향을 지원하는 WebSocket보다 서버에 주는 부담도 적다. ✔ SSE 기능 구현 💬 알림과 실시간 입찰 가격 조회 기능을 하나의 SSE로 처리하려고 했다. SSE가 별도로 만들어진다면 서버가 부담이 될 수 있다고 판단했기 때문이다. public class SseService { private static final Long DEFAULT_TIMEOUT = 1000 * 60 * 30L; private st..
[230808] Polling, SSE, WebSocket ? 알림 기능 구현 알림 기능을 구현을 하기로 했다. 알림은 이벤트가 벌어질 때마다 실시간으로 유저들에게 보내져야 했다. 실시간 통신이 필요했기에 찾아보고 적용해 보기로 했다. 대표적으로 Polling, WebSocket, SSE 3가지가 있었다. 각자 어떤 특징이 있고 프로젝트에 적합한 방식은 무엇인지 고민하고 결정하기로 했다. Polling ? 💬 실시간 통신을 처리하기 위해 사용되는 방식입니다. HTTP 프로토콜을 사용하여 통신을 하며, Polling과 Long Polling 방식이 있습니다. ✔ Polling 💬 Polling은 일정한 간격으로 클라이언트에서 서버로 요청을 보냅니다. 서버는 요청한 데이터를 응답으로 내려준다. 데이터가 없다면 빈 응답을 내려줍니다. 💢 Polling의 경우 짧은 간격으..
[230807] Java Security AutoConfigure가 될 때 Https Port 매핑 Security AutoConfigure시 Https Port 이슈 ✔ 이슈 💢 Java Spring Boot를 통해서 기본 구조만 갖추고 https를 적용해 봤다. 그런데 http일 때는 브라우저를 통해 서버에 정상적으로 접근이 가능했는데 https를 적용하니 접근이 안 되는 문제가 발생했다. ✔ 원인 분석 💬 브라우저에서 요청 시 https://domain:8080이 https://domain:8443으로 리다이렉트 되는 것을 발견했다. Port 리다이렉트 되는 것을 중심으로 원인을 알아보기로 했다. 💬 찾아본 결과 Security AutoConfigure를 사용할 시 https에 매핑된 포트로 변경이 된다는 것을 알게 되었다. 80 포트의 경우 443으로 매핑이 되고 8080 포트의 경우 8443으..
[230806] Wrapper 클래스 비교 문제 Wrapper 클래스 비교 문제 💬 equals와 "=="의 비교는 정확히 알고 있다고 생각하고 있었습니다. 그런데 이번에 "== " 비교로 인해 문제가 발생하고 있는 코드를 마주하게 되었습니다. ✔ 문제 💢 아이디어에 대한 권한을 체크하기 위해 현재 유저 ID와 아이디어 작성 유저 ID를 비교를 했습니다. 근데 두 타입은 Long인데 비교를 "=="를 사용했습니다. "==" 비교는 참조 타입의 경우 주소를 비교하기 때문에 실제 값을 비교해야 하는 경우 문제가 발생합니다. userId == idae.getUser().getId(); ✔ 해결 ✅ Long 타입의 eqauls는 실제 값을 비교한다는 것을 확인했습니다. 그래서 "=="을 equals로 변경해서 해결했습니다. 1. Long equals 메서드 ..
[230805] [파이널] 프로젝트 진행 (4) S3 기능 구현 💬 아이디어 등록과 수정할 때 이미지를 S3에 업로드 및 삭제하는 기능이 필요했다. 내가 맡아서 S3를 사용하는 기능을 만들기 이전에 구현을 하기로 했다. ✔ S3 Config 코드 @Configuration public class S3Config { @Value("${cloud.aws.credentials.access-key}") private String accessKey; @Value("${cloud.aws.credentials.secret-key}") private String secretKey; @Value("${cloud.aws.region.static}") private String region; @Bean public AmazonS3Client amazonS3Client()..
[230804] [파이널] 프로젝트 진행 (3) 코드 리뷰 💬 각자 API를 작성하고 Pull Request를 날렸고 코드를 리뷰하는 시간을 가졌다. 자신의 코드에 매몰되지 않고 서로의 코드를 보면서 배울 수 있는 시간을 갖게 해 주기 때문이다. 그리고 보지 못한 내 코드의 문제점들도 알 수 있는 시간이다. ✔ 이미지 파일 검증 💢 아이디어를 업데이트할 때 이미지 파일이 처리된다. 이때 악성 파일(exe)이 들어올 수 있기 때문에 이미지가 맞는지 확인하는 코드가 필요하다는 피드백이 있었다. ✅ ContentType을 통해 이미지인지 확인하는 코드를 작성했다. ➡ 파일에서 내용을 추출해서 어떤 포맷의 파일인지 확인할 수 있는 Apach Tika 이후에 적용해 볼 수 있겠다. private boolean validateImage(MultipartFile ..
[230803] [파이널] 프로젝트 진행 (2) 테스트 코드 ✔ 테스트 코드 적용 이유 💬 CI에는 자동 테스트가 있을 때 더 빛을 발한다고 생각한다. 테스트 코드는 합칠 때 작성한 코드들이 문제가 없음을 보여줄 수 있는 근거이기 때문이다. 팀원들과 논의를 거쳐 이러한 이점을 위해 각 기능을 구현할 때 비즈니스 로직은 테스트 코드를 작성하기로 했다. ✔ 테스트 코드 이점 💬 테스트 코드는 비즈니스 로직을 짤 때 가장 이점이 많은 것 같다. 중요한 로직에서 발생할 수 있는 버그를 사전에 예방할 수 있다. 코드에서 빼먹은 로직을 확인하고 보충할 수도 있다. ✔ Mock의 사용 💬 실제로 테스트 코드를 짜다 보니 Service에 들어가는 비즈니스 로직에는 DB 통신 부분이 대부분 들어간다는 것을 알았다. 통신 부분을 그대로 유지한 체 테스트를 한다면 우리가..
[230802] [파이널] 프로젝트 진행 (1) 환경 설정 ✔ local 전용 application.yaml 설정 💬 중요한 정보가 들어있는 application.yaml를 보안 처리를 하기 위해 GitHub의 Private Repository에 저장을 하고 Sub Module로 사용을 했다. 빌드를 할 때마다 Sub Module에 있는 application.yaml를 resource에 복사를 해서 사용하도록 설정을 했다. 💢 로컬 DB 정보를 입력해서 사용하려고 하면 Sub Module에 있는 application.yaml 내용을 바꿔야 하는 문제가 발생했다. ✅ resource에 application-local.yaml 파일을 하나 만들어 로컬 환경 정보를 사용하도록 만들었다. ➡ application-local.yaml에 정보가 없는 경우 app..