분류 전체보기 41

계좌 잔액 업데이트 동시성 문제 해결 과정

이 글에서는 프로젝트를 진행하면서 겪은 동시성 문제와 이를 해결한 과정을 기록하고자 한다. 주식 투자 시뮬레이션 프로젝트를 진행하는 과정에서, 나는 특정 주식에 대한 매도와 매수 기능을 구현해야했다. @RequiredArgsConstructor@Servicepublic class TradeService { private final TradeTraceService traceService; private final MemberRepository memberRepository; private final AccountRepository accountRepository; private final StockService stockService; @Transactional public..

백엔드 멘토링 2024.09.03

객체지향적 Refactoring 과정의 기록

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

백엔드 멘토링 2024.07.11

10분 테코톡

2024-05-24 체인저의 API 명세서와 협업[10분 테코톡] 체인저의 API 명세서와 협업 (youtube.com) 프론트와 백엔드 개발자는 API 명세서와 여러가지 의사소통을 통해서 협업을 한다. API 명세서란?=> API의 기능, 동작, 사용법 등을 나타낸 문서 API 명세서 구성- 이름 및 설명 : API 이름과 설명- 기본 정보 : Host 주소, EndPoint, HTTP Method- Request : Header, Parameter, Body- Response : Header, Body 여기서 추가적으로 API 호출의 예시와 여러 응답의 예시가 추가된다면 더욱 좋음 " API 명세서만 보고도 사용할 수 있는가? " 를 기준으로 잡고 API 명세서를 작성하면 좋음  프론트와 백엔드 협업..

우테코 강의 2024.05.25

순환 참조를 해결해보기

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

백엔드 멘토링 2024.02.28

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

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

백엔드 멘토링 2024.02.22

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

Nomadic 클론 코딩 프로젝트를 진행하면서, 특정 게시물에 대해 좋아요를 누르는 기능이 요구되었다.이번 글은 좋아요 기능에 대한 성능을 어떻게 개선했는지에 대한 기록이다. 초기의 코드 (좋아요 기능이 아닌 일부 기능 제외)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); ..

백엔드 멘토링 2024.02.16

2023년 나의 회고록

2023년, 1년간의 나의 회고록 벌써 2023년이 다 지나고 2024년까지 이틀밖에 안남았다... 뭐했다고 24살인지....난 아무것도 안한거 같은데 시간이 내 성장을 기다려주지 않고 막 흘러버린다.. 그래도 이렇게 그저 흘러가는대로 흘러가버린다면 분명 난 진짜 성장하지 않는 사람이 되고 말 것 이다. 그래서! 내가 올해 무엇을 했고, 무엇을 얻었는지 천천히 한번 회고해보고자 한다! 1. 공부 올해 초 사실 내 목표는 학교에서 성적 장학금을 받아보는 것 이었다. 그래서 나름 학교 수업에도 열심히 집중하고 과제도 정성스레 제출하고 해보았지만.... ...??? 전공 A, A+ 맞고 교양 다 조지기..... 항상 느끼는 거지만.. 교양과목의 내용이 전공과목에 비해 쉽다 보니 매번 나는 교양 공부에 대해 안..

카테고리 없음 2023.12.29

@OneToMany, @ElementCollection

트리플 클론 코딩을 하면서 여행지 추천 기능을 구현해야했다. 이때, 추천받은 여행지에 대해 사용자는 좋아요(찜) 을 할 수 있어야 했으며, 자신에게 달린 리뷰들을 저장해야 했다, 따라서 추천받은 여행지는 자신을 좋아요를 누른 사용자들의 id값을 List형식으로 가지고 있어야 하고, 자신에게 달린 Review들을 List형식으로 가지고 있어야 했다. 엔티티에 List를 저장하기 위해서는 @OneToMany를 통해 연관관계 매핑을 하거나 @ElementCollection을 사용, @Convert의 사용 이 3가지를 들 수 있으며 @Convert는 List를 String 형식으로 변환하여 저장하는 기능이고, 이번에는 @Convert를 제외한 @OneToMany와 @ElementCollection의 장단점들을 ..

백엔드 멘토링 2023.12.01

단축 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

자바의 신 - 복습 정리(2)

- 자바의 동작 과정 자바 코드를 작성한다 -> .java 파일 Java Compiler(javac)가 .java파일을 .class파일로 컴파일 한다. .class 파일들이 JVM에 들어가 Class Loader가 클래스들을 JVM에 올린다. JVM에 있는 class 파일들이 Interpreter와 JIT Compiler에 의해 해석된다. 해석된 바이트 코드들을 Runtime Data Area로 옮겨져 실질적인 실행이 된다. - JIT Complier = java JVM에 있는 컴파일러로 자주 사용되는 메서드나 클래스를 캐시에 저장시켰다가 필요할 때 컴파일 해서 준다. - warm-up = 성능 확인 또는 향상을 위해 JIT 컴파일러의 캐시에 원하는 데이터가 캐싱되도록 유도하는 것을 말함 - 쓰레드? 프..

백엔드 멘토링 2023.09.23