Spring 10

[회고록] Stock-simulation 프로젝트 API 완성도 기록지

이번 회고록 또한 저번 프로젝트 회고록과 마찬가지로 늦은 감이 있다. 이번 회고록의 목적은 학생 신분의 재정상 유지하기가 어려운 서버 비용때문에, 서비스 배포를 유지할 수 없었기에이 프로젝트의 완성도를 기록하고, 회고하는 것이다. 이 회고록의 목적이 기술적 기록이 아닌 프로젝트의 완성도에 대한 기록이니만큼, 코드나 기술적 설명 없이 Api 호출에 대한 캡처 내용으로 구성된다. 로그인, 회원가입과 같은 기본적인 기능을 제외하고 주요 기능이라 판단되는 Api들을 위주로 작성할 예정이다.추가적으로 해당 기능을 개발하며 겪은 고민과 트러블 슈팅등 또한 간략하게 소개해보고자 한다. 프로젝트 소개 해당 Stock-simulation 프로젝트는 프로젝트 이름 그대로 모의 주식 투자 서비스이다.가상의 돈을 사용하여, ..

백엔드 멘토링 2024.12.20

주식 프로젝트 influx DB 도입 ADR 과정

이번에 진행하고 있는 모의 주식 투자 프로젝트에서 influx DB 도입을 결정했다.모의 주식 투자인 만큼 실시간 주식 가격을 받아와야했고, 과거의 주식 가격을 그래프로 보여줘야했다.이러한 방식의 데이터 저장을 하기 위해서는 초 단위로 변화하는 주식의 가격을 모두 저장해야했고, 이렇게 하면수십 수백가지가 되는 주식 수만큼의 쿼리가 초단위로 RDB에 날라가게 된다. 그럼 주식의 가짓수가 300가지라고 했을 때, 1분동안 서비스가 실행된다면 300 * 60 으로 총 18,000개의 쿼리가 발생한다.이는 매우 비효율적일 것이라고 생각되었다. 그래서 어떻게 하면 시간을 기준으로 변화하는 데이터를 효율적으로 저장할 수 있을지 고민을 하며, 방법을 찾던중Influx DB라는 시계열 DB를 발견했다. Influx D..

백엔드 멘토링 2024.10.30

주식 투자 프로젝트 실시간 Real time DB 적용기

해당 글은 모의 주식 투자 프로젝트에서 real time DB (실시간 DB)를 적용하는 과정을 회고하는 글이다.주로 어떤 고민을 했고, real time을 선택하게 된 과정을 적어놓은 글이니 가볍게 읽을 수 있는 포스팅이라 생각한다.  최근 진행한 프로젝트는 모의 주식 투자 시뮬레이션 프로젝트다.해당 프로젝트의 특성상 실제 주식 가격을 실시간으로 받아와야만 했다.내가 선택한 방법은 KIS, 한국투자증권에서 제공하는 실시간 주식 체결가 API를 통해 KIS에서 제공하는 web socket으로 데이터를 받아오는 방식이었다.  따라서 초기에 실시간으로 변경되는 주식의 가격을 저장하기 위해 위와 같은 플로우로 계획했었다.이러한 방식에서 만약 사용자가 현재 실시간으로 전체 주식들의 가격을 보고자 한다면, 나는 ..

백엔드 멘토링 2024.09.06

객체지향적 Refactoring 과정의 기록

현재 진행 중인 프로젝트의 객체지향적 리팩터링 과정을 기록해보고자 한다.구체적인 리팩터링 과정에 앞서 리팩터링이란 무엇인지 짧게 설명하자면 Refactoring이란 외부 동작을 바꾸지 않으면서 내부 구조를 개선하는 방법이다. 즉, 결과는 바뀌지 않지만 내부적으로 코드의 구조 혹은 코드의 디자인을 개선시켜서 코드의 가독성과 유연성, 유지보수성등을 향상하는데 목적이 있다. 지금 쓰는 글이 단순히 리팩터링에 대한 글이라고 생각하지는 않았으면 한다.내가 한 리팩터링은 사실 리팩터링보다는 구조 개선에 가까운 코드 수정이며, 진행하면서 많은 것들이 바뀐다.다만 객체지향설계와 객체지향프로그래밍을 공부하면서 최대한 프로젝트를 객체지향적으로 고치고자 하기에, 코드를 고쳐가며, 어떤 문제점들이 있었는지 자세한 코드와 함께..

백엔드 멘토링 2024.07.11

순환 참조를 해결해보기

이번 Triple 클론 코딩 프로젝트를 진행하면서, 순환 참조로 인한 문제가 발생했다. 이번에는 이를 해결한 과정에 대해서 글을 써보고자 한다. 내 프로젝트에서 순환 참조가 발생한 부분은 내가 짠 계획 전체 조회와 내 예약 전체 조회를 하는 로직에서 순환 참조가 발생했다. 먼저 나의 계획 전체 조회 기능이다. 문제가 되었던 코드 먼저 보자 1.Controller @GetMapping("/plans") public ResponseEntity readPlan(@RequestParam long userId) { PlanReadAllResponseDto responseDto = service.findAllPlan(userId); return ResponseEntity.ok(responseDto); } 2. Se..

