목록전체 글 (94)
Kuma's Curious Paradise
1. 왜 @JsonFormat, @JsonCreator, @JsonProperty이 필요할까?스프링으로 웹 개발을 하면 spring-boot-starter-web 의존성을 추가해야 한다. implementation 'org.springframework.boot:spring-boot-starter-web' 이 의존성에는 웹 개발에 필요한 기본 구성 요소들이 모두 포함되어 있는데,그중에서도 아주 중요한 요소가 바로 Jackson이다. Jackson은 기본적으로 다음의 일을 수행한다. Java → JSON: 직렬화 (serialize)JSON → Java: 역직렬화 (deserialize)하지만 Java의 모든 구조가 JSON에 딱 들어맞는 것은 아니다. 특히 날짜 변환이 그렇고, jackson에서 객체의 ..
1. 자바의 어노테이션과 스프링의 어노테이션어노테이션은 @ 기호로 시작하는 메타데이터로, 클래스나 메서드 위에 붙이면 어떤 의미나 동작을 추가로 부여한다. 예를 들어,@Deprecated는 “이거 이제 쓰지 마세요”라고 경고한다. @Autowired는 “스프링 씨, 이 클래스 빈으로 만들어서 자동 주입해주세요”라는 뜻이다. 자바에는 기본적으로 제공하는 어노테이션들이 있다.JDK에서 자체 작동하는 어노테이션들이다.예를 들면 : - @Override - @Deprecated - @FunctionalInterface이런 어노테이션들은 컴파일러가 인식/처리하지만(override한 메서드의 이름이 다른지 확인하는 등), 실행 중에 무슨 동작을 하진 않는다. 스프링은 좀더 발전된 어노테이션 체계를 추구한다. 어..
최근 프로젝트에서 아래와 같은 Lombok 어노테이션이 붙은 코드를 발견했다.아래는 해당 코드를 단순화한 예시다. (말이 안 될 수 있으니... 예시로만 봐 주면 좋겠다.)@EqualsAndHashCode(of = {"bookId", "bookPriceId"})public class BookCover { private Long bookCoverId; private Long bookId; private Long bookPriceId; private int price; public BookCover(Long bookId, Long bookPriceId) { this.bookId = bookId; this.bookPriceId = bookPriceId; ..

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

아이북조아에서는 '좋아요&싫어요'와 같은 피드백을 하면 회원의 성향(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. 그렇다면 왜 이렇게 다른 프로세스 구조를 가지고 있을까?이는 어플리케이션의 성격과 주요 목적이 다르기..