목록전체 글 (101)
Kuma's Curious Paradise

📦 컨테이너란?컨테이너는 애플리케이션과 그를 실행하기 위한 모든 것들(라이브러리, 설정 파일 등)을 하나로 묶어 어떤 환경에서도 동일하게 실행할 수 있도록 해 주는 '실행 단위'이다. 예를 들어, 내가 좋아하는 커피를 항상 똑같은 맛으로 내릴 수 있게 커피 머신과 원두, 필터, 컵까지 전부 한 박스에 담아다니는 것과 같다. 이 박스를 가져가기만 하면, 카페든 사무실이든 항상 같은 커피를 만들 수 있다. 커피를 내리는 데 필요한 모든 도구와 환경이 박스 안에 담겨 있기 때문이다. 더불어 다른 박스와 섞이지 않기 때문에, 적절한 비유일지 모르겠으나, 독립적으로(!) 커피를 내릴 수도 있다. 이처럼 컨테이너는 애플리케이션을 다른 프로세스와 격리된 환경에서 실행될 수 있도록 돕는다. 컴퓨터의 원래 운영체..

아이북조아에서는 '좋아요&싫어요'와 같은 피드백을 하면 회원의 성향(MBTI)이 바뀐다. 해당 변화는 피드백을 한 도서의 성향(MBTI)에 영향을 받는다. 이를 위한 배치 Job은 다음과 같이 진행된다. Job: syncFeedbackAndUpdateTraitsJobStep: Step1 : syncFeedbackStep - redis에 임시 저장되어 있던 좋아요/싫어요를 mysql로 이관한다 Step2 : updateTraitsChange - mysql에서 step1의 결과를 읽어와 점수 변화를 계산하고 TraitsChange 테이블을 업데이트한다 Step3 : updateChildTraits - 갱신된 TraitsChange 테이블을 읽어 점수가 5 이상이면 ChildTraits에 새로운 레..

유레카가 끝나고 나서야 회고를 몰아서 쓴다.멍티비티는 LG 유플러스 유레카 백엔드 비대면 '최종 융합' 프로젝트로, 아이북조아와 마찬가지로 좋은 성과를 낼 수 있었다. (상장이 너무 으리으리해 보여서 좀 부끄럽지만...) 프론트엔드 4명 & 백엔드 4명이 진행하였으며, https://mungtivity.vercel.app/ 에서 이용해 볼 수 있다. 사진은 옹기종기 9조 친구들... 내가 선 자리에 빔프로젝터 불빛이 너무 세게 비쳐 차마 눈을 뜨지 못했다는 후문... 관객들과 빛이 겹쳐 모든 분들이 하늘에서 내려오신 것처럼 성스럽게 보였다. 😅 멍티비티는 멍멍이 + 액티비티를 합친 이름으로, 강아지와 함께 액티비티를 즐기고 싶은 이들을 위한 '강아지 동반 시설 공유 플랫폼'이다. 따라서, 멍티비티를 ..

'아이북조아'는 LG 유플러스 유레카 백엔드 비대면 1기 교육과정을 수료하며 진행한 종합 프로젝트이다. 백엔드 팀원 6명이 모여 서버 사이드 렌더링으로 웹사이트를 구축하였고, 다음과 같은 좋은 성과가 있었다. 이제 발표 자료 일부를 살펴보며, 프로젝트 회고를 진행해 보려 한다. 이번 프로젝트의 잘한 점페어 프로그래밍 진행 (의사소통과 협업 능력 함양)애자일한 프로젝트 관리 (Jira, Slack, Github, Canva 등)확실한 성능 테스트 및 테스트 코드 작성이후 DB 관련하여 추가 테스트 및 조사 실시먼저 페어 프로그래밍 진행이다. '아이북조아'는 2명&2명&2명 || 3명&3명 페어 프로그래밍으로 개발을 진행했다. 페어 프로그래밍은 함께 코드 방향을 의논한 뒤에, 각자가 역할을 맡아 ..

백준의 2751번 문제를 여러 정렬로 풀어보았다. https://www.acmicpc.net/problem/2751 이중 시간초과가 나지 않은 방법은 '병합 정렬'과 Arrays.sort 였는데, 왜 이러한 결과가 나오는지 파헤쳐보자. 1. 버블 정렬붙어 있는 두 개의 값을 비교한 뒤, 큰 수가 오른쪽으로 가도록 swap을 진행한다. (이 모습이 보글보글해 보여... 버블 정렬이라고 부른단다.)더 이상 바뀌는 수가 없을 때까지, 즉 정렬이 완료될 때까지 반복한다. 최악의 경우, (n-1) + (n-2) + ⋯ + 1 번의 연산을 수행해야 하기 때문에 시간 복잡도는 O(n*n). 기존 배열 내에서 swap만 수행하므로 공간 복잡도는 O(1). import java.io.BufferedReader;im..

