본문 바로가기

개발일지

(101)
[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..
[230828] 입찰 API 응답 Average Latency 속도 문제 입찰 API 응답 Average Latency 속도가 느림 💬 입찰 API 로직 개선 이후 Jmeter로 테스트를 진행했습니다. 테스트는 SSE 1500명 연결에 입찰 1분에 1만 건을 보내는 것이었습니다. 테스트 결과를 보니 평균적으로 Average Latency가 약 1.6초 정도가 나오는 것을 확인했습니다. Latency가 1초 이내에 왔으면 하기 때문에 문제의 원인을 확인해 보기로 했습니다. ✔ 문제 원인 가정 - 01 💬 SSE에서 이벤트를 클라이언트에게 보낼 때 For문을 돌게 됩니다. 1500명의 유저에게 각 입찰마다 데이터를 보내다 보니 이것으로 인해 속도가 느려진다고 가정을 해보았습니다. 그래서 실제로 맞는지 테스트를 해보았습니다. 1. SSE 1500명 연결, 1분 1만 건 입찰 요청,..