백엔드 멘토링 2024.02.28

좋아요 기능 성능 개선해보기 (2)

이번에는 저번 좋아요 기능 성능 개선해보기(1)에 이어서 리팩터링을 해보고자 한다. 저번 리팩터링에서 기존 하나의 요청마다 DB에 좋아요(좋아요 취소) 쿼리를 전송하여 사용자가 많이짐에 따라 DB 커넥션도 증가하면서 DB 부하가 너무 크게 걸리는 것을 해결하고자 하였고, 나는 좋아요 요청을 따로 local의 Map에 임시 저장 시켜놨다가 Spring Batch를 사용하여 5초마다 DB에 벌크 업데이트 시켜주도록 리팩터링을 진행하여 TPS 2.5배 향상, MTT 81%감소 라는 개선을 하였다. 하지만 이는 Map연산이 추가됨에 따른 리소스를 생각해보니 너무 많은 자원을 사용하지 않을까 싶었고, 다른 사람들 혹은 기업은 어떻게 좋아요를 구현했고, 어떤 방식으로 개선하였는지 궁금해졌다. 먼저 말하자면, 다른 ..

백엔드 멘토링 2024.02.22

좋아요 기능 성능 개선해보기 (1)

Trilple 클론 코딩 프로젝트를 진행하면서, 특정 게시물에 대해 좋아요를 누르는 기능이 요구되었다. 이번 글은 좋아요 기능에 대한 성능을 어떻게 개선했는지에 대한 기록이다. 초기의 코드 (좋아요 기능이 아닌 일부 기능 제외) public class Place { @ElementCollection @CollectionTable(name = "place_like", joinColumns = @JoinColumn(name = "place_id")) private List likes = new ArrayList(); public void like(long userId) { if (isLikedBy(userId)) { likes.remove(userId); return; } likes.add(userId); ..

백엔드 멘토링 2024.02.16

단축 url 서비스 Base62으로 리팩터링하기 - 회고록

이번 단축 url 서비스 토이 프로젝트를 진행함에 있어서 나는 단축된 url로 제공할 임의의 문자열이 필요했다. 그래서 초기에 나는 random 값을 사용하여 ASCII CODE에서 무작위로 문자, 숫자를 불러오자! 라고 생각하여 아래와 같이 코드를 작성했었다. public void makeKey() { randomKey = levelingKey(random.ints(AsciiCodeIndexForRandomString.NUMBER_START_IN_ASCII_CODE.index, AsciiCodeIndexForRandomString.LOWER_ALPHABET_LIMIT_IN_ASCII_CODE.index) .filter(i -> (i = AsciiCodeIndexForRandomString.UPPER_A..

백엔드 멘토링 2023.10.08

RestTemplate vs webClient vs openFeign 차이

Spring framework 에는 다양한 http 요청 방식을 통해 웹서비스와의 통신이 가능합니다. 가장 주로 사용되는 http 요청 방식 3가지인 restTemplate vs webClient vs openFeign에 대해 매우 간단하게 알아보겠습니다. 1. RestTemplate RestTemplate은 Spring에서 제공하는 동기식 http 통신을 위한 방법입니다. 주로 MVC기반의 프로그램에서 사용되며 JSON, XML등 다양한 형식의 데이터를 처리 할 수 있습니다. 장점 간단한 구성과 사용법 예전 버전의 Spring에서도 사용 가능 다양한 http 클라이언트 설정 가능 단점 동기 방식을 기반으로 하기에 병렬 처리가 어려움 non-blocking 요청 처리가 불가능 2. WebClient We..

백엔드 멘토링 2023.08.27

2023/04/10 - Spring 공부중 관련 질문들 [2]

생성자 생성자는 간단하게 얘기하면 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'이다. 따라서 인스턴스 변수의 초기화 작업에 사용되고, 인스턴스 생성 시에 실행되어야 할 작업을 위해서 사용된다. 생성자의 이름은 클래스의 이름과 같아야 한다. 생성자는 리턴 값이 없다. void 또한 사용하지 않는다. 생성자는 몇 가지 특징을 제외하면 메소드와 다르지 않다. 생성자는 메소드 처럼 클래스 내에 선언되고, 오버 로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 존재할 수 있다. JPA, JPA와 SQL mapper의 차이 JPA : (Java Persistence Api)의 약자로 자바 언어를 기반으로 한 ORM입니다. 이는 객체와 관계형 데이터베이스 간의 매핑을 처리해주며 개발자가 객체를 생성하고..

백엔드 멘토링 2023.04.13