분류 전체보기

최근 한 프로젝트에서 HTTP 요청/응답을 로깅을 구현하게 되어 해당 글을 쓰게 되었습니다!    ✔️ 프로젝트에 로깅을 도입하게 된 계기 운영서버에서 개발자가 발견하지 못한 엣지케이스 같은게 있을 수도 있는데, 이러한 경우에 대한 대비가 전혀되고 있지 않았던 상황이라는 생각이 들었어요. 따라서 로깅 시스템을 구축하여, 실제 운영상황 및 QA시에 버그가 발생했을때, 추적을 용이하게 하기 위해서 도입을 결정하게 되었습니다!  이전에 다른 프로젝트 했을때도, 사실 로깅을 신경을 많이 쓰지 못했기에 에러가 나는 상황에서 불편함이 종종 있었어요. 예를 들어, 클라에서 에러난다고 하면 원인을 찾고 빠르게 대응하기가 어려웠다거나... 그래서 지금처럼 실제 운영되고 있는 서비스에서는 더더욱 있으면 좋겠다 싶었습니다!..
· CS/Database
정규화 (Normalization)정규화는 데이터베이스 설계 과정에서 데이터를 효율적으로 분리하여 중복을 줄이고, 무결성을 유지하기 위한 방법입니다. 정규화의 목표는 데이터 중복을 없애고 데이터 일관성을 보장하는 것. 중복 데이터를 허용하지 않음으로써, 무결성을 유지하고, DB 저장 용량도 줄일 수 있다.정규화는 여러 단계로 나뉘며, 각 단계는 정규형 (Normal Form)이라고 부릅니다. 가장 일반적으로 사용하는 정규형은 1~3 정규형이다. 1. 제 1 정규형 (1NF)제 1 정규형은 "각 컬럼이 원자값(Atomic Value)을 가져야 한다"는 규칙.즉, 각 열의 값은 더 이상 나눌 수 없는 단일 값이어야 하며, 복합적인 값이나 리스트, 집합 등을 컬럼에 저장할 수 없다. 예시:학생ID 학생이름 수..
오늘은 유명한 유형 중 하나인 LIS 유형에 대해 정리해보고자 한다. 해당 유형을 안 지 얼마 되지 않았지만, 유형이 어느정도 정형화 되어있는 느낌이다. 해당 유형을 풀이하는 방법은 DP, 이분탐색 2가지가 있다. DP로 풀이할 경우 O(N^2)의 시간복잡도를, 이분탐색으로 풀이할 경우 O(NlogN)의 시간복잡도를 가진다. 따라서 문제에 나와있는 조건을 잘 보고 시간복잡도를 따져서 알고리즘을 선택하는 것이 중요하다. 해당 유형은 가장 긴 증가하는 부분 수열의 길이까지만 구하거나, 더 나아가 부분 수열 자체를 출력해야하는 문제들이 있다. 해당 유형은 1,2편으로 나누어 작성하고자 하며, 해당 글(1편)에서는 가장 긴 증가하는 부분 수열의 길이까지만 구하는 문제를 다뤄보고자 한다. 우선 백준 12015번 ..
예를 들어, 사용자에게 게시글 목록을 조회한다고 했을 때 한 화면에 10개씩 데이터를 보여주려고 한다.그런데 이때 클라이언트가 서버에게 DB에 존재하는 모든 게시글을 받아온다면 어떻게 될까?  성능이 매우매우 떨어질 것이다. 게시글 개수가 수백만,, 더 나아가 여러 사용자가 동시에 게시글 목록을 조회한다면DB에 많은 부하가 걸릴 것이다.. 이렇게 부하와 데이터 로딩 속도를 효율적으로 조절해주기 위해 등장한 것이 페이지네이션! 🪽 페이징(Paginatinon)데이터를 쪼개서 일부만 가져오는 기법 크게 offset 기반 페이징과, cursor 기반 페이징이 있다. 🪽 offset 페이징offset : 어디부터 시작해서 가져올것인지?limit : 몇개의 데이터를 가져올 것인지?SELECT *FROM pro..
이번 글은 삼성 코테 기출 문제인 19238번 문제를 복기하면서 쓰는 글이다.https://www.acmicpc.net/problem/19238  해당 문제는 문제설명에서도 나와있듯이, 택시가 승객이 위치한 곳으로 이동해야하며 이때 택시의 위치에서 가장 가까운 위치에 있는, 즉 최단경로에 있는 승객을 태우러 가기 때문에 BFS 알고리즘을 떠올려야 했다. + 조건을 잘 따져가면서 풀어야 하는게 중요했다. 해당 문제는 눈높이 개발에서 진행하는 코딩테스트 챌린지를 진행하면서 푼 문제인데, 여기서 힌트를 주신게 메모리 초과가 나지않게 점검해보라고 하셨던 거였다! 그래서 처음에 딱 생각이 났던게, 택시와 승객의 최단 경로 길이를 구해야하는데 이걸 승객마다 BFS를 돌리기에는 시간초과가 뜰 것 같다는 생각이 들었다..
해당 글은 지난 글에 이어서 작성하는 글이며, 김영한님의 '스프링 DB 1편 - 데이터 접근 핵심 원리' 강의를 참고했습니다.  멀티스레드 환경에서의 트랜잭션 동작 - feat. 테스트 코드최근에 한 프로젝트에서 테스트 코드를 짜다가 트러블 슈팅 과정에서 새롭게 안 사실이 있어서 블로그를 작성하게 되었다. "동일한 이메일로 사용자가 동시에 가입할 경우, 하나의 계정만 생성judyalwayswantscarrot.tistory.com   지난번 글에서 "멀티스레드 환경에서의 트랜잭션 동작"을 살펴보았다!  아래와 같이 테스트 코드를 짰을때, 메인 스레드인 테스트가 시작되는 메서드와 내부에서 생성된 3개의 스레드들에서 트랜잭션이 제대로 동작하고 있는지 확인보았다. 결과적으로는 메인 스레드인 테스트 메서드에서는..
최근에 한 프로젝트에서 테스트 코드를 짜다가 트러블 슈팅 과정에서 새롭게 안 사실이 있어서 블로그를 작성하게 되었다. "동일한 이메일로 사용자가 동시에 가입할 경우, 하나의 계정만 생성되는지"에 대한 테스트 코드를 짰다. 이를 위해 멀티스레드 환경에서 동시에 같은 이메일로 유저를 저장했을 때, 하나의 계정만 생성되었는지 확인하고자 했다. 처음 구성한 코드는 아래와 같다.1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950@DataJpaTestclass MemberRepositoryTest {     @Autowired    private MemberRepository memberRepositor..
최근 프로젝트에서 nginx 무중단 배포 설정을 하면서 겪은 일인데, 기록을 해두면 좋을 것 같아서 오랜만에 블로그를 쓰게 되었다.ㅎㅎ 우선 해당 프로젝트에서 github actions + aws code depoly + aws s3 + aws ec2를 사용하여 CI/CD 구축을 해놓은 상황이었다.무중단 배포 설정은 해두지 않아서, 새 버전으로 배포를 할 시에 다운타임이 생긴다는 치명적인 문제점이 있었다..! 이를 해결할 수 있는 방법으로, 리버스 프록시 역할을 해줄 수 있는 nginx로 무중단 배포를 하고자 하였다.  TO-BE- 하나의 EC2 혹은 리눅스 서버에 Nginx 1대와 스프링부트 jar를 2대를 사용- 스프링부트1은 8081포트로, 스프링부트2는 8082포트(포트 번호는 자유)를 사용 Fl..
주디(Junior developer)
'분류 전체보기' 카테고리의 글 목록