위 두 테이블은 같은 ‘좋아요’ 테이블이다.다른 점은 feedback 테이블은 복합키로 구성되어 있고, rec_book_like 테이블은 그렇지 않다는 것. 이 둘은 각기 다른 pk와 fk, 그리고 인덱스를 지닌다. [feedback 테이블]PK는 book_id와 child_id 모두를 합한 형태. 예를 들면, (1,2) 형태로 키를 지닌다. → mysql에서는 primary 키가 설정된 순서대로 컬럼을 정렬하기 때문에, book_id를 기준으로 먼저 정렬한 다음, child_id 순으로 정렬된다.FK는 book_id와 child_id를 지닌다.index는 (book_id, child_id)와 (child_id)를 지닌다.book_id에는 index가 걸려 있지 않음을 알 수 있다. → 이는(첫 번째 정..

Q1. 카카오톡은 멀티프로세스일까, 단일 프로세스일까?Mac의 Spotlight에 들어가 Activity Monitor를 검색해 보자. 관련 항목이 여러 개가 뜬다면 멀티 프로세스, 하나만 뜬다면 단일 프로세스이다.카카오톡은 단일 프로세스인지, 멀티 프로세스인지 헷갈린다. 뭔지는 모르겠지만 ‘키체인’이라는 보조 프로세스를 사용하고 있는 것으로 보인다. 구글의 경우, Helper 프로세스들이 함께 동작하고 있는 것을 볼 수 있다. Google Chrome이라는 주 프로세스, Renderer, GPU, Plugin 까지 여러 개의 프로세스들이 함께 동작하는 확실한 멀티 프로세스 구조를 취하고 있다. Q2. 그렇다면 왜 이렇게 다른 프로세스 구조를 가지고 있을까?이는 어플리케이션의 성격과 주요 목적이 다르기..

유레카 미니 프로젝트2 발표 도중 캐시로 성능이 얼마나 향상되었냐는 질문을 받았다. 그럼 jmeter로 확인해보면 되지! 일단 캐시가 적용된 상태를 체크해보자! 하던 도중… 예상치 못한 상황을 만났다.문제1 : 캐시가 제대로 적용되지 않았다아래는 테스트 설정이다. 500개의 스레드가 60초 동안 차례로 들어온다. 각 스레드들은 200초까지 유지된다.캐시를 적용한 채 getRanking을 테스트해 보았다. 시간이 좀 지나자 에러가 터지고… 서버가 마비되기 시작했다. 117,078: 117,078개의 요청이 처리되었다. 이는 캐시 적용 시 서버가 처리한 전체 요청 수를 의미한다.676 ms: 평균 응답 시간. 이는 각 요청에 대해 서버가 응답하는 데 걸린 평균 시간을 나타낸다. 캐시 적용 시 응답 시간이 얼..

1. AOP 적용하기1-1. aop란 무엇인가?애플리케이션의 핵심 로직에 영향을 주지 않으면서, 공통적인 기능(예: 로깅, 트랜잭션 관리, 보안)을 코드의 다른 부분에 쉽게 적용할 수 있도록 하는 프로그래밍 패러다임 1-2. 핵심 개념Aspect: 횡단 관심사(로깅, 보안 등)를 모듈화한 객체. 여러 모듈에 공통으로 적용되는 기능.JoinPoint: AOP에서 적용할 수 있는 시점(예: 메서드 호출, 예외 처리 등). 어디서 끼어들까?Advice: Aspect가 적용될 구체적인 동작(예: 메서드 실행 전, 후에 실행할 동작). 뭘 할까?Pointcut: Advice를 적용할 지점을 정의하는 표현식. 메서드 실행 전? 후? 지정하기1-3. interceptor, filter와의 차이점은 무엇인가?AOP, ..
프로젝트에서 토스 결제 API와 같은 외부 API를 활용하는 경우, 테스트 코드를 어떻게 작성해야 할까? 구글링해 본 결과, 프론트 코드를 만들어 호출 및 실행을 확인하는 경우가 많은 듯했다. 하지만 이것만으로는 충분하지 않다. 이들은 프로젝트 내 다른 비즈니스 로직과 얽혀 있는 경우가 많기 때문에 이러한 로직들까지도 테스트할 필요가 있었다. 따라서 오늘은 토스 결제 API를 중심으로 외부 API와 함께 비즈니스 로직이 포함된 테스트 코드를 작성해 본 경험을 적어보고자 한다. 이제부터 소개할 테스트 코드는 실제 외부 API를 호출하는 '통합 테스트'가 아니다. API의 응답을 모킹하여, '~~~하게 응답했다 치고' 작성하는 'MockMvcTest'임을 미리 밝힌다. 1. 테스트해야 할 코드@RestC..