본문 바로가기

전체 글

(18)
[Spring] 동시성 문제와 해결방법 알아보기 이번 포스팅에서 알아볼 문제는 동시성 문제입니다. 오늘은 동시성 문제에 대해 간략하게 설명하고, 자바에서 synchronized를 활용하여 동시성 문제를 해결하는 방식을 알아보고자 합니다.뒤에서 언급할테지만 이 방식은 단순히 '여러 스레드의 동시 접근을 막는 방식'이기 때문에 프로세스 내에서만 유효하다는 단점이 있다. 즉, 다중 서버(Scale Out)로 운용하는 서비스에서는 synchronized를 사용하더라도 동시성 문제를 해결할 수 없다. 따라서 데이터베이스에 락을 걸어 동시 접근을 차단하는 방식이 더 적합할 수 있다. 이와 관련해서는 추후 DB Lock 포스팅을 작성하여 정리하고자 한다. 동시성 문제동시성 문제란, 하나의 자원에 여러 스레드가 동시에 접근하여 데이터 정합성이 지켜지지 않은 것을 의..
[객체지향] SOLID 원칙 이해하고 적용하기(+ 일급 컬렉션) 최근 소셜 로그인 구현 코드를 리팩토링하는 과정에서 SOLID 원칙을 조사하고 적용해보았습니다. 따라서 이번 포스팅에서는 SOLID 원칙 설명과 리팩토링 과정을 정리하고자 합니다. 💡 배경 & 문제 인식이전에 소셜(카카오) 로그인 API를 서버측에 구현했는데, 문득 서비스에 새로운 소셜 로그인이 추가될 경우 현재 코드 설계는 적합하지 않다고 판단했습니다. 그 근거는 아래와 같습니다. 위의 UML 클래스 다이어그램은 기존 카카오 소셜 로그인 기능의 설계 구조입니다. 우선 소셜 로그인에 사용되는 객체가 모두 구현체로 정의되어 있는 것을 확인할 수 있습니다. 즉, 만약 서비스에 새로운 소셜 로그인이 추가되는 경우에 해당 소셜 로그인에 알맞는 컨트롤러 구현체, 서비스 구현체를 그때그때 구현해야 한다는 것입니다..
[Spring] N+1 문제 알아보기 이번 방학부터 자바 Spring을 학습하면서 프로젝트에 내용을 하나씩 적용해보고 있는데, 이 과정에서 첫 번째로 마주친 문제는 N+1 문제이다. 이번 포스팅에서는 N+1 문제가 무엇이며 왜 발생하는지를 알아보고, 이를 해결하기 위한 방안들과 그 중에서 어느 해결법을 적용했는지 기록하고자 한다. 📋 문제 상황 현재 프로젝트에서 Scrap 객체와 Dataset 객체는 아래와 같이 다대일 관계를 갖고 있다. // domain/Scrap.java @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor public class Scrap { // ... @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "da..
[Web] JWT 로그인 프로젝트에서 로그인 기능을 구현하면서 막혔던 부분들과 해결 과정을 기록하기 위해 포스팅을 작성했다. 특히 프론트 배포 서버 도메인과 백엔드 배포 서버 도메인이 서로 달랐기 때문에 여러 문제점에 부딪혀볼 수 있었다. 🔐 Session vs JWT Session 처음에는 session id를 통해 로그인 기능을 구현하려 했다. 그 이유는 stateless한 HTTP 통신 특성상 클라이언트의 로그인 상태를 확인하기 위해서는 쿠키를 활용해야 하는데, session id 값에는 유저 정보가 담겨있지 않으므로 보안상 이점이 더 많다고 생각했기 때문이다. 하지만 토큰 값에 유저 정보를 담지 않는 대신, 서버측에서 각 브라우저의 세션 id 정보 및 클라이언트 정보를 직접 관리해야 하므로 서버 파트의 부담이 더 커질 수..
[백준][C++] 11000번 - 강의실 배정 문제 링크 11000번: 강의실 배정 첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109) www.acmicpc.net 풀이 과정 먼저 시간복잡도를 확인해보았다. 시간 제한이 1초, N의 최댓값이 200,000 → N^2 = 40억 (대략 40초) 이기 때문에, 한 강의 시간을 살펴볼 때마다, 다른 강의 시간을 모두 탐색하는(브루트포스) 방법은 적절치 않을 것이라는 전제하에 코드를 작성하였다. 그리고 각 강의실에서 진행되는 모든 강의들 중, 가장 일찍 끝나는 시간을 알아내기 위해서 각 강의실에서 강의가 끝나는 시간의 정렬이 필요했다. 이 경우에는 시간이 새로 입력될 때마다 곧바로 정렬이 이뤄져야했기 때문에 최소 힙을 ..
[React] React Hook 사용하기 - useMemo, useCallback 깃헙 TIL 레파지토리에 올릴까 하다가 내용이 길어질 것 같아서 그냥 블로그에 올리기로 결심했다 . . . TIL을 마크다운 언어로 작성하다보니, 적은 내용이더라도 시간이 엄청 소요된다 ㅜㅜ 사실 블로그 포스팅도 좀 귀찮은데 그래도 안 쓰면 또 까먹을 것 같으니 포스팅해본다! 사실 그렇게 대단한 내용은 아니라서 블로그에 올릴 거리가 되나 싶긴 하지만 그래도 뭐든 과정에서 배운 점이 있다면 기록해둔다고 나쁠 것 없을 것 같다 우선 이번에 보여줄 코드는 Next 스터디(라고 하기에는 사실상 React 스터디)로 간단한 TODO 앱을 만들고 있는데, 이 과정에서 렌더링이 너무 무분별하게 발생하는게 꽤 거슬렸다. 따라서 기능을 더 추가하기 전에 React Hook을 사용하여 렌더링 횟수를 조금 줄여보았다. 우선..
[백준][C++] 1665번 - 가운데를 말해요 짜짠! 이 블로그에 알고리즘 관련 포스팅은 한번도 안써봤는데 지금 새벽 3시가 넘었는데 잠도 안오고해서.. 심심해서 그냥 깃허브 개인 레파지토리에 해설 파일을 정리해서 올렸는데 블로그에도 올려두면 좋을 것 같아서 포스팅을 하게 되었다. 요즘 알고리즘 공부를 조금씩 해보고 있는데, 기초적인 자료구조 내용은 이제 거의 다 학습한 것 같다(아마두..) 이제 알고리즘 내용을 하나씩 뜯어보기에 앞서, 자료구조 관련 문제를 하나 풀고 넘어가기로 했다. 문제 - 백준 1665번 https://www.acmicpc.net/problem/1655 1655번: 가운데를 말해요 첫째 줄에는 백준이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐..
[Web] SSR(Server Side Rendering)과 CSR(Client Side Rendering) 정말 오랜만에 올리는 포스팅 . . . . 그간 이런저런 일들이 있었는데, 일단 멋사 활동을 계속 병행하다보니 노션에 너무 익숙해져서, 그동안 내 개인 노션에만 기록하고 블로그는 까맣게 잊어버렸던 것 같다🥹 앞으로 블로그 포스팅도 다시 신경써야지 .. 여름방학에 멋사 10기의 공식적인 활동이 마무리되고, 남은 기간동안 교내 프론트엔드 트랙 부원들과 Next.js 스터디를 진행하고 있다. 다음 포스팅에서 관련 글을 정리하겠지만, 일단 간단하게만 설명하자면 기존에 클라이언트 사이드 렌더링만 지원하던 React와 달리 Next.js는 클라이언트 사이드 렌더링, 서버 사이드 렌더링을 적절히 병행하여 사용할 수 있다. 이러한 Next.js를 잘 활용하기 위해서는 기본적으로 SSR과 CSR의 차이점을 잘 이해하고 ..