본문 바로가기

개발일지

(102)
[231029] S3 데이터 이전하기 S3 데이터 이전 💬 인생퍼즐 사이드 프로젝트에서 AWS 계정을 변경하면서 S3 저장소를 옮겨야 했습니다. 새로 S3를 만들고 기존 데이터를 전부 이동시키기로 했습니다. ✔ 기존 S3에서 데이터 받기 ✅ AWS CLI를 통한 다운로드 ➡ aws s3 cp s3://itmca-public . --recursive ➡ 하위 파일들까지 전체 복사하기 위해 --recursive 옵션을 사용 ✔ 다운 받은 데이터를 새로운 S3에 업로드 ✅ AWS CLI를 통한 업로드 ➡ aws s3 sync ./ s3://lifepuzzle-public ✔ 결과 ✅ 정상적으로 전체 데이터가 새로운 S3에 업로드 된 것을 확인
[231022] Mybatis 파라미터 #과 $의 차이 Mybatis 파라미터 받는 방식 💬 회사를 다니면서 Mybatis 코드를 보게 되었습니다. 코드에 #과 $ 기호를 사용하여 파라미터로 전달하고 있었습니다. 코드를 이해하기 위해 두 기호의 차이가 무엇인지 알아보기로 했습니다. 또한 각각 어디에 사용이 되는지도 궁금했습니다. 이후에 제가 작성하게 되면 적절한 곳에 사용하기 위해서입니다. ✔ 파라미터 # (Binding Variable) 1. 쿼리문이 파싱이 되면 해당 쿼리문을 재활용 2. 값에 자동으로 ''가 붙음 3. PreparedStatement여서 SQL Injection 공격을 예방할 수 있음 ✔ 파라미터 $ (Literal Variable) 1. 값이 들어올 때마다 쿼리문을 매번 파싱을 하여 사용 2. 값에 자동으로 ''붙지 않음 ➡ 문자열 입..
[231008] JWT는 어디에 저장을 해야할까? JWT 저장 장소 💬 기존에 작성했던 로그인 코드를 리팩터링 하는 과정에서 문득 궁금증이 생겼다. JWT에 Stateless라는 장점을 가진 대신 보안에 취약하다는 단점을 가지고 있는데, 이를 위해 어디에 저장하는 것이 좋을까? JWT 저장 후보군 ✔ 웹 스토리지 💬 웹 스토리지는 XSS(Cross-Site Scripting)에 취약해서 스크립트를 통해서 JWT가 쉽게 탈취될 수 있다는 문제를 가지고 있다. 실제로 스크립트를 통해서 토큰 확인이 가능한지 아래와 같이 테스트를 해보았다. ✔ 쿠키 💬 그에 반해 쿠키는 간단한 설정으로 XSS(Cross-Site Scripting)을 막을 수 있다. 하지만 CSRF(Cross Site Request Forgery)에는 취약하다는 문제가 있다. 결론 💬 보안적인..
[230923] Java PriorityQueue와 Comparator 사용하기 PriorityQueue 사용 💬 알고리즘 문제에서 저장한 데이터를 우선순위에 따라 추출해야 했습니다. 이 경우 가장 먼저 떠오르는 것이 우선순위 큐(Heap)였습니다. Java에서 제공하는 자료구조였기에 쉽게 적용해 볼 수 있었습니다. ✔ 메커니즘 💬 Java에서 제공하는 PriorityQueue는 Comparator를 지정하지 않으면 제너릭에 입력한 타입의 Comparator 가져다가 씁니다. 이번에는 Integer를 사용했기 때문에 숫자의 크기에 따라 우선순위가 정해졌습니다. ✔ 절댓값 크기로 우선순위 정하기 💬 문제에서 절댓값 크기와 절댓값이 같은 경우 숫자의 크기로 우선순위가 정해져야 했습니다. Integer Comparator를 사용하면 원하는 우선순위를 얻을 수 없습니다. 별도의 Compar..
[230913] Scale-out 환경에서 Scheduler 중복으로 실행되는 문제 Scheduler 중복 실행 💬 Scale-out을 적용하고 보니 경매 시작, 경매 종료, 경매 시작 전 알림을 처리하기 위한 Scheduler가 각 인스턴스마다 실행이 된다는 것을 알았습니다. 이것은 불필요한 실행이 일어나게 했습니다. ✔ 문제 해결 고민 💬 실행되는 서버 Instance가 늘어나더라도 Scheduler는 한 번만 실행할 수 있는 방법이 없는지 고민했습니다. 고민해 본 바로 3가지 방법을 고려해 볼 수 있다고 판단했습니다. ➡ Scheduler를 위한 별도의 서버를 띄우는 것이었습니다. ➡ 일정 주기마다 Scheduler가 들어있는 jar를 실행하는 것이었습니다. ➡ Scheduler에 Lock을 걸어 먼저 실행된 것이 있다면 다른 Scheduler는 실행되지 않게 하는 것이었습니다...
[230901] 간단한 화면 구현 간단한 화면 구현 💬 시연 영상을 위해 간단한 화면 구현을 해야했습니다. 별도의 Front 서버를 만들기보다는 기존 서버에 Thymeleaf을 사용해서 화면을 구성하기로 했습니다. HTML, JQuery, CSS, BootStrap5를 사용했습니다. ✔ Controller 추가 💬 제가 맡은 부분은 아이디어 쓰기, 아이디어 업데이트 부분이었습니다. 해당 페이지를 호출하기 위해 Controller를 생성하고 url에 연결 시켜주었습니다. @Controller @RequestMapping("/view") public class ViewController { @GetMapping("/pageWrite") public String ideaWritePage() { return "page/ideaWrite"; } ..
[230830] 서버간 통신을 위해 Kafka 적용 Kafka 도입한 배경 💬 메인 서버와 SSE 서버가 분리되면서 서버 간 데이터를 전송하고 받을 수 있는 수단이 필요했습니다. 후보군으로 나왔던 것이 Redis와 Kafka였습니다. ✔ 결정 기준 아래와 같은 이유로 Kafka를 사용하기로 했습니다. 1. 입찰 데이터를 전송이 실패할 경우 재시도가 가능해야 했기에 데이터가 보존되어야 했습니다. ➡ Redis의 경우 데이터 전송 후 사라집니다. 2. 비동기식으로 처리가 되어야 하며, 읽기/쓰기가 빨라야 했습니다. ➡ Redis의 경우 다른 소비자에게 데이터를 보내기 전에 응답을 기다려야 합니다. 3. 이후에 Scale-out을 고려했을 때 병렬적으로 데이터를 가져갈 수 있어야 했습니다. ➡ Redis의 경우 병렬성을 제공하지 않는다고 합니다. Redis와 ..
[230829] SSE 서버 분리하기 SSE 서버 분리 💬 기존 서버의 API를 응답 Latency를 낮추기 위해 SSE 서버의 분리가 필요했습니다. 그래서 기존 서버와 동일한 c5.large를 사용하여 SSE 서버를 하나 띄우기로 했습니다. ✔ 서버 분리 순서 1. SSE 코드를 위한 Repository 생성 및 코드 분리 2. AWS EC2 Instance(c5.large) 생성 3. SSE 서버 CI/CD 구축 ✔ SSE 코드를 위한 Repository 생성 및 코드 분리 💬 별도의 SSE 서버를 띄우기 위해 먼저 Repository를 생성하고 코드를 분리하기로 했습니다. 그리고 추가적으로 SSE에 필요한 설정 정보를 idea-rush-security Repository에 추가했습니다. GitHub - final-idea-rush/i..